連結力
連結力會根據所需的 連結距離 將連結的節點推在一起或拉開。力的強度與連結節點的距離與目標距離的差值成正比,類似於彈簧力。
forceLink(links)
原始碼 · 使用指定的 links 和預設參數建立新的連結力。如果未指定 links,則預設為空陣列。
警告
此函式是不純的;它可能會變異傳入的 links。請參閱 link.links。
const link = d3.forceLink(links).id((d) => d.id);
link.links(links)
原始碼 · 如果指定 links,則設定與此力相關的連結陣列,重新計算每個連結的 距離 和 強度 參數,並傳回此力。如果未指定 links,則傳回目前的連結陣列,預設為空陣列。
每個連結都是一個具有以下屬性的物件
source
- 連結的來源節點;請參閱 simulation.nodestarget
- 連結的目標節點;請參閱 simulation.nodesindex
- links 中的 0 為基礎的索引,由此方法指定
為了方便起見,連結的來源和目標屬性可以使用數字或字串識別碼初始化,而不是物件參考;請參閱 link.id。
警告
此函式不純;當連結力被初始化(或重新初始化,例如當節點或連結改變時)時,它可能會變異傳入的連結。任何不是物件的連結.來源或連結.目標屬性都會被替換為對應節點的物件參考,其具有指定的識別碼。
如果指定的連結陣列被修改,例如當連結被加入或從模擬中移除時,必須再次呼叫此方法,並使用新的(或已變更的)陣列來通知力關於變更;力不會對指定的陣列建立防禦性副本。
連結.id(id)
來源 · 如果指定了id,則將節點 id 存取器設定為指定的函式,並傳回此力。如果未指定id,則傳回目前的節點 id 存取器,其預設為數字節點.index
function id(d) {
return d.index;
}
預設的 id 存取器允許每個連結的來源和目標指定為節點陣列中的從 0 開始的索引。例如
const nodes = [
{"id": "Alice"},
{"id": "Bob"},
{"id": "Carol"}
];
const links = [
{"source": 0, "target": 1}, // Alice → Bob
{"source": 1, "target": 2} // Bob → Carol
];
現在考慮一個傳回字串的不同 id 存取器
function id(d) {
return d.id;
}
使用此存取器,您可以使用具名稱的來源和目標
const nodes = [
{"id": "Alice"},
{"id": "Bob"},
{"id": "Carol"}
];
const links = [
{"source": "Alice", "target": "Bob"},
{"source": "Bob", "target": "Carol"}
];
當以 JSON 表示圖形時,這特別有用,因為 JSON 不允許參考。請參閱此範例。
每當力被初始化時,例如當節點或連結變更時,都會針對每個節點呼叫 id 存取器,並傳遞節點及其從 0 開始的索引。
連結.距離(距離)
來源 · 如果指定了距離,則將距離存取器設定為指定的數字或函式,重新評估每個連結的距離存取器,並傳回此力。如果未指定距離,則傳回目前的距離存取器,其預設為
function distance() {
return 30;
}
距離存取器會針對每個連結呼叫,並傳遞連結及其從 0 開始的索引。然後將結果數字內部儲存,這樣每個連結的距離只會在力被初始化或當此方法被呼叫並使用新的距離時重新計算,而不是在每次應用力時重新計算。
連結.強度(強度)
來源 · 如果指定了強度,則將強度存取器設定為指定的數字或函式,重新評估每個連結的強度存取器,並傳回此力。如果未指定強度,則傳回目前的強度存取器,其預設為
function strength(link) {
return 1 / Math.min(count(link.source), count(link.target));
}
其中 count(node) 是傳回具有給定節點作為來源或目標的連結數量的函數。選擇這個預設值是因為它會自動降低連接到大量連接節點的連結強度,進而改善穩定性。
強度存取器會針對每個 連結 呼叫,傳遞 連結 及其以 0 為基底的 索引。然後會將結果數字內部儲存,因此每個連結的強度只會在初始化力時或使用新的 強度 呼叫此方法時重新計算,而不是在每次應用力時。
連結.iterations(iterations)
來源 · 如果指定 iterations,則將每個應用程式的迭代次數設定為指定數字,並傳回此力。如果未指定 iterations,則傳回目前的迭代次數,預設為 1。增加迭代次數會大幅增加約束的剛性,適用於 複雜結構,例如格狀,但也會增加評估力的執行時間成本。