我正在按照这个 d3 force layout 的例子进行操作。
我想控制点飞向聚类的速度。换句话说,我希望有些点需要更长时间才能到达它们的最终位置,而有些点则需要更短的时间。
我尝试添加一个定时器函数来控制每个 tick 的时间,但它没有起作用。
this.force = d3.layout.force()
.on("tick", setTimeout(tick(d), 50));
我需要对此进行帮助。
我正在按照这个 d3 force layout 的例子进行操作。
我想控制点飞向聚类的速度。换句话说,我希望有些点需要更长时间才能到达它们的最终位置,而有些点则需要更短的时间。
我尝试添加一个定时器函数来控制每个 tick 的时间,但它没有起作用。
this.force = d3.layout.force()
.on("tick", setTimeout(tick(d), 50));
我需要对此进行帮助。
tick
函数,这是由力布局自动完成的。.friction()
对应于速度衰减的快慢,因此直接控制节点移动的速度。默认值为0.9,如果要使所有内容变慢,请将其设置为较低的值。.charge()
控制节点之间吸引/排斥的强度。这不直接控制速度,但会影响它。在力导向布局中还有一些其他参数,但我认为在您的特定情况下不会有用(我想到了.linkStrength()
和.linkDistance()
),但您仍然可以查看一下。
我想到了一种可能的解决方法。我可以手动为每个节点调用tick函数,比如100次,并记录路径。然后我使用定时器函数根据路径重新绘制节点。这样,我就可以控制每个节点的绘制时间。这样做有意义吗?
更改 setInterval
函数,调整时间间隔。
尝试以下代码:
setInterval(function(){
nodes.push({id: ~~(Math.random() * foci.length)});
force.start();
node = node.data(nodes);
node.enter().append("circle")
.attr("class", "node")
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", 8)
.style("fill", function(d) { return fill(d.id); })
.style("stroke", function(d) { return d3.rgb(fill(d.id)).darker(2); })
.call(force.drag);
}, 50); //change the intervel time