Optymalizacja układu graficznego w C#

Mam listę obiektów, które muszę uporządkować jako estetyczny Wykres. Moje obecne podejście obejmuje IronPython i algorytm genetyczny, ale to trwa zbyt długo.

Czytałem na Graphviz, QuickGraph i Graph#, ale nie potrzebuję części wizualizacji - Mam już aplikację, która wyświetli węzły podane współrzędne x / y. Powiedziano mi, że zarówno algorytm Sugiyama, jak i rodzina algorytmów opartych na sile mają tendencję do generowania przyjemnych Wykresów, ale nie mogę wydaje się, że znajdujemy bibliotekę. NET, która wyświetli współrzędne zamiast obrazu bez dość poważnego hakowania kodu źródłowego.

Czy ktoś może polecić biblioteki, algorytmy itp.?

Author: polygenelubricants, 2009-08-09

6 answers

Istnieje wiele opcji, z różnymi zaletami i wadami - możesz przejrzeć Ten, który jest listą programów, które robią mniej więcej to, czego szukasz.

Kiedyś tak było, że znalezienie rozwiązania open source było trudne, ale kiedyś licencjonowany komercyjnie MSAGL Teraz wydaje się być open source.

Rozróżnienie pomiędzy grafem# i QuickGraph polega na tym, że ten ostatni zapewnia Graf i manipulacja prymitywy, ale nie zapewnia żadnych algorytmów układu. Graph# ma wszystkie dostępne źródła i z tego ,co (krótko) przyjrzałem się, ma schludny rozdział między silnikiem układu i implementacją rysowania.

Graphviz jest napisany w czystym C / C++ i jest dość monolityczny, biorąc jako wejście plik tekstowy opisujący wykres i wytwarzający różne typy danych wyjściowych, zarówno wektorowych, jak i rastrowych. Nie jest to idealne rozwiązanie jako plug-in layout engine, ale może być używany przez ostrzał wyjście i dostarczenie wymaganego pliku wejściowego oraz parsowanie wyjścia. Niezbyt czyste rozwiązanie.

Jest też coś o nazwie OGDF . Chociaż jest napisany w całości w C++, został zaprojektowany do użycia jako biblioteka silnika układu i ma dobrze zorganizowany interfejs do tego. Obsługuje różne algorytmy układu, w tym zoptymalizowaną Sugiyamę, jeśli to Cię interesuje.

Jeśli jesteś zainteresowany zaimplementowaniem zoptymalizowanej wariacji na temat Sugiyamy, możesz zawsze można wywalić własny używając zgrabnego opisu algorytmu :)

Ostatecznie jednak powinieneś zdecydować, jakiego typu layoutu szukasz, zanim podejmiesz decyzję o bibliotece.

 22
Author: Eric Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-04 03:48:27

Microsoft Research ma zautomatyzowany silnik układu graficznego, który może pomóc w tym wysiłku.

Możesz przeczytać więcej na ten temat tutaj:

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

 3
Author: Michael A. McCloskey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-08 23:16:52

Yfiles ma bardzo wyrafinowane implementacje zarówno kierowanych siłą (zwanych "organicznymi"), jak i opartych na Sugiyamie (zwanych hierarchicznymi) algorytmów układu. Oferują bez przeglądarek implementacje dla Java,. NET, Silverlight, Flex i Javascript. API do pobierania współrzędnych jest dostępne online Tutaj .

Algorytmy i ich jakość można przetestować w darmowej aplikacji yEd Graph Editor, biblioteki są jednak dostępne tylko komercyjnie.

 1
Author: Sebastian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-18 07:36:06

Na wypadek, gdyby ktoś napotkał podobny problem. Istnieje GraphX dla. NET open-source projektu, który zawiera wiele algorytmów układu oddzielone od silnika wizualizacji. Możesz więc po prostu wziąć bibliotekę logiczną, wykonać obliczenia i uzyskać pakiet współrzędnych do użycia we własnym narzędziu vis.

Https://github.com/panthernet/GraphX

 1
Author: Alexander Smirnov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-16 15:26:14

Jest implementacja układu Sugiyama w Javie jako część systemu modsl, Licencja Apache. źródło jest tutaj .

Udało mi się przekonwertować ją w miarę łatwo na mieszaną implementację Objective-C/Objective-C++ opartą na digrafie.

 0
Author: damian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-14 18:17:24

Dostałem współrzędne węzłów w ten sposób

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
Author: user2806419,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-23 08:36:55