在矩形内约束矩形

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.maxMath.min 可以使用四个条件,但是有没有更优雅的方法呢?

你只需要 Math.maxMath.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

您现在隐藏了(需要的)逻辑,保持代码的中央单元干净。这是我认为最优雅的处理方式。 (我也可能会创建一个接口 RectangleContainerShapeContainer,让 BigRectangle 实现它。该接口将包含一个方法 add(Rectangle)add(SmallShape))