在矩形内约束矩形
Constrain Rectangle within Rectangle
我在程序中使用 Java 的 Rectangle
class。
我有两个 Rectangle
对象:
Rectangle big = new Rectangle(...);
Rectangle small = new Rectangle(...);
矩形的具体大小并不重要。但是,big
将始终大于 small
(在 宽度和高度中)。
通常,small
完全包含在 big
中。我可以使用 Rectangle#contains
来验证这一点。但是,如果不是这种情况,我想 将 small
完全包含在 big
中。两个矩形的尺寸都不应更改。
例如:
我知道 Math.max
和 Math.min
可以使用四个条件,但是有没有更优雅的方法呢?
你只需要 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())
);
虽然你必须考虑可读性。
您需要更强大的设计。如果您扩展 Rectangle
class,您可以添加您正在寻找的确切功能。显然 "big 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)
)
我在程序中使用 Java 的 Rectangle
class。
我有两个 Rectangle
对象:
Rectangle big = new Rectangle(...);
Rectangle small = new Rectangle(...);
矩形的具体大小并不重要。但是,big
将始终大于 small
(在 宽度和高度中)。
通常,small
完全包含在 big
中。我可以使用 Rectangle#contains
来验证这一点。但是,如果不是这种情况,我想 将 small
完全包含在 big
中。两个矩形的尺寸都不应更改。
例如:
我知道 Math.max
和 Math.min
可以使用四个条件,但是有没有更优雅的方法呢?
你只需要 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())
);
虽然你必须考虑可读性。
您需要更强大的设计。如果您扩展 Rectangle
class,您可以添加您正在寻找的确切功能。显然 "big 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)
)