Я пытаюсь изменить directed graph editor следующим образом:d3 сила, направленная макет - рисунок ссылки без изменения расположения узлов
Когда ссылка нарисован, он не будет Переставьте исходный и целевой узлы. Вместо этого будет проведена ссылка между текущим местоположением узлов.
При перетаскивании существующего узла (с помощью ctrl) он не будет влиять на положение прикрепленных к нему присоединенных узлов. Вместо этого все остальные узлы останутся в своем положении, и только ссылки, прикрепленные к перетаскиваемому узлу, изменят свою длину в соответствии с перетаскиванием.
Я пытался поставлять эту функцию linkDistance Форса:
force.linkDistance(function(link) {
var deltaX = d.target.x - d.source.x,
deltaY = d.target.y - d.source.y,
dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
return dist;
})
Думая, что это привело бы силы, чтобы предположить, что нет необходимости повторно позиционирование узлов на каждой стороне линии (после documentation).
Однако это привело к ошибке во время выполнения, которую я не мог решить.
Любые идеи о том, как это поведение графика может быть достигнуто?
Спасибо, это простое дополнение! Я попытался изучить более макеты (https://github.com/mbostock/d3/wiki/Layouts), но ни один из них не соответствует моим потребностям (макет нефизического графа). Есть ли у вас рекомендация по выбору макета для этой потребности? – Gabis
@ user1147537 компоновка сил повторно вычисляет позиции узла 60 раз в секунду, а затем ваш код перемещает их в эти позиции 60 раз в секунду. Поскольку все узлы фиксированы, нет необходимости в этом макете и часто повторяющихся перерисовываниях. На самом деле, здесь вам не нужен ЛЮБОЙ макет. Вы можете просто удалить любое упоминание «силы» из кода. Но каждый раз, когда добавляется узел/ссылка, вам нужно будет вызвать функцию tick(). Кроме того, force.drag необходимо заменить на d3.behavior.drag(). – meetamit
Большое спасибо за подробное объяснение! Я изменю свой код на ваше предложение. – Gabis