Ограничивают прямоугольник в прямоугольник
я использую 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))