Применять силу к входным узлам только в d3.js

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

nnodes = vis.selectAll(".node")
  .data(updatedData.nodes)
nlinks = vis.selectAll(".link")
  .data(updatedData.links)

// apply graphics to entering nodes and links

force
  .nodes(nnodes.enter())
  .links(nlinks.enter())
  .start()
force.on("tick", tick)

где tick правильно устанавливает позиции узлов и ссылок при применении к полному графу или когда пользователь перетаскивает узлы.

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

Могу ли я каким-то образом применить алгоритм силы только к входным узлам?


person notan3xit    schedule 16.06.2013    source источник


Ответы (1)


Компоновка Force вычисляет позиции узлов, принимая во внимание все узлы и ссылки. Вы не можете применить его только к частям графика. Итак, что вам нужно сделать, это изменить узлы и связи для существующего силового макета, а не добавлять только новые. Чтобы узлы, которые уже есть, оставались там, где они есть, попробуйте установить для них свойство fixed.

Ваш код будет выглядеть примерно так:

nodes.forEach(function(n) { n.fixed = true; });

// update graphics

newNodes.forEach(function(n) { nodes.push(n); });
// add new links similarly

force.start();
person Lars Kotthoff    schedule 16.06.2013
comment
Это делает мой план сложнее, чем я думал. Правильно ли я понимаю, что методы nodes и links при форсировании в основном просто сообщают d3, в какой переменной хранятся узлы/ссылки, и не обязательно, на какие узлы должно воздействовать форсирование? В какой-то степени это имеет смысл, я думаю, поскольку другие узлы, вероятно, должны проявлять свою силу, как обычно, просто не двигаться, то есть быть fixed. - person notan3xit; 16.06.2013
comment
Нет, nodes и links сообщают D3, на что должна воздействовать силовая раскладка. Это не то же самое, что отрисовываемые узлы/ссылки - об этом заботятся отдельно. - person Lars Kotthoff; 16.06.2013