2011-11-27 25 views
11

Ho bisogno di disegnare un albero della struttura aziendale (simile a un albero genealogico) in C#. Tutto il codice ancillare è lì. È colorato, interattivo e di fantasia. L'unico problema è l'algoritmo che in realtà decide dove mettere ogni nodo mi sta dando un sacco di dolore.Algoritmo per disegnare alberi in modo efficiente?

Per il momento, le scatole hanno dimensioni 100 x 50 e ho una classe chiamata StaffNode che rappresenta un membro dello staff in una particolare coordinata x, y.

L'algoritmo deve solo creare un List<StaffNode> con l'appropriato xe y di.

Questo è incredibilmente difficile.

In sostanza l'algoritmo ricorsivo è lungo la struttura aziendale, in modo da sinistra> destra, poi top-> verso il basso lungo l'albero. Ovviamente è male se due nodi sono uno sopra l'altro.

mi viene in mente un paio di algoritmi che potrebbero produrre qualcosa di simile:

  * 
    o   O 
o o o o o  O 
o   O O O O O 
       O 

Mentre qualcosa come questo sarebbe meglio, dal momento che l'albero è molto grande e lo spazio è molto limitato:

 * 
    o  O 
o o o o o O 
o  O O O O O 
      O 

Qualcuno di voi ha dovuto disegnare un albero come questo prima? Se sei sicuro di aver incontrato i tanti ostacoli che ho. Qualche consiglio? Finora ho passato un'intera giornata.

+0

cosa stai cercando di fare? Non dovrebbe essere fatto in Microsoft Visio o qualcosa ?? – DrStrangeLove

+0

Prendere un po 'di solutore Tetris ... – Dialecticus

+0

@DrStrangeLove No, sto scrivendo una visualizzazione interattiva. – user1002358

risposta

12

Ci sono molti buoni algoritmi per disegnare alberi, ognuno dei quali mostra alcune proprietà diverse degli alberi. Se vuoi mostrare una gerarchia, c'è this code for WPF that draws hierarchies. Per una discussione più generale su come disegnare grafici e alberi, considerando l'aspetto di these lecture slides dettaglio di tali algoritmi. C'è anche these excellent slides che copre materiale simile.

Spero che questo aiuti!

+2

Questo è assolutamente perfetto! Proprio quello di cui avevo bisogno.Utilizza l'algoritmo Reingold-Tilford. – user1002358

+1

@ user1002358 Grazie per questo commento. Ho avuto difficoltà a comprendere l'algoritmo dalla risposta elencata qui, tuttavia, utilizzando Googling "l'algoritmo di Reingold-Tilford" mi ha portato a [questa domanda] (http://stackoverflow.com/q/13128750/302677), che ho trovato più utile. Ho anche riassunto i passaggi per la codifica dell'algoritmo [qui] (http://rachel53461.wordpress.com/2014/04/20/algorithm-for-drawing-trees/) nel caso in cui qualcun altro stia cercando una spiegazione semplice – Rachel

1

È possibile utilizzare un approccio iterativo. Disporre l'albero usando qualcosa come il primo esempio che hai usato sopra. Quindi spostare nodi o sottostrutture più vicini tra loro, assicurandosi che non vi siano violazioni di vincoli (ad esempio: i nodi non possono sovrapporsi, i nodi figlio devono essere al di sotto dei nodi parentali).

Pro:

  • semplice algoritmo.
  • Ottiene una soluzione sufficientemente buona.
  • Può essere applicato in modo continuo a un albero che cambia.
  • Può essere fatto per sembrare freddo.

Contro:

  • possono avere bisogno di molte iterazioni a guardare bene.
  • non può trovare soluzione ottimale (viene catturato in un massimo locale)
+0

può fare qualcosa di simile in una singola iterazione. –

+0

Concordato, ma a volte un approccio di ottimizzazione iterativo può essere utile se un algoritmo a passaggio singolo è computazionalmente non fattibile per un numero elevato di nodi. – geofftnz

Problemi correlati