动画是由alpha
。这是一个始终相同的几何级数:设置为 0.1 in.start()
并在每个刻度处乘以0.99,当小于0.005时动画停止
alpha: 0.0990
alpha: 0.0980
alpha: 0.0970
alpha: 0.0961
alpha: 0.0951
alpha: 0.0941
...etc.
force.tick = function() {
if ((alpha *= .99) < .005) {
event.end({
type: "end",
alpha: alpha = 0
});
return true;
}
//other code...
};
它代表布局中的“热量”,因为它用于确定节点的速度。这类似于气体的温度,它与气体分子的平均动能成正比。 “冷却”被预编程为始终为当前“温度”的-1%。
元素的初始位置也设置在.start()
充当Math.random() * size
对于 x 和 y,其中 size 分别是宽度和高度。这个做完了before首先forEach
in the tick
功能。
function tick(e) {
//var k = .1 * e.alpha;
var k = .1 * e.alpha;
log.text('alpha: ' + d3.format(".4f")(e.alpha * 1000))
// Push nodes toward their designated focus.
nodes.forEach(function (o, i) {
o.y += (foci[o.id].y - o.y) * k;
o.x += (foci[o.id].x - o.x) * k;
});
在上文中,forEach
语句中,如果元素 y 位置大于焦点 y 位置,那么它将被赋予一个较小的 y,与 x 位置类似。这意味着它们将以与距焦点的距离成正比的速度向焦点移动。比例常数k
is 0.1*alpha
呈几何递减k = 0.1*0.1
to k = 0.1*0.005
,随着动画的进行。最终位置是其初始位置的函数,并且k
以及其他重力、电荷和摩擦力。
节点是g
除了其子元素的引用(定位上下文)之外没有任何定位的元素。这是包含的原点(左上角)svg
元素及其位置是页面流和 CSS 定位的结果。的定位背景g
元素可以通过其变换属性进行更改,并且该属性由其所有子元素继承。如果没有 g 元素,圆圈和文本元素都必须单独定位,这样工作量就减半了。如果没有变换,所有圆圈和文本都将定位在左上角的中心svg
元素。
每个价格变动计算的新头寸是绝对值,而不是价值变化。
节点位置的变化为(foci[o.id].y - o.y) * k
这将使他们朝着他们的焦点移动。这被“添加”到现有值(尽管它可能是负数)并存储在节点数据上(o.x
and o.y
), 这个说法
node.attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; });
使用新数据(d
)来更新翻译,这仍然是相对于svg
起源。它是一个转换, not a move,因此它不会相对于当前位置进行平移,而是会更改相对于当前位置的平移svg
元素原点(这是元素的定位上下文)g
)。因此,如果我们从 [10,10] 开始并且新的计算结果为 [10,10],则相对于之前的位置,位置将保持在 [10,10]。svg
定位上下文。