2012-10-24 11 views
5

W systemie Mam listę węzłów, które są połączone jak na normalnym wykresie. Znamy cały system i wszystkie ich połączenia, a także mamy punkt wyjścia. Wszystkie moje krawędzie mają kierunek.Narysuj wykres z listy połączonych węzłów.

Teraz chcę automatycznie narysować wszystkie te węzły i krawędzie. Problem nie polega na rzeczywistym rysunku, ale na obliczeniu współrzędnych (x, y). Więc zasadniczo chciałbym narysować cały wykres, żeby wyglądał dobrze.

Moja datastructure byłoby coś takiego:

class node: 
string text 
List<edge> connections 

musi istnieć dobrze znanych algorytmów dla tego problemu? Nie udało mi się znaleźć żadnego, ale mógłbym użyć niewłaściwych słów kluczowych.

Myślami:

Jednym ze sposobów byłoby pozycjonować naszą startNode na (0,0), a następnie mieć jakiś stały, który jest „odległość”. Następnie dla każdego sąsiada doda odległość do pozycji y, a dla każdego węzła będącego sąsiadem ustaw x = odległość * n.

Ale to naprawdę przyniesie wiele problemów - więc to zdecydowanie nie jest droga.

Odpowiedz

9

Zdecydowanie najczęstszym podejściem do tego jest użycie force-directed layout zamiast deterministycznego. Istotą jest to, że każdy węzeł odpycha się nawzajem (antygrawitacja), a wszystkie połączone pary węzłów przyciągają się nawzajem. Po kilku iteracjach symulacji fizyki można uzyskać rozsądny układ.

Istnieje wiele algorytmów układu, z których można korzystać, z bardzo różnymi wynikami. Algorytmy GraphViz fdp (Fruchterman & Reingold '91) i neato (Kamada & Kawai '89) działają, ale są raczej stare i istnieją o wiele lepsze alternatywy. Algorytm Fruchterman & Reingold '91 jest również dostępny w języku Python pod numerem NetworkX.

Prefuse zapewnia ForceDirectedLayout Java class, który jest dość szybki i dobry. Hachul & Jünger '05 szczegółowo algorytmu FM^3, który wydaje się całkiem dobrze w praktyce (Hachul & Jünger '06) i jest dostępny w C++ w Tulip.

Istnieje mnóstwo innych narzędzi open source wizualizować wykresy, jak NodeXL (C#), to doskonałe narzędzie wprowadzające który integruje analizy sieci do programu Excel 2007/2010 (Disclaimer: Jestem doradcą dla niego). Inne niesamowite narzędzia to: Gephi (Java) i Cytoscape (Java), a Pajek, UCINet, yEd i Tom Sawyer to niektóre zastrzeżone alternatywy.

2

Generalnie jest to trudny problem, szczególnie jeśli chcesz zacząć radzić sobie z rutowaniem krawędzi i sprawiać, że wszystko wygląda ładnie. Możesz spojrzeć na http://www.graphviz.org/ i użyć ich narzędzi wiersza poleceń lub biblioteki graphviz, aby wykonać układ i uzyskać współrzędne xiy w aplikacji.

Powiązane problemy