Frage

Ich habe eine Liste von Objekten, die ich als ästhetisches Diagramm organisieren muss.Mein aktueller Ansatz umfasst IronPython und einen genetischen Algorithmus, aber das dauert viel zu lange.

Ich habe mich über Graphviz, QuickGraph und Graph# informiert, aber ich benötige den Visualisierungsteil nicht – ich habe bereits eine App, die die Knoten anhand der x/y-Koordinaten anzeigt.Mir wurde gesagt, dass sowohl der Sugiyama-Algorithmus als auch die kraftbasierte Algorithmenfamilie dazu neigen, ansprechende Grafiken auszugeben, aber ich kann anscheinend keine .NET-Bibliothek finden, die die Koordinaten anstelle des Bildes ausgibt, ohne dass ein ziemlich strenger Quellcode erforderlich ist Hacken.

Kann jemand Bibliotheken, Algorithmen oder ähnliches empfehlen?

War es hilfreich?

Lösung

Es gibt eine Reihe von Optionen, mit verschiedenen Vor- und Nachteilen - Sie können durch diese , die eine Liste der Software, die, mehr oder weniger tut, was Sie suchen .

Früher war es der Fall sein, dass eine Open-Source-Lösung war schwierig zu finden, aber die einmal kommerziell lizenzierte MSAGL jetzt scheint Open Source zu sein .

Die Unterscheidung zwischen Graph # und QuickGraph ist, dass letztere Primitive graph Traversal und Manipulation bereitstellt, aber keine Layout-Algorithmen nicht zur Verfügung stellt. Graph # verfügt über alle die Quelle zur Verfügung, und von dem, was ich habe (kurz) sah, hat eine saubere Trennung zwischen Layout-Engine und Zeichnung Umsetzung.

Graphviz in reinem C / C ++ geschrieben und ist ziemlich monolithisch, nimmt als Eingabe eine Textdatei beschreibt, die Grafik und die Herstellung von verschiedenen Arten von Ausgabe, sowohl Vektor- als auch Raster basierten. Es ist nicht eine gute Passform als Plug-in-Layout-Engine, konnte aber durch Beschuss aus und die Bereitstellung der erforderlichen Eingabedatei und Analysieren der Ausgabe verwendet werden. Nicht eine sehr saubere Lösung though.

Es gibt auch etwas namens OGDF . Obwohl es vollständig in C ++ geschrieben ist, hat es entworfen worden, als Layout-Engine-Bibliothek verwendet werden und verfügt über eine gut strukturierte Oberfläche für diese. Es unterstützt verschiedene Layout-Algorithmen einschließlich optimiert Sugiyama wenn das, was Sie interessiert sind.

Wenn Sie bei der Implementierung einer optimierten Variante Sugiyama interessiert sind, können Sie immer Ihre eigene Rolle mit a

Andere Tipps

yFiles hat sehr anspruchsvolle Implementierungen sowohl kraft gerichtet (so genannte "Bio") und Sugiyama basiert ( "Called hierarchische ") Layout-Algorithmen. Sie bieten zuschauer weniger Implementierungen für Java, .NET, Silverlight, Flex und Javascript. Die API, die Koordinaten abzurufen ist online verfügbar rel="nofollow">.

Die Algorithmen und deren Qualität können rel="nofollow"> yEd Graph Editor Anwendung, die Bibliotheken sind nur in der freien

gibt es eine Sugiyama Layout Implementierung in Java als Teil des modsl Systems, Apache-Lizenz. Quelle hier .

kann ich es einigermaßen leicht zu einem gemischten rel="nofollow"> basierte auf digraph.

ich die Koordinaten von Knoten auf diese Weise bekommen hatte

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);




        }

    }
}
scroll top