2014-09-29 43 views
1

我想修改directed graph editor以下方式:D3力導向佈局 - 冷拔三通不改變節點的位置

  • 當鏈路被繪製時,它不會重新定位源節點和目標節點。相反,鏈接將在節點的當前位置之間繪製。

  • 當圍繞拖動現有節點(使用CTRL),它不會影響連接到它的任何相連的節點的位置。相反,所有其他節點將保持其位置,並且只有鏈接到拖動節點的鏈接纔會根據拖動來更改其長度。

我想提供這種功能力的linkDistance:

force.linkDistance(function(link) { 
    var deltaX = d.target.x - d.source.x, 
    deltaY = d.target.y - d.source.y, 
    dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY); 
    return dist; 
}) 

認爲這會導致力的假設,沒有必要重新定位節點在鏈路的每一側(以下documentation)。

然而,這導致了運行時錯誤,我解決不了。

在圖表的這種行爲如何可以實現任何想法?

回答

2

聽起來像你想要使用fixed選項,通過將其設置爲每個節點節點的屬性,例如{ id:123, fixed:true }

Here's a modified version

固定節點沒有得到周圍受力佈局在所有的移動,所以除非你明確地給他們的初始位置,他們只是通過分配佈局隨機一個。還要注意,在所有節點都被固定的情況下,沒有真正的理由使用強制定向佈局。

+0

謝謝,這個簡單的加法了! 我試圖尋找到更多的佈局(https://github.com/mbostock/d3/wiki/Layouts),但沒有似乎符合我的需要(非物理圖形佈局)。 您是否有更好的佈局選擇建議? – Gabis 2014-09-29 08:06:01

+0

@ user1147537力佈局重新計算的節點位置每秒60次,然後你的代碼將它們移動到這些位置每秒60次。由於所有節點都是固定的,因此不需要此佈局和頻繁重繪。事實上,你在這裏不需要任何佈局。你可以從代碼中刪除任何提到的'強制'。但是,只要添加了節點/鏈接,就必須自己調用tick()函數。另外,force.drag需要被替換爲d3.behavior.drag()。 – meetamit 2014-09-29 14:38:07

+0

非常感謝您的詳細解釋!我會將我的代碼更改爲您的建議。 – Gabis 2014-09-30 07:52:58