Cos'è un buon algoritmo per tracciare attorno al bordo di una polilinea 2D

1

Se ho una polilinea composta da un numero qualsiasi di vertici, che cos'è un algoritmo efficiente per tracciare attorno al confine di questa polilinea?

Ci sono 4 situazioni da considerare:

  1. La polilinea non si interseca e non ha bordi colineari.
  2. La polilinea non si interseca ma ha un ciclo interno o esterno.
  3. La polilinea ha auto intersezioni a forma di cravatta a farfalla.
  4. La polilinea ha intersezioni automatiche che formano anelli interni.

Un esempio di ciascuno (tutti sono chiusi):

  1. Lista vertici = (5,3) (10,3) (10,7) (5,7)
  2. Lista vertici = (0,0) (3,0) (3,3) (1,3) (1,2) (2,2) (2,3) (0,3)
  3. Lista vertici = (5,3) (10,7) (10,3) (5,7)
  4. Lista vertici = (0,0) (3,0) (3,4) (1,4) (1,2) (2,2) (2,3) (0,3)

Visivamente:

Inquestocasounalgoritmodihullingconvessoinrealtànonèappropriato,perchédesideropreservarequalsiasiconcavitànellaforma.

Risultati:

Perchiarire,laformadelpapillonnondeveesserescavalcata,eunsemplicecalcolodell'areadovrebbeprodurreun'areaperquestaforma(cioèiduetriangolifinisconologicamenteavvoltinellastessadirezione).

Non solo questo algoritmo deve funzionare (che è la prima priorità) dovrebbe essere abbastanza veloce da essere eseguito su centinaia di migliaia di polilinee in pochi secondi.

Inoltre, l'algoritmo deve essere in grado di gestire qualsiasi combinazione dei quattro casi.

    
posta Stephen 23.04.2014 - 05:40
fonte

1 risposta

3

Ecco un abbozzo di un algoritmo che probabilmente potrebbe risolvere il tuo problema:

  1. dissolve il poligono in linee non intersecanti, formando un grafico planare

  2. una volta ottenuto il grafico planare, costruisci lo scafo esterno adattando l'algoritmo classico confezione regalo a questo grafico

Il passaggio 1 potrebbe essere implementato in modo semplice, ma non molto efficace, effettuando un test di intersezione per ogni coppia di spigoli (dando un tempo di esecuzione di O (# spigoli²)). Un'implementazione più sofisticata potrebbe utilizzare un approccio linea di scorrimento . Devi stare attento a spostare la tua linea di scorrimento non solo verso le coordinate dei vertici esistenti, ma anche a curare i punti di intersezione, le linee parallele, ecc. E dividere le linee esistenti di conseguenza. Dopo questo passaggio, non dovrebbero più esserci linee di attraversamento o sovrapposizione.

Il passaggio 2 è una semplice modifica del classico algoritmo "convesso scafo": inizia con una vertice esterna del tuo grafico, passa da una vertice alla successiva vertice adiacente selezionando il bordo di connessione con "l'angolo più piccolo". Assicurati che il passaggio 1 ti trasmetta il grafico planare in una struttura dati che ti consenta di selezionare tutti gli spigoli collegati a un dato vertice molto rapidamente.

Spero che questo aiuti.

    
risposta data 23.04.2014 - 08:12
fonte

Leggi altre domande sui tag