Ограничивают прямоугольник в прямоугольник

я использую Java Rectangle класса в программе.

у меня есть два Rectangle объекты:

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

конкретные размеры прямоугольников не важно. Однако,big всегда будет больше, чем small (in и ширина и высота).

как правило, small полностью содержится в big. Я могу использовать Rectangle#contains чтобы проверить это. Однако, когда это не так, я хотел бы движение small будет полностью содержится в big. Размеры ни одного прямоугольника не должны меняться.

например:

Rectangles Example

я знаю, что мог бы использовать четыре условных с Math.max и Math.min, но есть ли более элегантный способ сделать это?

2 ответов


вы могли бы сделать это только с 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 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))