跳至內容

碰撞力

碰撞力將節點視為具有給定 半徑 的圓形,而非點,並防止節點重疊。更正式地說,兩個節點 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;
}

半徑存取器會針對模擬中的每個 節點 進行呼叫,傳遞給 節點 和其從 0 開始的 索引。產生的數字會儲存在內部,因此每個節點的半徑只會在初始化力時或使用新的 半徑 呼叫此方法時重新計算,而不是在每次應用力時。

collide.strength(strength)

來源 · 如果指定 strength,會將力強度設定為 [0,1] 範圍內指定的數字,並傳回此力。如果未指定 strength,會傳回目前的強度,預設為 1。

重疊的節點會透過反覆的放鬆來解決。對於每個節點,會決定預期在下一次滴答聲時會重疊的其他節點(使用預期的位置 ⟨x + vx,y + vy⟩);然後會修改節點的速度,將節點推出每個重疊的節點。速度的變化會受到力的強度影響,因此可以將同時重疊的解決方案混合在一起,以找到穩定的解決方案。

collide.iterations(iterations)

來源 · 如果指定 iterations,會將每次應用程式的反覆次數設定為指定的數字,並傳回此力。如果未指定 iterations,會傳回目前的反覆次數,預設為 1。增加反覆次數會大幅增加約束的剛性,並避免節點部分重疊,但也會增加評估力的執行時間成本。