d3 v4强制作用于动态添加的节点

时间:2016-10-04 02:35:16

标签: d3.js

我正在尝试将节点逐个添加到d3力模拟中(在版本4中!)但是有些模型在创建后似乎没有被模拟演化。

当前模拟分配一个节点,然后是一个函数,addNode被调用两次,再添加两个节点。每个都添加到模拟中,有一个圆圈和一条线渲染,并逐个添加了一个光标事件。

(从技术上讲,第一个和第二个节点是同时完成的,因为第一个节点只在第二个节点调用addNode时设置)

然后,当单击一个节点时,应创建一个连接到光标下的节点的新节点。然后,该节点应该在模拟的力量下发展,就像任何其他节点一样。

然而,虽然似乎创建了一个或两个节点,但后来的节点似乎并未在模拟下发展。特别是应该在节点之间保留一些空间的多体力似乎不起作用。

我的直觉是节点是在不合时宜的时间为模拟的滴答函数添加的(通过在添加新节点时添加一些simulation.stop和simulation.restart命令来解决早期问题)但理论上模拟每当添加新的身体时都应该暂停。

这是在d3 v4中动态添加节点的正确实现,还是仅强调突出显示方法的问题? This之前的回答帮助我意识到我需要合并新条目,但力量似乎在那里工作正常。

.link {
  stroke: #bbb;
}
.node circle {
  pointer-events: all;
  fill: black;
  stroke-width: 0px;
  r: 20px
}
h1 {
  color: white;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
.Text

代码也在codepen上: http://codepen.io/zpenoyre/pen/kkxBRW?editors=0010

1 个答案:

答案 0 :(得分:4)

顾名思义,力模拟是对粒子相互作用的模拟。 Alpha用于通过在每次迭代时衰减来帮助收敛系统。力被乘以α,因此在每次迭代时力都会变弱,直到模拟停止时alpha达到非常低的值。从d3文档:

  

simulation.restart()&lt;&gt;

     

重新启动模拟的内部计时器并返回模拟。   结合simulation.alphaTarget或simulation.alpha,这个   方法可用于在交互期间“重新加热”模拟,例如   当拖动节点时,或暂时恢复模拟   将它与simulation.stop暂停。

添加节点时,模拟已停止,因此,您需要使用alpha 1“重新加热”模拟。

  simulation.force("link")
    .links(links);

  simulation.alpha(1); // <---- reheat;

  restartSim();

这是更新的代码笔: http://codepen.io/anon/pen/amqrWq?editors=0010