2009-08-08 25 views
13

Tengo una lista de objetos que necesito organizar como un gráfico estético. Mi enfoque actual implica IronPython y un algoritmo genético, pero esto lleva demasiado tiempo.Optimización del diseño de gráficos en C#

He estado leyendo en Graphviz, QuickGraph y Graph #, pero no necesito la parte de visualización, ya tengo una aplicación que mostrará los nodos dados las coordenadas x/y. Me han dicho que tanto el algoritmo Sugiyama como la familia de algoritmos basados ​​en la fuerza tienden a producir gráficos agradables, pero parece que no puedo encontrar una biblioteca .NET que muestre las coordenadas en lugar de la imagen sin un código fuente bastante grave seco.

¿Alguien puede recomendar bibliotecas, algoritmos o similares?

Respuesta

21

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

Básicamente, no parece haber una implementación libre y pura de C# que esté destinada a ser utilizada en la capacidad de la biblioteca del motor de diseño. Lo más parecido parece ser MSAGL, que es downloadable if you're on MSDN, pero por lo demás es bastante caro.

La distinción entre Graph# y QuickGraph es que esta última proporciona primitivas de desplazamiento y manipulación de gráficos pero no proporciona ningún algoritmo de diseño. Graph # tiene toda la fuente disponible, y por lo que he visto (brevemente), tiene una clara separación entre el motor de diseño y la implementación del dibujo.

Graphviz está escrito en C/C++ puro y es bastante monolítico, tomando como entrada un archivo de texto que describe el gráfico y produce varios tipos de resultados, tanto vector como basados ​​en ráster. No es una gran opción como motor de diseño de plug-in, pero podría ser utilizado mediante bombardeos y proporcionando el archivo de entrada requerido y analizando la salida. No es una solución muy limpia.

También hay algo llamado OGDF. Aunque está escrito completamente en C++, 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 usted está interesado en la ejecución de una variante optimizada de Sugiyama, siempre se puede rodar su propia utilizando un neat description of the algorithm :)

En última instancia sin embargo, probablemente deberías decidir qué tipo de diseño deseas antes de tomar una decisión sobre la biblioteca.

+1

MSAGL ahora está disponible como código abierto en GitHub: https://github.com/Microsoft/automatic-graph-layout –

+1

MSAGL parece estar ahora bajo licencia de MIT: https : //github.com/Microsoft/automatic-graph-layout/blob/master/LICENSE, además, se mantiene, ya que veo que tienen soluciones integradas recientemente para la versión de Silverlight –

3

Microsoft Research tiene un motor de diseño de gráficos automatizado que puede ayudarlo en este esfuerzo.

Usted puede leer más sobre esto aquí:

http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/

+0

me trataron GLEE/MSAGL, pero sólo produce imágenes que yo sepa - se puede saber si usted puede obtener las coordenadas? –

+1

Tenía la impresión de que el motor de diseño era independiente de los componentes de renderizado, pero no puedo afirmarlo con absoluta certeza. Este documento habla sobre la teoría detrás de él, incluido el algoritmo Sugiyama. ftp://ftp.research.microsoft.com/pub/tr/TR-2007-72.pdf –

+0

Sí, puede obtener solo coordenadas de MSAGL (anteriormente GLEE) e implementar su propio rendering - http: // codeing -time.blogspot.com/2009/03/debugger-visualizer-for-visual-studio.html –

1

yFiles tiene implementaciones muy sofisticadas de algoritmos de diseño tanto dirigidos a la fuerza (llamados "Orgánicos") como basados ​​en Sugiyama ("Hierarquicos Llamados"). Ofrecen implementaciones sin visualizador para Java, .net, Silverlight, Flex y Javascript. La API para recuperar las coordenadas está disponible en línea here.

Los algoritmos y su calidad se pueden probar en la aplicación gratuita yEd Graph Editor, aunque las bibliotecas solo están disponibles comercialmente.

+1

una solución un poco costosa, pero muy agradable arquitectura y documentación, además de bibliotecas para varias plataformas ms (incluyendo algunos HTML5 ahora) –

0

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




     } 

    } 
} 
0

Sólo en caso de que alguien se enfrentará a un problema similar. Existe un GraphX ​​para el proyecto de fuente abierta .NET que incorpora muchos algoritmos de diseño separados del motor de visualización. De modo que puede tomar la biblioteca lógica, realizar cálculos y obtener el paquete de coordenadas para usar en su propia herramienta vis.

https://github.com/panthernet/GraphX