在Rectangle中约束Rectangle

时间:2015-01-02 00:17:22

标签: java rectangles

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

我有两个Rectangle个对象:

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

矩形的具体尺寸并不重要。但是,big将始终大于small 宽度和高度)。

通常,small完全包含在big中。我可以使用Rectangle#contains来验证这一点。但是,如果不是这种情况,我希望移动 small完全包含在big中。两个矩形的尺寸都不应改变。

例如:

Rectangles Example

我知道可以使用Math.maxMath.min的四个条件,但有更优雅的方法吗?

2 个答案:

答案 0 :(得分: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())
);

你必须考虑可读性。

答案 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

您现在隐藏了(所需的)逻辑,保持您的中央代码单元清洁。这是我对处理这个问题的最优雅方式的看法。 (我也可能会创建一个接口RectangleContainerShapeContainerBigRectangle实现该接口。接口将包含方法add(Rectangle)add(SmallShape) < / em>的)