解释 d3 定心力

Posted

技术标签:

【中文标题】解释 d3 定心力【英文标题】:interpreting the d3 centering force 【发布时间】:2021-10-01 07:27:47 【问题描述】:

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

n 等于节点数, x 等于居中 x 值 y 等于居中的 y 值 sxsy 为 0。

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;

这是一个中心力?

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

【问题讨论】:

【参考方案1】:

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

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

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

x 和 y 定位力以可配置的强度将节点沿给定维度推向所需位置。 (docs)

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

【讨论】:

以上是关于解释 d3 定心力的主要内容,如果未能解决你的问题,请参考以下文章

D3.js中Force-Directed Graph详解

如何解释 D3 附加到 DOM 元素的 __transition__ 属性作为过渡的一部分?

关于DirectX中三角形检测代码的解释

力扣题库

d3js 各种力的仿真

Vue D3 力导向图