我正在尝试将节点逐个添加到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
答案 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();