d3-force 在初始化图形后更新 forceCollide 的半径
d3-force update radius of forceCollide after initializing graph
这个问题是 follow-up 上一个标题为 "D3-Force updating parameters after initializing graph" () 的问题,@altocumulus 回答了。
我想在修改一些节点的半径后更新模拟力。但是,当我调用 forceCollide
解释更改时它不起作用。
图形首先正确启动,使用 forceCollide
和一个使力与半径相对应的函数:
var forceCollide = d3.forceCollide()
.radius(function(d){return d.radius;})
.iterations(2)
.strength(0.95);
var simulation = d3.forceSimulation()
.velocityDecay(velocityDecay)
.force("collide", forceCollide);
然后我修改 d.radius
object 并希望 forceCollide
反映更改。但是,当我再次调用 forceCollide
时它不起作用:
forceCollide.radius(function(d){
d.radius;})
有没有想过为什么会这样?
这实际上不会更新半径。您只是重新设置用于确定半径的回调,它与之前相比甚至没有变化。即使它确实发生了变化,这也不会触发您的更新,因为不会根据您更新的数据重新评估半径。
更新link力的距离回调时,力本身将被初始化。查看 source 显示对 initializeDistance()
:
的调用
force.distance = function(_) {
return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance;
};
其他部队参数的许多其他更新也是如此。
然而,查看 collide 力的来源,我们注意到没有调用初始化:
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), force) : radius;
};
由于您的回调没有改变,因此您不需要再次调用 forceCollide.radius()
。相反,您需要致电
forceCollide.initialize(simulation.nodes());
这将根据您更新的数据重新评估半径。
这个问题是 follow-up 上一个标题为 "D3-Force updating parameters after initializing graph" (
我想在修改一些节点的半径后更新模拟力。但是,当我调用 forceCollide
解释更改时它不起作用。
图形首先正确启动,使用 forceCollide
和一个使力与半径相对应的函数:
var forceCollide = d3.forceCollide()
.radius(function(d){return d.radius;})
.iterations(2)
.strength(0.95);
var simulation = d3.forceSimulation()
.velocityDecay(velocityDecay)
.force("collide", forceCollide);
然后我修改 d.radius
object 并希望 forceCollide
反映更改。但是,当我再次调用 forceCollide
时它不起作用:
forceCollide.radius(function(d){
d.radius;})
有没有想过为什么会这样?
这实际上不会更新半径。您只是重新设置用于确定半径的回调,它与之前相比甚至没有变化。即使它确实发生了变化,这也不会触发您的更新,因为不会根据您更新的数据重新评估半径。
更新link力的距离回调时,力本身将被初始化。查看 source 显示对 initializeDistance()
:
force.distance = function(_) {
return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance;
};
其他部队参数的许多其他更新也是如此。
然而,查看 collide 力的来源,我们注意到没有调用初始化:
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), force) : radius;
};
由于您的回调没有改变,因此您不需要再次调用 forceCollide.radius()
。相反,您需要致电
forceCollide.initialize(simulation.nodes());
这将根据您更新的数据重新评估半径。