Я ищу алгоритм или библиотеку для рисования линий связи между равноудаленными прямоугольниками. Мне нужно реализовать такую возможность в редакторе, написанном на javascript. Все прямоугольники могут перетаскиваться, и алгоритм должен быть максимально эффективным.
Конечный результат реализации можно увидеть в некоторых редакторах, таких как Keynote или PowerPoint.
Важно: алгоритм должен вычислять точки, в которых прямоугольник будет равноудален относительно ближайших братьев и сестер. Таким образом, при перетаскивании близко к равноудаленной точке можно будет примагнитить край прямоугольника к этой точке.
Я попробовал реализовать следующий алгоритм:
- Поиск всех прямоугольников по осям X и Y относительно перетаскиваемого (выделенного) прямоугольника
- Разделить найденные множества на подмножества: "top", "bottom", "left", "right" и найти ближайший прямоугольник к выбранному прямоугольнику в каждом подмножестве
- вычислить расстояния (D) между перетаскиваемым и ближайшим прямоугольником
- Повторить процедуру, начиная с шага 1, для прямоугольников, найденных на шаге 2. Но вместо поиска ближайшего, искать прямоугольник на расстоянии D
- Повторять шаг 4 рекурсивно, пока прямоугольники на расстоянии D не будут найдены
Я не могу вычислить точки равноудаленности для фичи примагничивания при перетаскивания прямоугольника. Также меня беспокоит производительность, так как все вычисления и сортировки должны выполняться по событию "ondrag" (многократно в секунду).
Есть ли способ оптимизировать мой алгоритм?