2013-11-19 2 views
0

Я создаю графический редактор и создаю формы hierachies Я использую Composite Pattern, вопрос в том, как изменить размер дочерних элементов структуры Composite?Изменение размера композиции (шаблон дизайна) Форма

У меня есть следующий код, где tempGroup представляет собой составной объект, который группирует объекты для изменения размера, «инструмент изменения размера» изменяет размер фигуры из углов ограничивающей рамки.

  Point p = e.getPoint(); 
      BoundBox r = tempGroup.getBoundBox(); 
      int dx = p.x - r.x; 
      int dy = p.y - r.y; 
      int width = 0; 
      int height = 0; 

      if (controlPoint.equals("NW")) { 
       width = r.width - dx; 
       height = r.height - dy; 

       tempGroup.setRectBoundBox(new Rectangle(r.x + dx, r.y + dy, width, height)); 
      } else if (controlPoint.equals("NE")) { 
       width = dx; 
       height = r.height - dy; 
       tempGroup.setRectBoundBox(new Rectangle(r.x, r.y + dy, width, height)); 
      } else if (controlPoint.equals("SW")) { 
       width = r.width - dx; 
       height = dy; 
       tempGroup.setRectBoundBox(new Rectangle(r.x + dx, r.y, width, height)); 
      } else if (controlPoint.equals("SE")) { 
       width = dx; 
       height = dy; 
       tempGroup.setRectBoundBox(new Rectangle(r.x, r.y, width, height)); 
      } 

метод setRectBoundBox суперкласса использует Rectangle.setRect, чтобы установить новый BoundingBox и в композитной классе я пытался настроить пропорционально пути дети изменяют свои размеры, но это не похоже на работу, любую идею правильно реализовать setRectBoundBox в классе Composite ?.

Это супер метод класса:

public void setRectBoundBox(Rectangle r){ 
    bbox.setRect(r); 
} 

И это то, что я пытался до сих пор реализовать ребенок размер:

public void setRectBoundBox(Rectangle r) { 

    Rectangle prev = (Rectangle) bbox.clone(); 

    super.setRectBoundBox(r); 

    Rectangle aft = (Rectangle) bbox.clone(); 

    for (ShapeIf sh : children) { 
     Rectangle chBBox = sh.getBoundBox(); 
     Rectangle t = new Rectangle(chBBox.x * aft.x/prev.x, chBBox.y 
       * aft.y/prev.y, chBBox.width * aft.width/prev.width, 
       chBBox.height * aft.height/prev.height); 

     sh.setRectBoundBox(t); 
    } 

} 

ответ

0

Похоже, что сама формула имеет проблемы.

Вы вычисляете координату X на oldChild.x * newParent.x/oldParent.x, что кажется неправильным.

вместо того, формула должна быть

(oldChild.x - oldParent.x)/(newChild.x - newParent.x) 
    = oldParent.width/newParent.width 

(старое и новое смещение х ребенка от родителя х, должно быть пропорционально изменению ширины)

что означает

newChild.x = newParent.width* (oldChild.x - oldParent.x)/oldParent.width 
      + newParent.x 
1

Я рассматриваю, что вы хотите, чтобы дизайн на место ваша логика, поэтому в этом случае вы можете попробовать использовать декораторы и композиты вместе. Они будут иметь общий класс родителя, то есть Decorator будет поддерживать интерфейс Component для добавления, удаления, переопределения. А для фигур Вы можете использовать Composite.

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