我在程序中使用Java的Rectangle
类。
我有两个Rectangle
个对象:
Rectangle big = new Rectangle(...);
Rectangle small = new Rectangle(...);
矩形的具体尺寸并不重要。但是,big
将始终大于small
( 宽度和高度)。
通常,small
完全包含在big
中。我可以使用Rectangle#contains
来验证这一点。但是,如果不是这种情况,我希望移动 small
完全包含在big
中。两个矩形的尺寸都不应改变。
例如:
我知道可以使用Math.max
和Math.min
的四个条件,但有更优雅的方法吗?
答案 0 :(得分:2)
您只能使用Math.max
和Math.min
来执行此操作。尝试这样的事情:
small.setLocation(
Math.max(Math.min(small.getX(),big.getX() - small.getWidth()),big.getX()),
Math.max(Math.min(small.getY(),big.getY() - small.getHeight()),big.getY())
);
你必须考虑可读性。
答案 1 :(得分:2)
您需要更强大的设计。如果您扩展Rectangle
类,则可以添加您正在寻找的确切功能。显然,“大矩形”应该作为容器,包含较小的矩形:
class BigRectangle extends Rectangle {
//reference to or list of rectangle(s) here
private boolean isAlignedWith(Rectangle rect) {
return /* bounds logic */;
}
private void align(Rectangle rect) {
//move rectangle to proper position
}
public void add(Rectangle rect) {
if(!isAlignedWith(rect)) {
align(rect);
}
//store in reference or add to list
}
}
现在,您可以简单地将较小的矩形添加到较大的矩形中:
Rectangle smallRectangle = new Rectangle();
BigRectangle bigRectangle = new BigRectangle();
bigRectangle.add(smallRectangle); //automatically aligns if needed
您现在隐藏了(所需的)逻辑,保持您的中央代码单元清洁。这是我对处理这个问题的最优雅方式的看法。 (我也可能会创建一个接口RectangleContainer
或ShapeContainer
,BigRectangle
实现该接口。接口将包含方法add(Rectangle)
或add(SmallShape)
< / em>的)