Ограничивают прямоугольник в прямоугольник
я использую Java Rectangle
класса в программе.
у меня есть два Rectangle
объекты:
Rectangle big = new Rectangle(...);
Rectangle small = new Rectangle(...);
конкретные размеры прямоугольников не важно. Однако,big
всегда будет больше, чем small
(in и ширина и высота).
как правило, small
полностью содержится в big
. Я могу использовать Rectangle#contains
чтобы проверить это. Однако, когда это не так, я хотел бы движение small
будет полностью содержится в big
. Размеры ни одного прямоугольника не должны меняться.
например:
я знаю, что мог бы использовать четыре условных с 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)
)