将矩形限制在另一个矩形内部

10

我在程序中使用Java的Rectangle类。

我有两个Rectangle对象:

Rectangle big = new Rectangle(...);
Rectangle small = new Rectangle(...);

矩形的具体大小并不重要。但是,big(无论是宽度还是高度)始终大于small

通常,small完全包含在big中。我可以使用Rectangle#contains来验证这一点。然而,当情况不是这样时,我想把small移动到big内部。两个矩形的尺寸都不应该改变。

例如:

Rectangles Example

我知道可以使用Math.maxMath.min进行四次条件判断,但是否有更加优雅的方法呢?


有四个条件需要检查,所以我不确定你能否避免使用“一堆条件语句”... - Oliver Charlesworth
真的...但我在寻找一种优雅的单行表达式,也许使用 Rectangle 类。也许这是不可能的。 - baum
1
三元表达式可能会更加简洁或短小。 - issathink
1
你必须检查边界。即使 Rectangle 有一个可以为您处理此操作的方法,它也会在幕后检查边界。您始终可以扩展 Rectangle 来添加功能;创建自己的私有 isWithinBoundsalign 方法,然后有一个公共的 addSquareplaceSquare 方法,该方法检查矩形是否在边界内,如果不在,则对齐。 - Dioxin
2个回答

2
你可以只使用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())
);

不过,你需要考虑可读性。


嗯,这正是我担心的。我原以为可以使用交集的倒置……也许不行。 - baum
它更紧凑,但并不被称为“优雅”。 - Dioxin
是的,我个人会选择标准的四重if语句,因为这通常用于边界检查,所以需要维护它的程序员应该很快就能识别它。 - Ghostkeeper

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

现在,您正在隐藏(所需的)逻辑,使您的核心代码单元保持清晰。这是我认为最优雅的处理方式。(我可能还会创建一个接口RectangleContainerShapeContainer,让BigRectangle实现它。该接口将包含一个方法add(Rectangle)add(SmallShape)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接