【问题标题】:What is the `e` parameter passed to the d3.js force tick callback function?传递给 d3.js 强制刻度回调函数的 `e` 参数是什么?
【发布时间】:2014-10-09 15:00:05
【问题描述】:

下面是一个正常的tick函数示例:

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 的新手,浏览 force.layout API 并没有给我任何线索。感谢您宝贵的时间!

【问题讨论】:

  • this post 中搜索e.alpha
  • 请提供更多有关您在何处找到此功能的背景信息。单独呈现一个函数并不能告诉您将传递给它的参数的性质。我在回答中做出了合理的猜测,但由于没有包含足够的信息来诊断问题,因此应该关闭该问题。

标签: d3.js force-layout


【解决方案1】:

如果没有“正常”函数的完整上下文,这有点猜测,但这里是:

tick 在 d3 中的许多上下文中使用。 alpha 的插入表明这是一个force layout tick function,它由强制布局对象在滴答事件上调用,在这种情况下,e 将是滴答事件对象。

关于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 源代码中使用d3.dispatch 进程创建的三种自定义事件之一。特别是 tick 事件在内部刻度函数结束时调度,并且仅包含一个自定义属性:强制布局中的当前 alpha 参数。为了让这些事件真正去到任何地方,事件调度器对象的on方法是rebound到强制布局对象上,这样用户就可以为自定义事件注册监听函数。

如果你觉得 d3 内部的内容太多了,那么只需关注这些细节:

  • e 是一个自定义事件对象,每次调用时都会传递给你的刻度函数
  • e.alpha 是强制布局的当前 alpha 值,默认情况下从 0.1 开始,并在每个刻度处减小(根据 friction 参数),直到低于 0.005 并且布局冻结:

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

【讨论】:

  • 很抱歉,但我要感谢你的不仅仅是赞成票。目前,afaik 是关于传递给参数化 on("tick" 函数的内容以及 alpha 组件的含义(除了 d3 源代码)的唯一公开文档。 e.alpha 用于几个示例(例如 Google“d3 多力布局”),没有任何解释。所以我希望我能给这个答案不止一票。 (并不是说您需要 SO 代表。)不幸的是,这个答案在 Google 搜索中并不容易找到。但在 SO 搜索中不难找到。
  • 谢谢@Mars。你让我做一些我应该在 10 月份做的事情:我 updated the d3 API wiki 包含此信息,因此将来应该更容易找到!
  • 酷。 (我仍然觉得您的回答非常有帮助。由于我还不了解整个调度的内容,因此查看明确引用带有参数的tick 定义的解释很有用。)
  • 有谁知道tick事件是否保留在v4中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2018-11-29
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
相关资源
最近更新 更多