Come creare una mappa dal grafico


7

Voglio disegnare una mappa poligonale 2d basata sui dati forniti da un'altra fonte per facilitare l'analisi delle azioni sulla mappa. I dati hanno il seguente formato:

1 ['2', '4', '5', '7', '17', '10']
2 ['1', '3', '4']
3 ['2', '11', '4']
4 ['1', '2', '3', '11', '13', '18', '5']
5 ['1', '4', '18', '17']
6 ['7', '8']
...

Il primo numero è l'ID di un nodo, il seguente elenco contiene gli ID dei suoi vicini. Poiché il numero di vicini di un nodo differisce, devo disegnare una mappa poligonale.

Quindi ho provato a usare i poligoni Voronoi per la rappresentazione della mappa. Il problema è: come posso determinare i punti per soddisfare tutte le relazioni di vicinato? Immagino che il mio primo tentativo sia più o meno un errore nel mio ciclo di prova ed errore. Ho usato lo strumento sfdp di graphviz per ottenere le posizioni dei punti del grafico:

rappresentazione grafica di esempio usando sfdp

L'uso delle posizioni dei punti ha comportato la seguente rappresentazione della mappa:

mappa di esempio usando il diagramma voronoi

Il problema di questo approccio è che ad esempio i nodi 4 e 1 sono vicini ma nel diagramma Voronoi non sono dovuti alla posizione dei nodi. Quindi per me questo approccio è fallito.

Cercando su Google, ho trovato molti tutorial che generano mappe con poligoni o tessere, ma non ho ancora scoperto come posso creare una mappa per i miei dati. Immagino che ci sia un approccio che utilizza (più) esagoni / triangoli / quadrati o una miscela per ottenere ciò di cui ho bisogno, ma non so cosa cercherò.

C'è una parola chiave o un algoritmo che mi può aiutare qui?

Aggiornamento / risultato : per completezza: questo è il mio risultato dopo aver utilizzato i suggerimenti della risposta accettata: risultato


Dai dati forniti, è possibile creare più mappe, in particolare con i punti 12 e 9 che hanno solo 1 relazione. Questo è un problema particolare?
lewisjb,

@Pyro: no, questo non è un problema. È appena usato per l'analisi.
Maggie,

troverai l'algoritmo per questo duplice problema elencato come triangolazione di Delaunay e diagrammi di Voronoi.
tinyfiledialogs,

Risposte:


12

Quello che vuoi è produrre un doppio grafico ; vale a dire, un grafico prodotto convertendo le facce in vertici e collegandole in base alle facce adiacenti nel grafico originale. Esempio:

doppio grafico

Il problema, come puoi vedere, è che se vuoi mantenere lo stesso layout del grafico, otterrai due bordi davvero sinuosi nel doppio grafico. Inoltre, ti ritroverai spesso con una multigrafo , un grafico in cui alcuni vertici hanno bordi multipli tra di loro. Tuttavia, è garantito per essere planare, quindi è qualcosa.

Per usare il tuo esempio, possiamo produrre il doppio grafico nei seguenti passaggi:

Passaggio 1: per ogni faccia nel grafico originale, creare un vertice

centroidi e anello esterno

Si noti che creiamo un "anello" esterno per rappresentare il "vertice" più esterno - questo è così possiamo avere un grafico più bello alla fine, senza i bordi curvi pazzi.

Passaggio 2: per ciascun bordo nel grafico originale, collegare i due vertici della faccia con un bordo

Inoltre, dovrai fare qualcosa per evitare che questi bordi si sovrappongano. Il divario tra 3 e 12 è particolarmente problematico. Potrebbe essere necessario che questi nuovi bordi siano piegati per renderlo possibile. È quello che ottieni per avere un grafico concavo.

bordi

Passaggio 3: giocare a rischio

grafico colorato


Grazie per il suggerimento. Ho iniziato un approccio simile prima della mia cosa voronoi ma non l'ho portato alla fine. Lo farò e poi pubblicherò i miei risultati.
Maggie,

Questo è interessante, inoltre, se ti aiuta, prova a cercare alcune informazioni sulla dualità voronoi-delaunay. Questo è un buon inizio per capirlo almeno: scicomp.stackexchange.com/questions/771/…
Gustavo Maciel,

1
Un'ulteriore domanda: quale approccio useresti se non avessi l'aiuto di sfdp? Esiste un approccio generale per creare una rappresentazione grafica adatta per ottenere le posizioni dei nodi necessarie?
Maggie,

@maggie vorrai qualcosa che esegua layout grafici planari . Non è un problema banale e non posso raccomandare un pacchetto specifico, ma ci sono opzioni qui e qui .
congusbongus,

1

Se la prima immagine, in cui ogni punto è un quadratino di un certo colore, è ciò che stai cercando, devi costruire la triangolazione del Delaunay.


1
Questo potrebbe usare un po 'più di contenuto per rendere la risposta un po' più concisa.
Tom 'Blue' Piddock,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.