2011-11-27 84 views
11

我需要在C#中繪製一個公司結構樹(類似於家族樹)。所有的輔助代碼都在那裏。它是有色的,互動的,花哨的。唯一的麻煩是實際決定將每個節點放在哪裏的算法給我帶來了很多悲傷。有效繪製樹的算法?

目前,箱子尺寸爲100x50,我有一個名爲StaffNode的類,它代表某個特定x,y座標的職員。

該算法只需要創建一個List<StaffNode>與適當的x和y。

這是非常棘手的。

基本上,該算法是沿着企業結構遞歸的,所以左 - >右,然後沿着樹頂部 - >下。顯然,如果兩個節點彼此重疊,那就很糟糕。

我能想到的,可能會產生這樣的一些算法:

  * 
    o   O 
o o o o o  O 
o   O O O O O 
       O 

鑑於這樣的事情會比較好,因爲樹是非常大的空間是非常有限:

 * 
    o  O 
o o o o o O 
o  O O O O O 
      O 

你們有沒有必須像以前那樣畫一棵樹?如果你有我相信你遇到了我遇到的很多障礙。有小費嗎?到目前爲止,我花了整整一天的時間。

+0

您想要做什麼?不應該在微軟的visio或其他東西? – DrStrangeLove

+0

採取一些俄羅斯方塊解算器... – Dialecticus

+0

@DrStrangeLove不,我正在編寫一個交互式可視化。 – user1002358

回答

12

繪製樹有很多好的算法,每種算法都展示了樹的一些不同特性。如果你想炫耀一個層次結構,有this code for WPF that draws hierarchies。有關如何繪製圖形和樹木的更一般性討論,請考慮查看詳細許多此類算法的these lecture slides。也有覆蓋相似材料的these excellent slides

希望這會有所幫助!

+2

這絕對是完美的!正是我需要的。它使用Reingold-Tilford算法。 – user1002358

+1

@ user1002358謝謝你的評論。我無法從這裏列出的答案中瞭解算法,但Google搜索「Reingold-Tilford算法」將我引向[此問題](http://stackoverflow.com/q/13128750/302677),我發現它更有用。我還總結了編碼算法[這裏](http://rachel53461.wordpress.com/2014/04/20/algorithm-for-drawing-trees/)的步驟,以防其他人正在尋找一個簡單的解釋 – Rachel

1

您可以使用迭代方法。使用類似上面使用的第一個示例的方式佈置樹。然後將節點或子樹彼此靠近,同時確保沒有違反約束(例如:節點不能重疊,子節點必須低於父節點)。

優點:

  • 簡單的算法。
  • 獲得足夠好的解決方案。
  • 可以連續應用於變化的樹。
  • 可以看起來很酷。

缺點:

  • 可能需要多次迭代好看。
  • 可能找不到最佳解決方案(陷入本地最大值)
+0

您可以在一次迭代中做這樣的事情。 –

+0

同意,但有時迭代優化方法可能是有用的,如果一個單一的通過算法是計算不可行的大量節點。 – geofftnz