我正在创建一个图形编辑器并制作我正在使用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);
}
}
答案 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