Pregunta

Tengo una lista de objetos que necesito para organizar como una estética gráfica.Mi enfoque actual consiste en IronPython y un algoritmo genético, pero esto toma demasiado tiempo.

He estado leyendo en Graphviz, QuickGraph y Gráfico#, pero no necesito la visualización de la parte - ya tengo una aplicación que muestra los nodos que dadas las coordenadas x/y.Me han dicho que tanto el Sugiyama y el algoritmo de la fuerza basada en la familia de los algoritmos tienden a la salida de agradar a los gráficos, pero me parece que no puede encontrar .Biblioteca de RED que va a la salida de las coordenadas en lugar de la imagen sin algunos bastante graves fuente de la piratería.

¿Alguien puede recomendar las bibliotecas, los algoritmos o similares?

¿Fue útil?

Solución

Hay una serie de opciones, con diferentes ventajas y desventajas - es posible que desee tamizar a través de esta que es una lista de software que hace, más o menos, lo que usted está buscando .

Lo que solía ser el caso de que la búsqueda de una solución de código abierto era difícil, pero el una vez autorizado comercialmente ahora href="https://github.com/Microsoft/automatic-graph-layout/blob/master/LICENSE" rel="nofollow noreferrer"> parece ser de código abierto .

La distinción entre Gráfico # y QuickGraph es que este último ofrece transversales y manipulación de gráficos primitivos, pero no proporciona ningún algoritmos de diseño. Gráfico # tiene toda la fuente disponible, y por lo que he (brevemente) miré, tiene una separación clara entre motor de diseño e implementación de dibujo.

Graphviz está escrito en C pura / C ++ y es bastante monolítica, tomando como entrada un archivo de texto que describe el gráfico y la producción de diversos tipos de salida, tanto vector y raster basan. No es un gran ajuste como un motor de diseño plug-in, pero podría ser utilizado por los bombardeos a cabo y la disponibilidad para el archivo de entrada requerida y analizando la salida. No es una solución muy limpia.

También hay algo llamado OGDF . A pesar de que está escrito enteramente en C ++, que ha sido diseñado para ser utilizado como una biblioteca de motor de diseño y tiene una interfaz bien estructurada para esto. Es compatible con varios algoritmos de diseño incluyendo Sugiyama optimizado si eso es lo que le interesa.

Si está interesado en la ejecución de una variante optimizada de Sugiyama, siempre se puede rodar su propio uso de un aseado descripción del algoritmo :)

En última instancia, sin embargo, es probable que debe decidir qué tipo de diseño que está buscando antes de tomar una decisión sobre la biblioteca.

Otros consejos

Microsoft Research tiene un motor automatizado de diseño gráfico que pueden ayudar en este esfuerzo.

Usted puede leer más sobre esto aquí:

http://research.microsoft. com / es-es / descargas / f1303e46-965f-401a-87c3-34e1331d32c5 /

yFiles tiene implementaciones muy sofisticadas de ambos dirigidos por la fuerza (llamada "orgánica") y basada Sugiyama ( "Llamado jerárquica ") algoritmos de diseño. Ofrecen implementaciones atractivos para los usuarios menos para Java, .NET, Silverlight, Flex y Javascript. El API para recuperar las coordenadas está disponible en línea aquí .

Los algoritmos y su calidad se pueden probar en el aplicación yEd del editor de gráficos , las bibliotecas son solamente disponible en el mercado, sin embargo.

En caso de que alguien se enfrentan a un problema similar.Hay un GraphX para .NET proyecto de código abierto que incorpora muchas de diseño de algoritmos separados del motor de visualización.Así que usted puede simplemente tomar la lógica de la biblioteca, realizar cálculos y obtener las coordenadas pack para ser usado en su propia vis herramienta.

https://github.com/panthernet/GraphX

hay una aplicación de diseño Sugiyama en Java como parte del sistema modsl, licencia Apache. fuente es aquí .

yo era capaz de convertirlo razonablemente fácilmente a un Objective-C / Objective-C ++ basé aplicación el dígrafo.

Me había conseguido las coordenadas de los nodos de esta manera

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




        }

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top