2015-01-02 1 views
9

Я использую Java-класс Rectangle в программе.Ограничить прямоугольник в прямоугольнике

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

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

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

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

Например:

Rectangles Example

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

+0

Есть четыре условия, которые вы должны проверить, так что я не уверен, что вы можете уйти без «связки условностей» ... –

+0

Правда ... но я искал, возможно, элегантное однострочное выражение, возможно, используя класс «Прямоугольник». Может быть, это невозможно. – baum

+1

Тройное выражение было бы «немного» чище или короче. – issathink

ответ

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()) 
); 

Вам придется учитывать читаемость.

+0

hmm, вот чего я боялся. Я думал, что, возможно, я мог бы использовать инверсию пересечения ... может быть, нет. – baum

+0

Это более компактный, но не тот, который можно назвать «элегантным». –

+0

Да, я бы просто пошел со стандартной четверкой-ifs, так как это всегда используется для проверки границ, поэтому программист, который должен поддерживать его, должен быстро распознать его , – 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 

Вы сейчас скрывая (необходимую) логику, сохраняя чистую центральную единицу кода. Это мое мнение о самом элегантном способе справиться с этим. (Я хотел бы также, вероятно, создать интерфейс RectangleContainer или ShapeContainer, имея BigRectangle осуществить это. Интерфейс будет содержать метод add(Rectangle) или add(SmallShape))

 Смежные вопросы

  • Нет связанных вопросов^_^