Java 在矩形内约束矩形

Java 在矩形内约束矩形,java,rectangles,Java,Rectangles,我正在程序中使用Java的Rectangle类 我有两个矩形对象: Rectangle big = new Rectangle(...); Rectangle small = new Rectangle(...); 矩形的具体尺寸并不重要。但是,big始终大于small(宽度和高度) 通常,small完全包含在big中。我可以使用Rectangle#contains来验证这一点。然而,如果情况并非如此,我希望移动small以完全包含在big中。两个矩形的尺寸都不应更改 例如: 我知道可以在M

我正在程序中使用Java的
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())
);

<>你必须考虑可读性。

你需要更强的设计。如果扩展
矩形
类,则可以添加所需的确切功能。显然,“大矩形”应该充当容器,包含较小的矩形:

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)

您必须检查四个条件,所以我不确定没有“一堆条件”你能逃脱…真的。。。但是我在寻找一个优雅的单行表达式,可能使用
Rectangle
类。也许这是不可能的。三元表达式应该“稍微”更简洁或更短。你必须检查边界。即使
Rectangle
有一个方法为您处理这个问题,它也会检查引擎盖下的边界。您可以随时扩展
矩形
,以添加功能;创建自己的私有
isWithinBounds
align
方法,然后使用public
addSquare
placeSquare
方法检查矩形是否在边界内,如果没有,则对齐,这就是我担心的。我想也许我可以使用交叉点的反转。。。也许不是。它更紧凑,但不是人们所说的“优雅”是的,我个人只会使用标准的四重ifs,因为它总是用于边界检查,所以需要维护它的程序员应该很快识别它。