2014-10-29 60 views
5

我有一个d3力布局图,即非常好地工作,但它往往过早地“卡住”。例如,节点向一个很好的位置摆动,如果'碰撞'(注入一些随机性到他们的位置并再次,他们终于到达那里)。如果我减少friction,问题也变得更糟,因为用户认为它是修改d3的力布局“annealling”时间表

我在force.js source code中看到'annealling'(ala模拟退火)的提及,并且暴露的alpha参数是一个关键因素,我想知道是否有人想出如何直接管理通用退火时间表(没有修补force.js!)?

+0

不知道我是否理解你的问题。修改任何未公开的内容将需要更改源代码。 – 2014-10-29 19:01:21

+0

如果某个图形太大或太多以至于不能一次性布置,我可能会尝试随着时间的推移添加节点,并在每次添加时重新开始布局。它更好,如果有一个逻辑像节点的时间或类型组件。 – Andrew 2014-10-29 20:24:54

+0

@Lars,对不起,我不清楚。 'alpha'似乎是唯一暴露的参数,但我只能用它做很多事情。我问是否有办法以d3-ic的方式完成更一般的冷却时间表,还是我需要做一个本地补丁? @Andrew,我希望这是一个由用户修改的图形viz工具,通过一个固定的图形。 – rikb 2014-10-29 20:43:02

回答

0

答案的核心是@ meetamit的评论(加速alpha的衰变)。你可以当它低于阈值时也停止调用布局,并且您还可以通过向节点/链接移动添加转换来处理“抖动”。

animationStep = 200; 
force.on('tick', function() { 
    node.transition().ease('linear').duration(animationStep) 
     .attr('transform', function(d) { 
      //your node transitions here 
     }); 
    var alpha = force.alpha(); 
    force.stop(); 
    setTimeout(function() { 
     if (!alpha > 0.001) { 
     force.alpha(alpha * 0.9); 
     } 
    }, animationStep); 
    }; 
    force.on('tick', tick); 
+0

我认为OP正在寻找一种方法来实现_decelerate_,但无论如何,管理alpha的最简单方法是将'force.alpha(force.alpha( )/0.99*myDecay)'在'tick'回调结束时。这将颠倒布局应用的衰减(0.99),并用您自己的几何衰减速率替换它。 – 2015-09-10 19:45:39

+0

啊 - 谢谢,我读错了。 – 2015-09-10 23:36:03