2014-09-29 5 views
1

Я пытаюсь изменить 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).

Однако это привело к ошибке во время выполнения, которую я не мог решить.

Любые идеи о том, как это поведение графика может быть достигнуто?

ответ

2

Похоже, вы хотите использовать параметры fixed, установив его как свойство каждого узла узла, например { id:123, fixed:true }.

Here's a modified version

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

+0

Спасибо, это простое дополнение! Я попытался изучить более макеты (https://github.com/mbostock/d3/wiki/Layouts), но ни один из них не соответствует моим потребностям (макет нефизического графа). Есть ли у вас рекомендация по выбору макета для этой потребности? – Gabis

+0

@ user1147537 компоновка сил повторно вычисляет позиции узла 60 раз в секунду, а затем ваш код перемещает их в эти позиции 60 раз в секунду. Поскольку все узлы фиксированы, нет необходимости в этом макете и часто повторяющихся перерисовываниях. На самом деле, здесь вам не нужен ЛЮБОЙ макет. Вы можете просто удалить любое упоминание «силы» из кода. Но каждый раз, когда добавляется узел/ссылка, вам нужно будет вызвать функцию tick(). Кроме того, force.drag необходимо заменить на d3.behavior.drag(). – meetamit

+0

Большое спасибо за подробное объяснение! Я изменю свой код на ваше предложение. – Gabis

Смежные вопросы