解释 d3 定心力

interpreting the d3 centering force

D3的力模拟定心力使用以下代码 其中:

source code

首先力是这样做的:

for (i = 0; i < n; ++i) {
  node = nodes[i], sx += node.x, sy += node.y;
}

然后:

for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) {
  node = nodes[i], node.x -= sx, node.y -= sy;
}

这是怎样的定心力?

第一部分和第二部分分别做什么?

D3的居中力不会将节点推到中心,它移动节点使它们的重心(更接近)指定位置(所有节点具有相等的大量的)。换句话说,它不会对任何单个节点施加引力。相反,如果所有节点都位于指定中心的右侧,则它们均等平移,以便实际重心接近指定重心。通过这种方式,它不会将任何单个节点拉向中心,而是将所有节点均等地拉向指定的中心(即,它将图形作为单个实体拉向中心)。

第一部分总结了节点的x和y值的定位为sxsy(我的猜测是s代表sum)。第二部分使用这些总数找到平均位置(sx/n - x,其中 n 等于节点数,x 是中心 x 值)并根据效果强度对每个节点应用相同的校正。

如果您希望将节点拉近中心点,此力将无济于事。相反,您可以使用 d3.forceX 和 d3.forceY,这将:

The x- and y-positioning forces push nodes towards a desired position along the given dimension with a configurable strength. (docs)

这里的 x 和 y 值将分别吸引节点到指定的 x 值、y 值或坐标,具体取决于您使用 d3.forceX 和 d3.forceY 中的一个或两个。