2009-08-08 102 views
13

我有一個需要組織爲審美圖形的對象列表。我目前的方法涉及IronPython和遺傳算法,但這需要太長時間。我一直在讀Graphviz,QuickGraph和Graph#,但我不需要可視化部分 - 我已經有一個應用程序,將顯示給定x/y座標的節點。有人告訴我,Sugiyama算法和基於力的算法家族傾向於輸出令人滿意的圖形,但我似乎無法找到一個.NET庫,它將輸出座標而不是沒有一些非常嚴重的源代碼的圖像黑客攻擊。C#中的圖形佈局優化

任何人都可以推薦庫,算法之類的?

回答

21

有許多的選擇,各種利弊 - 你可能想通過this這是軟件,做一個列表中進行篩選,或多或少,你在找什麼。

基本上,似乎沒有一個免費的,純粹的C#實現,旨在用於佈局引擎庫的容量。最接近的東西似乎是MSAGL,這是downloadable if you're on MSDN,但否則是相當昂貴。

Graph#QuickGraph之間的區別在於後者提供圖遍歷和操作原語,但不提供任何佈局算法。 Graph#擁有所有可用的源代碼,並且從我已經(簡要地)看過的內容中可以看出,佈局引擎和繪圖實現之間有着巧妙的分離。

Graphviz是用純C/C++語言編寫的,它非常單一,以輸入文本文件描述圖形並生成各種類型的輸出,包括矢量和基於柵格。它不適合作爲插件佈局引擎,但可以通過脫殼並提供必要的輸入文件並解析輸出來使用。雖然不是很乾淨的解決方案。

還有一些東西叫OGDF。雖然它完全用C++編寫,但它已被設計爲用作佈局引擎庫,並且具有良好結構的接口。它支持包括優化杉山各種佈局算法,如果這就是你感興趣的問題。

如果你有興趣在落實杉山優化的變化,你可以使用neat description of the algorithm :)

最終總是滾你自己儘管如此,在決定圖書館之前,您應該先決定自己的佈局類型。

+1

MSAGL現在可在GitHub中作爲開源獲得:https://github.com/Microsoft/automatic-graph-layout – 2015-05-18 18:00:01

+1

MSAGL似乎現在處於MIT許可下:https ://github.com/Microsoft/automatic-graph-layout/blob/master/LICENSE,加上它被維護,因爲我看到他們已經推出了修復Silverlight版本最近 – 2015-05-19 02:17:49

3

微軟研究院有一個自動圖形佈局引擎,可以幫助你做這個工作。

你可以閱讀更多關於它在這裏:

http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/

+0

我試圖GLEE/MSAGL,但它只是AFAIK輸出的圖像 - 你知道,如果你能得到的座標? – 2009-08-08 23:18:34

+1

我的印象是佈局引擎獨立於渲染組件,但我無法絕對肯定地說出這一點。本文討論背後的理論,包括Sugiyama算法。 ftp://ftp.research.microsoft.com/pub/tr/TR-2007-72.pdf – 2009-08-08 23:59:59

+0

是的,你可以從MSAGL(以前稱爲GLEE)獲取座標並實現自己的渲染 - http://編碼-time.blogspot.com/2009/03/debugger-visualizer-for-visual-studio.html – 2010-12-26 03:03:39

1

yFiles具有非常複雜的強制執行(稱爲「有機」)和基於Sugiyama(「調用層次結構」)佈局算法的實現。它們爲Java,.net,Silverlight,Flex和Javascript提供瀏覽器較少的實現。檢索座標的API可在線獲得here

這些算法及其質量可以在免費的yEd Graph Editor應用程序中測試,但這些庫僅在市場上可買到。

+1

有點昂貴的解決方案,但非常好架構和文檔,以及用於幾個平臺的庫ms(包括一些HTML5) – 2015-05-19 02:09:20

0

我已經得到了節點的座標,以這種方式

namespace GleeTest 
{ 
    class GleeTest 
    { 

     static void Main() { 
      Microsoft.Glee.GleeGraph oGleeGraph = new Microsoft.Glee.GleeGraph(); 

      Microsoft.Glee.Splines.ICurve oCurve = 
       Microsoft.Glee.Splines.CurveFactory.CreateEllipse(
        1, 1, 
        new Microsoft.Glee.Splines.Point(0, 0) 
        ); 
      Microsoft.Glee.Node strNode1 = new Microsoft.Glee.Node("Circle", oCurve); 

      Microsoft.Glee.Node strNode3 = new Microsoft.Glee.Node("Diamond", oCurve); 
      Microsoft.Glee.Node strNode4 = new Microsoft.Glee.Node("Standard", oCurve); 
      Microsoft.Glee.Node strNode2 = new Microsoft.Glee.Node("Home", oCurve); 

      oGleeGraph.AddNode(strNode1); 
      oGleeGraph.AddNode(strNode2); 
      oGleeGraph.AddNode(strNode3); 
      oGleeGraph.AddNode(strNode4); 

      Microsoft.Glee.Edge oGleeEdge1 = 
       new Microsoft.Glee.Edge(strNode1, strNode2); 
      Microsoft.Glee.Edge oGleeEdge2 = 
      new Microsoft.Glee.Edge(strNode2, strNode1); 
      Microsoft.Glee.Edge oGleeEdge3 = 
      new Microsoft.Glee.Edge(strNode2, strNode2); 
      Microsoft.Glee.Edge oGleeEdge4 = 
      new Microsoft.Glee.Edge(strNode1, strNode3); 
      Microsoft.Glee.Edge oGleeEdge5 = 
      new Microsoft.Glee.Edge(strNode1, strNode4); 
      Microsoft.Glee.Edge oGleeEdge6 = 
      new Microsoft.Glee.Edge(strNode4, strNode1); 


      oGleeGraph.AddEdge(oGleeEdge1); 
      oGleeGraph.AddEdge(oGleeEdge2); 
      oGleeGraph.AddEdge(oGleeEdge3); 
      oGleeGraph.AddEdge(oGleeEdge4); 
      oGleeGraph.AddEdge(oGleeEdge5); 
      oGleeGraph.AddEdge(oGleeEdge6); 

      oGleeGraph.CalculateLayout(); 


      System.Console.WriteLine("Circle position " + oGleeGraph.FindNode("Circle").Center.X + "," + oGleeGraph.FindNode("Circle").Center.Y); 
      System.Console.WriteLine("Home position = " + oGleeGraph.FindNode("Home").Center.X + "," + oGleeGraph.FindNode("Home").Center.Y); 
      System.Console.WriteLine("Diamond position = " + oGleeGraph.FindNode("Diamond").Center.X + "," + oGleeGraph.FindNode("Diamond").Center.Y); 
      System.Console.WriteLine("Standard position = " + oGleeGraph.FindNode("Standard").Center.X + "," + oGleeGraph.FindNode("Standard").Center.Y); 




     } 

    } 
} 
0

萬一有人將面臨類似的問題。有一個GraphX for .NET開源項目,它包含許多與可視化引擎分離的佈局算法。所以你可以把邏輯庫,執行計算,並獲得座標包用於你自己的可視化工具。

https://github.com/panthernet/GraphX