跳至内容

碰撞力

碰撞力将节点视为具有给定半径的圆形,而不是点,并防止节点重叠。更正式地说,两个节点ab被分开,使得ab之间的距离至少为radius(a) + radius(b)。为了减少抖动,默认情况下这是一个“软”约束,具有可配置的强度迭代次数

forceCollide(radius)

源代码 · 创建一个新的圆形碰撞力,具有指定的radius。如果未指定radius,则默认为所有节点的常数 1。

js
const collide = d3.forceCollide((d) => d.r);

collide.radius(radius)

源代码 · 如果指定了radius,则将半径访问器设置为指定的数字或函数,重新计算每个节点的半径访问器,并返回此力。如果未指定radius,则返回当前半径访问器,默认为

js
function radius() {
  return 1;
}

半径访问器针对模拟中的每个节点调用,传递节点及其基于零的索引。生成的数字随后被存储在内部,这样每个节点的半径仅在力初始化时或当此方法使用新的radius调用时重新计算,而不是在每次应用力时都重新计算。

collide.strength(strength)

源代码 · 如果指定了strength,则将力强度设置为指定的范围在 [0,1] 内的数字,并返回此力。如果未指定strength,则返回当前强度,默认为 1。

重叠节点通过迭代松弛来解决。对于每个节点,确定在下一个刻度(使用预期位置⟨x + vx,y + vy⟩)中预计会重叠的其他节点;然后修改节点的速度以将节点从每个重叠节点中推开。速度的变化会受到力的强度抑制,这样可以将同时重叠的解决方案混合在一起,找到稳定的解决方案。

collide.iterations(iterations)

源代码 · 如果指定了iterations,则将每次应用的迭代次数设置为指定的数字,并返回此力。如果未指定iterations,则返回当前迭代次数,默认为 1。增加迭代次数会大大增加约束的刚度,并避免节点的部分重叠,但也增加了评估力的运行时间成本。