2009-08-08 22 views
13

私は美的グラフとして整理する必要があるオブジェクトのリストを持っています。私の現在のアプローチにはIronPythonと遺伝的アルゴリズムが含まれていますが、これには時間がかかります。C#のグラフレイアウトの最適化

私はGraphvizの、QuickGraphとグラフ#上まで読んできたが、私は可視化の部分は必要ありません - 私はすでにX/Y座標指定されたノードを表示するアプリを持っています。私は、Sugiyamaアルゴリズムと力に基づいたアルゴリズムの両方のファミリが喜ばしいグラフを出力する傾向があると言われてきましたが、かなり深刻なソースコードなしではなく、座標の代わりに座標を出力する.NETライブラリハッキング。

誰でも図書館、アルゴリズムなどをお勧めしますか?

答えて

21

は、さまざまな長所と短所を、多くのオプションがあります - あなたが行うソフトウェアのリストがあるthisを取捨選択する必要があり、多かれ少なかれ、あなたが探しているもの。

基本的には、レイアウトエンジンライブラリの容量で使用することを意図している無料の、純粋なC#実装があるようには思えません。最も近いものはMSAGLであると思われます。これはdownloadable if you're on MSDNですが、それ以外の場合はかなり高価です。

Graph#QuickGraphの区別は、後者は、グラフ・トラバーサルと操作プリミティブを提供するが、任意のレイアウトアルゴリズムを提供しないことです。グラフ#は利用可能なすべてのソースを持ち、私が(簡単に)見たものから、レイアウトエンジンと描画の実装がきちんと分かれています。

Graphvizは、純粋なC/C++で書かれており、グラフを記述し、さまざまなタイプの出力を生成するベクトルファイルとラスターベースのテキストファイルを入力として取り入れています。これは、プラグインレイアウトエンジンとしてはあまり適していませんが、必要な入力ファイルを提供して出力を解析することによって、使用することができます。しかし、非常にクリーンなソリューションではありません。

OGDFと呼ばれるものもあります。これはC++で書かれていますが、レイアウトエンジンライブラリとして使用するように設計されており、このための構造化されたインタフェースを備えています。それはあなたに興味を持っているものだ場合には、最適化された杉山含む様々なレイアウトアルゴリズムをサポートしています。

あなたが杉山に最適化されたバリエーションを希望される場合、あなたは常にneat description of the algorithmを使用して独自のロールでした:)結局​​

しかし、あなたがライブラリの決定を下す前に、あなたがどんなタイプのレイアウトを決めるのかはおそらく決めるべきです。

+1

MSAGLはGitHubのオープンソースとして利用できるようになりました:https://github.com/Microsoft/automatic-graph-layout –

+1

MSAGLは現在MITライセンスの下にあるようです:https ://github.com/Microsoft/automatic-graph-layout/blob/master/LICENSE、それは私が彼らが最近Silverlight版の修正を押し込んだのを見るので、維持されています –

3

マイクロソフトリサーチは、この努力であなたを助けるかもしれない自動化されたグラフのレイアウトエンジンを持っています。

あなたがここでそれについての詳細を読むことがあります。

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

+0

私はGLEE/MSAGLを試してみましたが、それだけで私の知る限り、画像を出力 - あなたは座標を得ることができる場合、あなたが知っているのですか? –

+1

私はレイアウトエンジンがレンダリングコンポーネントから独立しているという印象を受けましたが、私はそれを絶対的な確実性で述べることはできません。 この記事では、Sugiyamaアルゴリズムを含む、その背後にある理論について説明します。 ftp://ftp.research.microsoft.com/pub/tr/TR-2007-72.pdf –

+0

はい、MSAGL(旧GLEE)の座標のみを取得し、独自のレンダリングを実装することができます - http:// coding -time.blogspot.com/2009/03/debugger-visualizer-for-visual-studio.html –

1

yFilesは、強制的(「オーガニック」と呼ばれる)と杉山(Sugiyama)ベースの(「呼び出された階層」)レイアウトアルゴリズムの両方の非常に高度な実装を備えています。 Java、.net、Silverlight、Flex、Javascriptのビューアレス実装を提供します。座標を取得するAPIは、hereからオンラインで入手できます。

アルゴリズムとその品質は、しかし、ライブラリは唯一の市販されており、自由yEd Graph Editorアプリケーションで試験することができます。

+1

少し高価な解決策ですが、アーキテクチャとドキュメンテーション、いくつかのplatforのライブラリms(HTML5を含む) –

0

Apacheライセンスのmodslシステムの一部としてJavaにSugiyamaレイアウト実装があります。ソースはhereです。

私はそれを二重グラフに基づいて混合してObjective-C/Objective-C++ implementationに合理的に簡単に変換することができました。

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

関連する問題