2012-10-24 6 views
5

In einem System habe ich eine Liste von Knoten, die wie in einem normalen Diagramm verbunden sind. Wir kennen das gesamte System und alle ihre Verbindungen und haben auch einen Startpunkt. Alle meine Kanten haben eine Richtung.Zeichnen Sie ein Diagramm aus einer Liste von verbundenen Knoten

Jetzt möchte ich alle diese Knoten und Kanten automatisch zeichnen. Das Problem ist nicht die eigentliche Zeichnung, sondern die Berechnung der Koordinaten (x, y). Also im Grunde möchte ich diesen ganzen Graphen so zeichnen, dass er gut aussieht.

Meine Datenstruktur wäre so etwas wie:

class node: 
string text 
List<edge> connections 

Es muss für dieses Problem einige bekannte Algorithmen sein? Ich konnte keine finden, aber möglicherweise verwende ich die falschen Schlüsselwörter.

Meine Gedanken:

Eine Möglichkeit, unsere startnode bei (0,0) zu positionieren wäre, und dann eine Konstante hat, die „Entfernung“ ist. Dann würde es für jeden Nachbarn die Entfernung zu der y-Position hinzufügen, und für jeden Knoten, der ein Nachbar ist, setze x = Abstand * n.

Aber das wird wirklich eine Menge Probleme geben - das ist definitiv nicht der Weg zu gehen.

Antwort

9

Bei weitem der am weitesten verbreitete Ansatz dafür ist eine force-directed layout anstelle einer deterministischen zu verwenden. Der Kernpunkt ist, dass jeder Knoten sich abstoßen muss (Antigravitation) und sich alle miteinander verbundenen Knotenpaare anziehen. Nach mehreren Iterationen einer Physiksimulation erhalten Sie ein vernünftiges Layout.

Es gibt viele Layout-Algorithmen, die Sie verwenden können, mit sehr unterschiedlichen Ergebnissen. Die Algorithmen fdp (Fruchterman & Reingold '91) und neato (Kamada & Kawai '89) funktionieren, sind aber ziemlich alt und es gibt viel bessere Alternativen. Der Fruchterman & Reingold '91 Algorithmus ist auch in Python in NetworkX verfügbar.

Prefuse bietet eine ForceDirectedLayout Java class das ist ziemlich schnell und gut. Hachul & Jünger '05 Detail der FM^3-Algorithmus, der in der Praxis recht gut zu tun scheint (Hachul & Jünger '06) und ist in C++ in Tulip verfügbar.

Es gibt Tonnen von anderen Open-Source-Tool Grafiken zu visualisieren, wie NodeXL (C#), ein großes Einführungswerkzeug, das Netzwerkanalyse in Excel 2007/2010 integriert (Disclaimer: Ich bin ein Berater für sie). Andere großartige Werkzeuge sind Gephi (Java) und Cytoscape (Java), während Pajek, UCINet, yEd und Tom Sawyer einige proprietäre Alternativen sind.

2

Im Allgemeinen ist dies ein kniffliges Problem, besonders wenn Sie mit Edge-Routing beginnen und die Dinge schön aussehen lassen wollen. Sie können sich http://www.graphviz.org/ ansehen und entweder ihre Befehlszeilentools verwenden oder die graphviz-Bibliothek verwenden, um Ihr Layout zu erstellen und Ihre x, y-Koordinaten in Ihrer Anwendung abzurufen.