Question

J'ai une liste d'objets que j'ai besoin d'organiser une esthétique graphique.Mon approche actuelle consiste à IronPython et un algorithme génétique, mais cela prend beaucoup trop de temps.

J'ai lu sur Graphviz, QuickGraph et Graphique#, mais je n'ai pas besoin de la partie visualisation - j'ai déjà une application qui permettra d'afficher les nœuds étant donné le x/y de coordonnées.J'ai été informé que les deux l'Sugiyama algorithme et la force de la famille des algorithmes ont tendance à sortie agréable graphiques, mais je n'arrive pas à trouver un .NET-library qui va afficher les coordonnées à la place de l'image sans certains assez graves au code source de piratage.

Quelqu'un peut-il recommander des bibliothèques, des algorithmes ou autres?

Était-ce utile?

La solution

Il y a un certain nombre d'options, avec divers avantages et les inconvénients - vous pouvez passer en revue maintenant href="https://github.com/Microsoft/automatic-graph-layout/blob/master/LICENSE" rel="nofollow noreferrer"> semble être open source .

La distinction entre Graphique # et Graphviz est écrit dans le plus pur C / C ++ et est assez monolithique, en prenant en entrée un fichier texte décrivant le graphique et la production de divers types de sortie, à la fois vectoriel et raster basées. Il n'est pas un grand ajustement comme un moteur de mise en page plug-in, mais il pourrait être utilisé par les bombardements et en fournissant le fichier d'entrée requis et l'analyse de la sortie. Pas une solution très propre bien.

Il y a aussi quelque chose appelé FOGD . Bien qu'il soit entièrement écrit en C ++, il a été conçu pour être utilisé comme une bibliothèque de moteur de mise en page et dispose d'une interface bien structurée pour cela. Il prend en charge divers algorithmes de mise en page, y compris Sugiyama optimisé si c'est ce qui vous intéresse.

Si vous êtes intéressé à mettre en œuvre une variante optimisée sur Sugiyama, vous pouvez toujours rouler votre propre en utilisant un

Autres conseils

yFiles a très sophistiquées mises en œuvre à la fois force dirigée (appelée « biologique ») et à base Sugiyama ( "appelé Hiérarchique ") Les algorithmes de mise en page. Ils offrent des implémentations de visionneuse moins pour Java, .net, Silverlight, Flex et Javascript. L'API pour récupérer les coordonnées est disponible en ligne .

Les algorithmes et leur qualité peuvent être testés dans le href="http://www.yworks.com/yed" libre demande de yEd Graph Editor, les bibliothèques ne sont disponible dans le commerce, bien que.

il y a une implémentation de mise en page Sugiyama en Java dans le cadre du système modsl, licence Apache. source ici .

i a pu convertir raisonnablement facilement à un Objective-C / Objective-C ++ mise en œuvre basée sur digraph.

J'avais obtenu les coordonnées des noeuds de cette façon

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




        }

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top