Рисование линии, соединяющей два прямоугольника - PullRequest
3 голосов
/ 10 января 2011

Я делаю свое собственное приложение для диаграммы классов в Swing / AWT, но я остановился на этой функциональности:

  • Я хочу нарисовать линию между прямоугольником класса, который уже выбран, и целевым прямоугольником класса, но у линии есть особенность, которая заключается в том, что всякий раз, когда я перемещаю один из прямоугольников, линия, соединяющая их, изгибается прямым образом после движущегося прямоугольника, я надеюсь, что следующая картина демонстрирует то, чего я хочу достичь: alt text

Высоко ценится общее руководство или пример кода

Ответы [ 4 ]

4 голосов
/ 10 января 2011

Я не знаю Java, но вы можете выполнить следующие шаги:

  • Найдите середину каждой линии прямоугольников (должно быть просто, просто средните x1 + x2 и y1 + y2)
  • Определите края, которые находятся ближе всего друг к другу, с помощью формулы Пифагора по точкам, полученным на предыдущем шаге.
  • Начните рисовать линию, начинающуюся с xa, ya (первая точка, которую вы получили на шаге выше), и начертите ее в направлении от прямоугольника. Вы должны знать это направление, потому что вы можете знать отрезок, на котором находится эта точка
  • Сделайте то же самое для xb, yb (точка на втором прямоугольнике). Если линии идут в противоположных направлениях, вы должны нарисовать их на полпути xa-xb или ya-yb (в зависимости от того, рисуете ли вы горизонтально или вертикально). Если они перпендикулярны (это правильное слово?), Вы должны нарисовать их до точки, где они пересекаются, поэтому вы проводите линию от xa, ya до xa, yb или xa, ya до xb, ya, в зависимости от того, если вы рисуете горизонтальная или вертикальная линия.
  • Должна быть некоторая дополнительная проверка, чтобы видеть, перекрываются ли прямоугольники. Вы не должны рисовать линии в том же направлении, например. Возможно, вам будет достаточно нарисовать диагональную линию между двумя точками в тех случаях, когда вы не можете определить, как нарисовать эти прямые линии.

Для реализации вы можете построить класс линии, который использует шаблон наблюдателя для прослушивания двух следующих прямоугольников, поэтому он может обновлять себя всякий раз, когда один из них перемещается или изменяет размеры.

3 голосов
/ 11 января 2011

http://java -sl.com / connector.html Надеюсь, это поможет.

1 голос
/ 10 января 2011

Попробуйте с наблюдателем паттерном.Все линии, которые связаны с движущимся объектом, должны быть уведомлены о новой позиции объекта и правильно согнуты.Конечно, сначала реализуйте некоторую логику, которая соединит 2 объекта.

0 голосов
/ 10 января 2011

попробуйте создать класс с именем «ConnectingLine» или аналогичный. затем этот класс будет иметь несколько сегментов (это название этих частей линии в dia, что в настоящее время равно мой любимый инструмент моделирования uml), которые будут вычисляться по одному. у вас, конечно, для этого будет отдельный класс;) он может быть назван "LineSegment". я думаю, это должно упростить вам выполнение математических вычислений, необходимых для выполнения этой задачи.

это также может позволить сделать сегменты "автоматически маршрутизируемыми или нет", легкими d (^_^) b

...