2009-06-23 13 views
5

sto disegnando il profilo altimetrico che mostra l'elevazione guadagno/perdita lungo un sentiero, simile a quello qui sotto:(? Semplice) Label Placement per la Linea Grafici

Sample Elevation Profile with hand-placed labels http://img38.imageshack.us/img38/4079/profilewithgoodlabels.png

Questo è fondamentalmente un grafico lineare con distanza dall'inizio sull'asse x e quota sull'asse y.

Mi piacerebbe fornire etichette di fantasia con altezze a punti in punti interessanti lungo il percorso, come quelli che ho aggiunto a mano all'immagine di esempio. Sto cercando idee sul modo migliore per mettere queste etichette in modo che:

  • Essi non si sovrappongono tra loro
  • Essi non si sovrappongono con il profilo stesso, o almeno questo accade in un modo pulito-looking (sembra che potrebbe essere necessario, nel bel mezzo di una ripida valle, per esempio)
  • non si estendono al di fuori della scatola che limita l'immagine complessiva

per raggiungere questi obiettivi, immagino Posso (almeno):

  • Capovolgere il testo intorno (vedi esempio)
  • Scegliere lunghezze appropriate per i leader
  • Scegli angoli appropriati per i leader (ma riducendo al minimo la variazione potrebbe essere auspicabile per ragioni estetiche)
  • goccia punti quotati per meno importante posti in aree affollate
  • nomi abbreviare in aree affollate (PlaceName s nel mio ambiente già supportano abbreviazione in un modo davvero piacevole, in modo da passare da "South Twin Mountain" a "S Doppia Mtn" è facile)
  • goccia less- importante a nnotations interamente in aree affollate

Ma io non so come meglio strutturare questo algoritmo. Sembra forse un problema di ottimizzazione? (Ridurre al minimo la puzza associata all'annotazione e fornire una penalità numerica per ciascuna delle cose che sto cercando di evitare?) Ma dal momento che ci sono un sacco di variabili discrete da ottimizzare e non mi interessa davvero il "migliore" soluzione (solo una buona, e preferibilmente stabile, una) non sono sicuro di cosa fare.

Come si avvicinano solitamente problemi di questo tipo nella grafica? Programmazione dinamica? Branch e legato? L'idea di ottimizzazione è fuori base? Ci sono delle librerie utili per .NET che potrei voler vedere?

(Non voglio cederlo a una libreria di disegno di grafici generale a titolo definitivo, perché è una caratteristica chiave del prodotto generale e ho in programma altre funzionalità personalizzate che potrebbero essere difficili da bloccare in uno scopo generale libreria di disegno grafico)

+0

Come va? Hai trovato il miglior algoritmo? –

+0

Alla fine ho optato per l'approccio di ricottura simulata (dopo aver lasciato questo progetto da parte per un po '). È stato abbastanza semplice da implementare, funziona piuttosto bene, e parti di esso possono essere riutilizzate per altre cose come l'etichettatura delle mappe e la selezione dei layout di pagina, anche prevedendo quali percorsi attraverso la rete di sentieri potrebbero essere buoni per l'escursione. –

risposta

1

Probabilmente inserirò un'etichetta, quindi inserirò la successiva, verificherò se si sovrappone alla prima e, in caso affermativo, se non funziona, spingerla verso l'alto fino a quando non si sovrappongono più ... come punto di partenza comunque. Forse aggiungere una funzione di costo come distanza dal posizionamento ideale o predefinito (se non ci fossero altre etichette da intromettersi), che deve essere ridotto al minimo. Quindi trova la disposizione delle etichette più economica. Può dare flipping, movimento e rotazione, abbreviazione e lasciar cadere ogni costo diverso.

+0

Questa è una buona idea, ma cosa succede se la prima scelta non è buona e incasina le prossime? Per esempio, cosa succede se la prima scelta da sinistra a destra è quella di posizionare un'etichetta giusta che copre la maggior parte di una valle e rende impossibile posizionare etichette con i leader lunghi che escono dalla valle per i punti che sono giù nella valle? –

+0

Bene, allora il costo complessivo sarebbe più alto perché ogni etichetta successiva dovrebbe essere spostata a una distanza maggiore. Quindi immagino che * potresti * provare ogni possibile ordine di etichette e poi prendere quello più economico ... questo ovviamente è altamente inefficiente, ma forse puoi inventare delle euristiche per minimizzare il numero di possibilità che devono essere esaminate . – mpen

2

Ecco il mio prendere:

  1. Segnare i punti in cui si desidera inserire le etichette
  2. dividerli in gruppi con la distanza di almeno 2*size tra loro
  3. Per ogni gruppo, andare da destra un tentativo di mettere un'etichetta.
  4. Prova a mettere l'etichetta a destra oa sinistra. Vedere che si traduce in minore lunghezza della linea verticale
  5. Se non importa, cercare di mettere a destra
  6. A meno che non è la fine del gruppo, quindi provare a metterlo a sinistra il

Ora vai di nuovo sulle etichette e vedi se qualcuno può essere capovolto da un lato all'altro mentre accorcia la lunghezza delle linee verticali.

Dovrebbe risultare in una produzione decente, secondo me.

1

Questa domanda mi ricorda un progetto grafico che non ho fatto molto tempo fa. Doveva disegnare un grafico matematico (come nei nodi e nei bordi) nel modo più gradevole possibile. Ci sono diversi approcci, ma il mio preferito di gran lunga è stato l'approccio alla fisica. Trattate ciascun nodo come una particella carica che respinge tutti gli altri e ogni spigolo come una molla classica con una lunghezza ideale. Corri qualche centinaio di passaggi temporali e alla fine raggiungi uno stato stabile con un effetto di smorzamento appropriato.

Vedo molti parallelismi con il tuo problema. Le caselle di testo sono i nodi e le linee guida sono i bordi.

Dovrà essere modificato. Per esempio ci dovrebbe essere una forza positiva verso l'alto in modo che non scendano sotto il grafico. Dovresti anche incorporare l'idea di capovolgere il testo a sinistra oa destra. Ma dovrebbe dare un risultato ragionevole sulla maggior parte degli input.

L'articolo a cui ho fatto riferimento per il mio progetto era here.

+0

Un altro buon piano, avevo già sentito parlare di questo approccio ma non mi è mai passato per la testa pensando a questo progetto. Grazie! –