2012-10-24 35 views
5

在一個系統中我有一個連接如正常圖形的節點列表。我們知道整個系統及其所有連接,並且我們也有一個起點。我所有的邊都有一個方向。從連接節點列表中繪製圖形

現在我想自動繪製所有這些節點和邊緣。問題不是實際繪圖,而是計算(x,y)座標。所以基本上我想繪製整個圖形,看起來不錯。

我的數據結構是這樣的:

class node: 
string text 
List<edge> connections 

必須有一些針對此問題衆所周知的算法?我一直沒有找到任何,但我可能會使用錯誤的關鍵字。

我的想法:

一種方法是我們的​​StartNode在(0,0)的位置,然後有一些常數,它是「距離」。然後,對於每個鄰居,它將增加到y位置的距離,並且對於作爲鄰居的每個節點,設置x =距離* n。

但是,這將真正給了很多的問題 - 所以這definetely不是要走的路。

回答

9

到目前爲止,這個最常用的方法是使用一個force-directed layout而不是確定性之一。要點是你有每個節點相互排斥(反重力),並有任何連接的節點對互相吸引。經過多次物理模擬迭代後,您可以獲得合理的佈局。

您可以使用許多佈局算法,結果大不相同。 GraphViz fdp(Fruchterman & Reingold '91)和neato(Kamada & Kawai '89)算法的工作,但是比較老,有更好的選擇。 Fruchterman & Reingold '91算法在Python中也可用於NetworkX

Prefuse提供ForceDirectedLayout Java class這是非常快速和良好的。 Hachul & Jünger '05詳細說明了FM^3算法,該算法在實踐中表現得相當好(​​),並且在Tulip的C++中可用。

有噸的其他開源工具,可視化的圖表,就像 NodeXL(C#),一個偉大的入門工具,集成網絡分析到Excel 2007/2010(免責聲明:我爲它顧問)。其他很棒的工具包括Gephi(Java)和Cytoscape(Java),而Pajek,UCINet,yEdTom Sawyer是一些專有的替代品。

2

一般來說,這是一個棘手的問題,特別是如果你要開始處理邊緣路由,使事情看起來很漂亮。您可以查看http://www.graphviz.org/並使用其命令行工具,或使用graphviz庫進行佈局,並在應用程序中獲取x,y座標。