初始化图形后,d3-force更新forceCollide的半径

时间:2016-08-19 15:47:20

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

这个问题是对前一个标题为“初始化图形后的D3-Force更新参数”(D3-Force updating parameters after initializing graph)和@altocumulus回答的后续问题的跟进。

我试图在修改某些节点的半径后更新模拟力。但是,当我呼吁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;}) 时,它不起作用:

$(document).ready(function() {
  var array = $(".chip")
        .clone()    //clone the element
        .children() //select all the children
        .remove()   //remove all the children
        .end()  //again go back to selected element
        .text();    ;
  alert(array);

});

有关为何发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:5)

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

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

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