Блок-схема — простая реализация алгоритма ортогональных соединений

внешний интерфейс алгоритм GitHub SVG

источник

Используйте svg, чтобы создать блок-схему, аналогичную подключению к Visio, как показано ниже.

На самом деле существует множество библиотек, в которых реализованы блок-схемы, например,jointjs,gojs,jsplumb и так далее. Жаль, что не бесплатно.

анализировать

Если вы хотите сделать это просто, просто используйте кривую Безье, Вам нужно только указать координаты двух точек начальной и конечной точек, и вы можете использовать простой алгоритм для создания пути SVG. Этот алгоритм нужно найти в сети.

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

Предполагая, что начальная точка находится внизу, а целевой узел находится в правом нижнем углу начального узла, возможны четыре ситуации. Учитывая, что существует четыре возможности ориентации целевого узла относительно начального узла, то имеется 4*4=16 возможностей для всех соединений, а учитывая, что из начальной точки также имеется четыре начальных направления, то все возможности 16 * 4 = 64 вида. То есть, если вы хотите написать if else, вам нужно написать 64 ветки.

Как сделать

Конечно, нет необходимости писать 64 if else, написание программ — это абстрагирование правил! Разделите это соединение на следующие части:

Так где же этот закон связи? В некоторых случаях он поворачивает за угол, а в других случаях делает еще два поворота.Такую схему найти очень сложно. На рисунке ниже показаны два примера.Конечная точка также находится в верхнем левом углу относительно начальной точки.Первый случай - повернуть на два оборота, а второй случай - повернуть на один оборот.

Однако я использовал восемнадцать коров и двух тигров, чтобы найти его закон.

правда

Окончательное направление этой связи связано со следующими условиями:

  1. Направление отправления от начальной точки
  2. Направление входа в конечную точку
  3. Направление конечной точки относительно начальной точки
  4. Минимальная выносная линия от начальной точки
  5. Минимальная выносная линия перед конечным входом (см. изображение ниже)

6. Время поворота ортогональной линии (когда я это делал, я использовал поворот по средней точке)

Реализовать идеи

  1. Потому что путь svg используется для рисования ортогональных линий. Суть в том, чтобы найти координаты точки поворота (на самом деле она такая же, как и все).
  2. Сначала получаем вектор из начальной точки в конечную точку (далее — прямой вектор) и два ортогональных вектора (далее — горизонтальный вектор и вертикальный вектор прямого вектора)
    3. Начните вычислять ортогональную линию, сначала получите начальное направление ортогональной линии. Видно, что направление начальной точки и вертикальный вектор прямого направления противоположны, и ортогональная линия не должна идти вниз, поэтому начальная точка ортогональной линии должна быть горизонтальной. На самом деле, мы не знаем конкретной ситуации вертикали и горизонтали.В реальной работе это так: сначала найти вектор, параллельный направлению начальной точки, из горизонтального вектора и вертикального вектора прямого вектора, а затем судить находится ли он в том же направлении.В том же направлении, начальное направление ортогональной линии совпадает с начальным направлением, если нет, то берется другое вертикальное направление.
判断平行: x0 * y1-x1 * y0 === 0;
判断是否同公式,向量夹角为0度,则向量点积为1:x0 * y0 + x1 * y1 === 1
  1. Затем вы хотите получить окончательную ориентацию ортогональных линий. Это также та же идея: если направление входа в конечную точку противоположно прямому направлению, возьмите вертикальное направление, а если оно такое же, возьмите то же направление.
  2. Начальное направление и конечное направление ортогональной линии получены, теперь необходимо получить положение среднего поворота ортогональной линии. Определите, совпадают ли начальное и конечное направления ортогональной линии. Если они совпадают, вам нужно повернуть два раза. Если они не совпадают, вам нужно повернуть только один раз. .

如果 正交线起始方向 == 正交线最终方向
那么 转弯数 = 2
否则 转弯数 = 1
  1. Если вы повернете поворот, получите координату точки поворота

转弯的坐标点 = 正交线的第一个点 + 正交线起始方向向量

Если вы повернете два поворота, сначала получите первую точку поворота, которая является серединой начального и конечного направлений ортогональной линии.

第一个转弯点= 正交线的第一个点 + 正交线起始方向向量 * 0.5

Потом получить второй поворотный момент,

非起始方向向量 = 从直接向量的水平向量和竖直向量 中取出与起始方向向量垂直的那个向量
第二个转弯点 = 第一个转弯点 + 非起始方向向量
  1. Наконец сгенерируйте набор координат для всех точек

所有点的坐标集合 = [起点,正交线的起点,...正交线的转弯点,正交线的终点,终点]

Суммировать

Объем вычислений этого алгоритма не очень велик, производительность в порядке, и он подходит для перерисовки во время перетаскивания. Но это не алгоритм поиска пути, что означает отсутствие функции обхода узлов.

Следующий шаг — сделать его с помощью алгоритма Манхэттена.

Возьмите эту демонстрацию, чтобы играть

Время для подоходного налога О. GitHub.IO/flow-con NEC…

Алгоритм генерации точекGitHub.com/DES идут…