グラフレイアウトの最適化をクライアントまで、フルのC#
-
12-09-2019 - |
質問
がんのリストオブジェを必要とすることを整理しているグラフで表示します。現在のアプローチをIronPythonおよび遺伝的アルゴリズムが、これが多すぎます。
って読みづムQuickGraph、グラフ#んなに可視化パ既に持っているアプリ表示のノードのx/y座標です。だと聞いていの杉山アルゴリズムの力に基づく家族のアルゴリズムが出力喜ばれるグラフがないのですが探すネットライブラリーが出力の座標画像の変わりにくい厳しいsourcecodeハックする
誰でもできるのでお勧めの図書館、アルゴリズムをやるのでしょう?
解決
多数のオプション、多くの賛否-い取捨選択する この であるリストのソフトウェアは、以下の何ます。
とされている場合は、見つけオープンソースの解決は困難でしたが、一度に商業的に許 MSAGL 現在 そうなオープンソース.
の区別 グラフ# や QuickGraph この後者のグラフはフォーカストラバーサル操作プリミティブが提供をするものではありませんのレイアウトアルゴリズムグラフ#のソースとらんどろ風mikiモデルを作ってみ(い)って、自分の分離とレイアウトエンジンの描画が実装されます。
Graphviz は純粋なC/C++とはかなり積層において、入力テキストファイルを記述するグラフおよびその製造の様々な種類の出力ベクトルとラスター制です。な大としてふさわしいプラグインのレイアウトエンジンが利用できる砲撃して提供するのに必要な入力ファイルの構文解析の出力に出力します。んなに高くはないけれど、清潔なソリューションになってる。
あもう OGDF.この記述は完全にC++を取り入れた計画として使用するレイアウトエンジンの図書館は構造化インタフェースです。対応して様々なレイアウトアルゴリズムを含め最適化された杉山さえてください。
について興味のある方はもちろんの実施は、最適なバリエーション杉山、常にロールをご利用 すっきのアルゴリズム :)
最終的にはなるべき決定をどのようなレイアウトのんの後をご利用いただきますようよろしのライブラリ。
他のヒント
マイクロソフトリサーチは、この努力であなたを助けるかもしれない自動化されたグラフのレイアウトエンジンを持っています。
あなたはここでそれについての詳細を読むことがあります:
http://research.microsoft。 COM / EN-US /ダウンロード/ f1303e46-965f-401A-87c3-34e1331d32c5 / の
yFiles には、いわゆる "(両方の力指向(「有機」と呼ばれる)の非常に洗練された実装を有しており、杉山ベース階層」)レイアウトアルゴリズム。彼らは、Java、.NET、Silverlightのは、Flex、およびJavaScript用のビューアレスの実装を提供します。座標を取得するためのAPIがここをrel="nofollow"> href="http://docs.yworks.com"オンライン
アルゴリズムとその品質はYEDグラフエディタ
念のために誰かが同様の問題に直面するだろう。可視化エンジンから分離し、多くのレイアウトアルゴリズムを組み込んだGraphX .NETのためのオープンソースプロジェクトがあります。だから、あなただけの座標があなたVIS独自のツールで使用されるようにパック、ロジックライブラリを取る計算を実行して取得することができます。
modslシステム、Apacheライセンスの一部として、Javaで杉山レイアウトの実装があります。ソースである<のhref = "https://code.google.com/p/modsl/source/browse/#svn/trunk/modsl-core/src/main/java/org/modsl/core/agt/layout/杉山」のrel = "nofollowを" タイトル= "ここ">ここを。
私は、混合ののObjective-C /のObjective-C ++実装はベースを合理的に容易に変換することができました有向グラフ上。
私はこのように、ノードの座標を持っていた。
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);
}
}
}