источник
Используйте svg, чтобы создать блок-схему, аналогичную подключению к Visio, как показано ниже.
На самом деле существует множество библиотек, в которых реализованы блок-схемы, например,jointjs,gojs,jsplumb и так далее. Жаль, что не бесплатно.
анализировать
Если вы хотите сделать это просто, просто используйте кривую Безье, Вам нужно только указать координаты двух точек начальной и конечной точек, и вы можете использовать простой алгоритм для создания пути SVG. Этот алгоритм нужно найти в сети.
Но если вы хотите использовать ортогональные соединения для достижения этой цели, эта сложность поднялась на несколько ступеней. Давайте рассмотрим несколько случаев ортогональных соединений:
Предполагая, что начальная точка находится внизу, а целевой узел находится в правом нижнем углу начального узла, возможны четыре ситуации. Учитывая, что существует четыре возможности ориентации целевого узла относительно начального узла, то имеется 4*4=16 возможностей для всех соединений, а учитывая, что из начальной точки также имеется четыре начальных направления, то все возможности 16 * 4 = 64 вида. То есть, если вы хотите написать if else, вам нужно написать 64 ветки.
Как сделать
Конечно, нет необходимости писать 64 if else, написание программ — это абстрагирование правил! Разделите это соединение на следующие части:
Так где же этот закон связи? В некоторых случаях он поворачивает за угол, а в других случаях делает еще два поворота.Такую схему найти очень сложно. На рисунке ниже показаны два примера.Конечная точка также находится в верхнем левом углу относительно начальной точки.Первый случай - повернуть на два оборота, а второй случай - повернуть на один оборот.Однако я использовал восемнадцать коров и двух тигров, чтобы найти его закон.
правда
Окончательное направление этой связи связано со следующими условиями:
- Направление отправления от начальной точки
- Направление входа в конечную точку
- Направление конечной точки относительно начальной точки
- Минимальная выносная линия от начальной точки
- Минимальная выносная линия перед конечным входом (см. изображение ниже)
Реализовать идеи
- Потому что путь svg используется для рисования ортогональных линий. Суть в том, чтобы найти координаты точки поворота (на самом деле она такая же, как и все).
- Сначала получаем вектор из начальной точки в конечную точку (далее — прямой вектор) и два ортогональных вектора (далее — горизонтальный вектор и вертикальный вектор прямого вектора)3. Начните вычислять ортогональную линию, сначала получите начальное направление ортогональной линии. Видно, что направление начальной точки и вертикальный вектор прямого направления противоположны, и ортогональная линия не должна идти вниз, поэтому начальная точка ортогональной линии должна быть горизонтальной. На самом деле, мы не знаем конкретной ситуации вертикали и горизонтали.В реальной работе это так: сначала найти вектор, параллельный направлению начальной точки, из горизонтального вектора и вертикального вектора прямого вектора, а затем судить находится ли он в том же направлении.В том же направлении, начальное направление ортогональной линии совпадает с начальным направлением, если нет, то берется другое вертикальное направление.
判断平行: x0 * y1-x1 * y0 === 0;
判断是否同公式,向量夹角为0度,则向量点积为1:x0 * y0 + x1 * y1 === 1
- Затем вы хотите получить окончательную ориентацию ортогональных линий. Это также та же идея: если направление входа в конечную точку противоположно прямому направлению, возьмите вертикальное направление, а если оно такое же, возьмите то же направление.
- Начальное направление и конечное направление ортогональной линии получены, теперь необходимо получить положение среднего поворота ортогональной линии. Определите, совпадают ли начальное и конечное направления ортогональной линии. Если они совпадают, вам нужно повернуть два раза. Если они не совпадают, вам нужно повернуть только один раз. .
如果 正交线起始方向 == 正交线最终方向
那么 转弯数 = 2
否则 转弯数 = 1
- Если вы повернете поворот, получите координату точки поворота
转弯的坐标点 = 正交线的第一个点 + 正交线起始方向向量
Если вы повернете два поворота, сначала получите первую точку поворота, которая является серединой начального и конечного направлений ортогональной линии.
第一个转弯点= 正交线的第一个点 + 正交线起始方向向量 * 0.5
Потом получить второй поворотный момент,
非起始方向向量 = 从直接向量的水平向量和竖直向量 中取出与起始方向向量垂直的那个向量
第二个转弯点 = 第一个转弯点 + 非起始方向向量
- Наконец сгенерируйте набор координат для всех точек
所有点的坐标集合 = [起点,正交线的起点,...正交线的转弯点,正交线的终点,终点]
Суммировать
Объем вычислений этого алгоритма не очень велик, производительность в порядке, и он подходит для перерисовки во время перетаскивания. Но это не алгоритм поиска пути, что означает отсутствие функции обхода узлов.
Следующий шаг — сделать его с помощью алгоритма Манхэттена.
Возьмите эту демонстрацию, чтобы играть
Время для подоходного налога О. GitHub.IO/flow-con NEC…
Алгоритм генерации точекGitHub.com/DES идут…