Pergunta

Eu tenho uma lista de objetos que eu preciso para organizar como um gráfico de estética. Minha abordagem atual envolve IronPython e um algoritmo genético, mas isso leva muito tempo.

Eu estive lendo sobre Graphviz, QuickGraph e Gráfico #, mas eu não preciso da parte de visualização - Eu já tenho um aplicativo que irá exibir os nós, dadas as coordenadas X / Y. Eu tenho dito que tanto o algoritmo Sugiyama e da família baseada em força de algoritmos tendem a gráficos agradar saída, mas eu não consigo encontrar uma biblioteca .NET que o produto será as coordenadas em vez da imagem sem algum código fonte severa bastante hacking.

Alguém pode recomendar bibliotecas, algoritmos ou similares?

Foi útil?

Solução

Há uma série de opções, com vários prós e contras - você pode querer vasculhar este que é uma lista de software que faz, mais ou menos, o que você está procurando .

Ela costumava ser o caso que encontrar uma solução de código aberto foi difícil, mas uma vez comercialmente licenciado MSAGL agora parece ser open source .

A distinção entre Graph # e QuickGraph é que este último fornece gráfico de passagem e primitivos de manipulação, mas não fornece quaisquer algoritmos de layout. Gráfico # tem todas as fontes disponíveis, e pelo que eu tenho (brevemente) olhado, tem uma nítida separação entre mecanismo de layout e implementação de desenho.

Graphviz é escrito em puro C / C ++ e é bastante monolítica, tendo como entrada um arquivo de texto descrevendo o gráfico e que produzem vários tipos de saída, tanto vector e raster base. Não é um grande ajuste como um plug-in mecanismo de layout, mas poderia ser usado por descascar para fora e fornecendo o arquivo de entrada necessária e analisando a saída. Não uma solução muito limpos embora.

Há também algo chamado OGDF . Embora seja inteiramente escrito em C ++, ele foi projetado para ser usado como uma biblioteca de mecanismo de layout e tem uma interface bem estruturada para isso. Ele suporta vários algoritmos de layout incluindo Sugiyama otimizado se é isso que você está em interessado.

Se você estiver interessado em implementar uma variação optimizados em Sugiyama, você sempre pode rolar o seu próprio usando um descrição pura do algoritmo :)

Em última análise, porém, você deve, provavelmente, decidir que tipo de layout que você está depois, antes de tomar uma decisão sobre a biblioteca.

Outras dicas

Microsoft Research tem um mecanismo de layout gráfico automatizado que pode ajudá-lo neste esforço.

Você pode ler mais sobre ele aqui:

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

yFiles tem implementações muito sofisticados de ambos (chamado de "orgânico") e com base Sugiyama dirigiu-força ( "Chamados hierárquica ") disposição algoritmos. Eles oferecem implementações espectador menos para Java, .NET, Silverlight, Flex, e Javascript. A API para recuperar as coordenadas está disponível online aqui .

Os algoritmos e sua qualidade pode ser testado no livre yed editor de gráfico , as bibliotecas são apenas comercialmente disponível, no entanto.

Apenas no caso de alguém terá de enfrentar problema semelhante. Há uma GraphX ??for .NET projeto de código aberto que incorpora muitos algoritmos de layout separado do motor de visualização. Então você pode apenas tomar a biblioteca lógica, realizar cálculos e obter as coordenadas embalar a ser usado em seu próprio vis ferramenta.

https://github.com/panthernet/GraphX ??

há uma implementação de layout Sugiyama em Java como parte do sistema modsl, licença Apache. fonte é aqui .

eu era capaz de convertê-lo razoavelmente fácil a um misto Objective-C / Objective-C ++ implementação base em dígrafo.

Eu tinha começado as coordenadas de nós desta maneira

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top