碰撞力
碰撞力將節點視為具有給定 半徑 的圓形,而非點,並防止節點重疊。更正式地說,兩個節點 a 和 b 被分隔開,使得 a 和 b 之間的距離至少為 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。增加反覆次數會大幅增加約束的剛性,並避免節點部分重疊,但也會增加評估力的執行時間成本。