什么是传递给d3.js强制回调函数的`e`参数?

时间:2014-10-09 15:00:05

标签: d3.js force-layout

下面的

是滴答功能的正常示例:

function tick(e) {
     nodes
      .each(cluster(10 * e.alpha * e.alpha));
}

谁能告诉我" e"?的定义?它有什么属性? 我无法找到" e"的任何描述,以及e.alpha的含义。是的,我使用谷歌但没有结果。


感谢您在下面提供的帮助。

我正在复制一些使用

的代码
var force = d3.layout.force()
        .nodes(nodes)
        .size([width, height])
        .charge(-70)
        .gravity(0.1)
        .on("tick", tick)
        .start();

所以这就是你猜的情况。我是d3的新手,一个强力脱脂。布局API并没有给我任何线索。谢谢你宝贵的时间!

1 个答案:

答案 0 :(得分:14)

如果没有“普通”功能的完整上下文,这是一个猜测,但这里有:

tick在d3中的许多上下文中使用。 alpha的隐含表明这是一个force layout tick function,它由tick事件上的force layout对象调用,在这种情况下e将是tick事件对象。

关于tick事件没有很多文档,因为大多数示例都不使用它。如果您检查source code,您会看到

// A rudimentary force layout using Gauss-Seidel.
d3.layout.force = function() {                       //line 11
    var force = {},
        event = d3.dispatch("start", "tick", "end"); 
    /* ... */
    force.tick = function() {                        //line 58
        // simulated annealing, basically
        if ((alpha *= .99) < .005) {
          event.end({type: "end", alpha: alpha = 0});
          return true;
        }
        /* code to implement default force layout adjustments */
        event.tick({type: "tick", alpha: alpha});   //line 128
    };
    /* ... */
    return d3.rebind(force, event, "on");           //line 305
};

换句话说,tick事件是使用d3.dispatch进程在d3源代码中创建的三种类型的自定义事件之一。特别是tick事件在内部tick函数结束时调度,并且只包含一个自定义属性:force布局中的当前alpha参数。为了使这些事件实际上去任何地方,事件调度程序对象的on方法是rebound到强制布局对象上,以便用户可以为自定义事件注册侦听器函数。

如果这对你来说太多d3内部,请关注这些细节:

  • e是每次调用时都传递给tick函数的自定义事件对象
  • e.alpha是力布局的当前alpha值,默认情况下从0.1开始并在每次滴答时减少(根据friction参数),直到它降至0.005以下并且布局冻结:

      

    在内部,布局使用冷却参数alpha来控制布局温度:当物理模拟收敛于稳定布局时,温度下降,导致节点移动得更慢。最终,alpha降至阈值以下,模拟完全停止,释放CPU并避免电池耗尽。 (From the API wiki for force.start