【问题标题】:d3-force update radius of forceCollide after initializing graphd3-force 在初始化图后更新 forceCollide 的半径
【发布时间】:2016-08-19 15:47:19
【问题描述】:

这个问题是上一个题为“初始化图形后 D3-Force 更新参数”(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 对象并希望forceCollide 反映更改。但是,当我再次拨打forceCollide 时,它不起作用:

forceCollide.radius(function(d){
d.radius;})

对为什么会发生这种情况有任何想法吗?

【问题讨论】:

    标签: d3.js force-layout d3-force-directed


    【解决方案1】:

    这实际上不会更新半径。您只是重新设置用于确定半径的回调,与以前相比,它甚至没有改变。即使它确实发生了变化,这也不会触发您的更新,因为不会根据您更新的数据重新评估半径。

    更新链接力的距离回调时,力本身将被初始化。查看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());
    

    这将根据您更新的数据重新评估半径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2012-07-12
      • 2020-08-06
      • 2019-09-18
      相关资源
      最近更新 更多