2012-10-24 16 views
5

In un sistema I Ho un elenco di nodi che sono collegati come in un grafico normale. Conosciamo l'intero sistema e tutte le loro connessioni e abbiamo anche un punto di partenza. Tutti i miei bordi hanno una direzione.Disegna un grafico da un elenco di nodi connessi

Ora voglio disegnare tutti questi nodi e bordi automaticamente. Il problema non è il disegno reale, ma il calcolo delle coordinate (x, y). Quindi fondamentalmente mi piacerebbe disegnare tutto questo grafico in modo che appaia bene.

mio datastructure sarebbe qualcosa di simile:

class node: 
string text 
List<edge> connections 

ci deve essere qualche algoritmi ben noti per questo problema? Non sono stato in grado di trovarne, ma potrei usare le parole chiave sbagliate.

I miei pensieri:

Un modo sarebbe quello di posizionare il nostro startNode (0,0), e poi avere una costante che è "distanza". Quindi per ogni vicino, aggiungerebbe la distanza alla posizione y, e per ogni nodo che è un vicino, imposta x = distanza * n.

Ma questo darà davvero molti problemi, quindi non è assolutamente la strada da percorrere.

risposta

9

L'approccio di gran lunga più comune è quello di utilizzare uno force-directed layout anziché uno deterministico. L'essenziale è che tutti i nodi si respingono a vicenda (anti-gravità) e che eventuali coppie di nodi collegati si attraggono a vicenda. Dopo diverse iterazioni di una simulazione fisica è possibile ottenere un layout ragionevole.

Ci sono molti algoritmi di layout che è possibile utilizzare, con risultati molto diversi. Gli algoritmi GraphViz fdp (Fruchterman & Reingold '91) e neato (Kamada & Kawai '89) funzionano, ma sono piuttosto vecchi e ci sono alternative molto migliori. L'algoritmo Fruchterman & Reingold '91 è anche disponibile in Python in NetworkX.

Prefuse fornisce un ForceDirectedLayout Java class che è abbastanza veloce e buono. Hachul & Jünger '05 dettaglio l'algoritmo FM^3, che sembra fare abbastanza bene nella pratica (Hachul & Jünger '06) ed è disponibile in C++ in Tulip.

ci sono tonnellate di altri strumenti open source di visualizzare i grafici, come NodeXL (C#), un grande strumento introduttivo che integra l'analisi della rete in Excel 2007/2010 (Disclaimer: io sono un consulente per esso). Altri fantastici strumenti includono Gephi (Java) e Cytoscape (Java), mentre Pajek, UCINet, yEd e Tom Sawyer sono alcune alternative proprietarie.

2

In generale, questo è un problema complesso, soprattutto se si desidera iniziare a gestire il routing del bordo e rendere le cose più belle. Potresti guardare a http://www.graphviz.org/ e usare i loro strumenti da riga di comando, o usare la libreria graphviz per fare il tuo layout e ottenere le coordinate x, y all'interno dell'applicazione.

Problemi correlati