调整复合(设计图案)形状的大小

时间:2013-11-19 05:11:31

标签: java design-patterns graphics shapes composite

我正在创建一个图形编辑器并制作我正在使用Composite Pattern的形状层次,问题是如何调整复合结构的子项的大小?

我有以下代码,其中tempGroup是复合对象,它将一组对象分组以调整大小,“调整大小工具”从边界框的角调整大小。

            Point p = e.getPoint();
            BoundBox r = tempGroup.getBoundBox();
            int dx = p.x - r.x;
            int dy = p.y - r.y;
            int width = 0;
            int height = 0;

            if (controlPoint.equals("NW")) {
                width = r.width - dx;
                height = r.height - dy;

                tempGroup.setRectBoundBox(new Rectangle(r.x + dx, r.y + dy, width, height));
            } else if (controlPoint.equals("NE")) {
                width = dx;
                height = r.height - dy;
                tempGroup.setRectBoundBox(new Rectangle(r.x, r.y + dy, width, height));
            } else if (controlPoint.equals("SW")) {
                width = r.width - dx;
                height = dy;
                tempGroup.setRectBoundBox(new Rectangle(r.x + dx, r.y, width, height));
            } else if (controlPoint.equals("SE")) {
                width = dx;
                height = dy;
                tempGroup.setRectBoundBox(new Rectangle(r.x, r.y, width, height));
            }
超类中的setRectBoundBox方法使用Rectangle.setRect来设置新的BoundingBox,而在Composite类中,我试图按比例调整子项的大小调整方式,但它似乎不起作用,任何想法都能正确实现Composite类中的setRectBoundBox?。

这是超类方法:

public void setRectBoundBox(Rectangle r){
    bbox.setRect(r);
}

这是我迄今为止尝试实施儿童调整大小的原因:

public void setRectBoundBox(Rectangle r) {

    Rectangle prev = (Rectangle) bbox.clone();

    super.setRectBoundBox(r);

    Rectangle aft = (Rectangle) bbox.clone();

    for (ShapeIf sh : children) {
        Rectangle chBBox = sh.getBoundBox();
        Rectangle t = new Rectangle(chBBox.x * aft.x / prev.x, chBBox.y
                * aft.y / prev.y, chBBox.width * aft.width / prev.width,
                chBBox.height * aft.height / prev.height);

        sh.setRectBoundBox(t);
    }

}

2 个答案:

答案 0 :(得分:1)

我正在考虑你想要设计放置你的逻辑,所以在这种情况下你可以尝试使用装饰器和复合材料,它们将有共同的父类,即装饰器将支持组件接口添加,删除,重新调整大小。对于形状你可以使用Composite。

答案 1 :(得分:0)

看起来配方本身存在问题。

您按oldChild.x * newParent.x/oldParent.x计算X坐标,这似乎不正确。

相反,公式应为

(oldChild.x - oldParent.x)/(newChild.x - newParent.x) 
     = oldParent.width/newParent.width

(来自父x的孩子的x的新旧位移,应该与宽度的变化成比例)

表示

newChild.x = newParent.width* (oldChild.x - oldParent.x) / oldParent.width
             + newParent.x