跳到內容

多體力

多體(或n體)力適用於所有 節點 之間。如果 強度 為正數,可用於模擬重力(吸引力);如果強度為負數,可用於模擬靜電荷(排斥力)。此實作使用四叉樹和 巴恩斯-哈特近似 來大幅提升效能;準確度可以使用 theta 參數自訂。

與僅影響兩個連結節點的 連結力 不同,電荷力是全域性的:每個節點都會影響其他每個節點,即使它們位於未連接的子圖上。

forceManyBody()

原始碼 · 建立一個新的多體力,並套用預設參數。

js
const manyBody = d3.forceManyBody().strength(-100);

manyBody.strength(strength)

原始碼 · 如果指定了 strength,會將強度存取器設定為指定的數字或函式,重新評估每個節點的強度存取器,並傳回此力。正值會讓節點互相吸引,類似於重力;負值會讓節點互相排斥,類似於靜電荷。如果未指定 strength,會傳回目前的強度存取器,預設為

js
function strength() {
  return -30;
}

模擬中的每個 節點 都會呼叫強度存取器,並傳入 node 及其從 0 開始的 index。產生的數字會儲存在內部,因此每個節點的強度只會在初始化力或呼叫此方法並提供新的 strength 時重新計算,而不是每次套用此力時重新計算。

manyBody.theta(theta)

來源 · 如果指定了 theta,則將 Barnes–Hut 近似準則設定為指定數字,並傳回此力。如果未指定 theta,則傳回目前的數值,預設為 0.9。

為了加速運算,此力實作了 Barnes–Hut 近似,每次應用時會花費 O(n log n),其中 n節點 的數量。對於每次應用,四叉樹 會儲存目前的節點位置;然後,對於每個節點,會計算所有其他節點對給定節點的合力。對於遠處的節點群集,可以將群集視為單一、較大的節點,來近似電荷力。theta 參數會決定近似的準確度:如果四叉樹儲存格的寬度 w 與節點到儲存格質心的距離 l 的比率 w / l 小於 theta,則給定儲存格中的所有節點會被視為單一節點,而不是個別節點。

manyBody.distanceMin(distance)

來源 · 如果指定了 distance,則設定此力會考量的節點之間的最小距離。如果未指定 distance,則傳回目前的最小距離,預設為 1。最小距離會設定兩個相鄰節點之間的力強度上限,避免不穩定。特別是,如果兩個節點完全重合,它會避免無限強的力;在這種情況下,力的方向是隨機的。

manyBody.distanceMax(distance)

來源 · 如果指定了 distance,則設定此力會考量的節點之間的最大距離。如果未指定 distance,則傳回目前的最小距離,預設為無限大。指定有限的最大距離可以改善效能,並產生更為本地的配置。