La présentation graphique de l'optimisation en C#
-
12-09-2019 - |
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?
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
Microsoft Research a un moteur de mise en page graphique automatisé qui pourrait vous aider dans cet effort.
Vous pouvez en lire davantage ici:
http://research.microsoft. com / fr-fr / downloads / f1303e46-965f-401a-87c3-34e1331d32c5 /
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.
Juste au cas où quelqu'un sera confronté au même problème.Il y a un GraphX pour .NET projet open-source qui intègre de nombreux algorithmes de disposition séparée du moteur de visualisation.De sorte que vous pouvez simplement prendre la logique de la bibliothèque, effectuer des calculs et d'obtenir les coordonnées pack pour être utilisé dans votre propre vis de l'outil.
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);
}
}
}