Trovare coordinate di confine da una determinata serie di coordinate di punti?


18

Dato un insieme di coordinate, Come possiamo trovare le coordinate al contorno.
insieme di coordinate <== Figura 1
Date le coordinate nel set sopra, Come posso ottenere le coordinate sul bordo rosso. Il confine è il poligono che è formato dalle coordinate di input per i vertici, in modo tale da massimizzare l'area.

Sto lavorando su un'app che cerca proprietà entro 'x' miglia da una città . Quello che ho è:

  1. Coordinate di tutte le proprietà.
  2. Una serie di coordinate per ogni città (ho una coordinata per ogni zip. E poiché la maggior parte delle città ha più di una zip, ogni città ha una serie di coordinate)

Il motivo per cui sto chiedendo l' area massima è che non mi viene in mente un poligono come quello qui sotto:

poligono storto <== Figura 2

Quello di cui ho bisogno è l' algoritmo per elaborare l'insieme di coordinate per il confine. Un algoritmo che mi permetterà di trovare coordinate al contorno per la Figura 1 .



4
No, non duplicato, questo è lo scafo convesso, non concavo
Nicklas Avén

1
Sei alla ricerca di codice, riferimenti teorici o soluzioni in specifici ambienti software esistenti?
WolfOdrade,

1
@Khaja No, non vuoi massimizzare l'area, vuoi minimizzarla tra tutti i poligoni convessi contenenti i punti. (L'unico modo per massimizzare l'area è usare il mondo intero come poligono contenente.)
whuber

1
@whuber Sì, ora capisco cosa vuoi dire, voglio un poligono convesso con l'area minima. Il mio obiettivo finale è fare una ricerca di prossimità. Il modo in cui vogliamo che funzioni la nostra ricerca di prossimità è: in una data città (scafo convesso), se cerchiamo case (ogni casa ha una coordinata) entro miglia "x", dovrebbe darmi tutte le case che sono all'interno del scafo convesso o sono a una distanza ortogonale inferiore a "x" miglia
Khaja Minhajuddin

Risposte:


21

Esistono molti algoritmi per risolvere questo problema ( Wikipedia "Convex_hull_algorithms" ):

  • Confezione regalo aka Jarvis march - O (nh): uno degli algoritmi più semplici. Ha complessità temporale O (nh), dove n è il numero di punti nell'insieme e h è il numero di punti nello scafo. Nel peggiore dei casi la complessità è O (n2).
  • Graham scan - O (n log n): algoritmo leggermente più sofisticato, ma molto più efficiente. Se i punti sono già ordinati in base a una delle coordinate o dall'angolo a un vettore fisso, l'algoritmo impiega O (n) tempo. [ pseudo codice ]
  • QuickHull: come l'algoritmo quicksort, ha la complessità temporale prevista di O (n log n), ma può degenerare in O (nh) = O (n2) nel peggiore dei casi. [ descrizione illustrata ]
  • Dividi e conquista - O (n log n): questo algoritmo è applicabile anche al caso tridimensionale.
  • Catena monotona - O (n log n): una variante della scansione di Graham che ordina i punti lessicograficamente in base alle loro coordinate. Quando l'input è già ordinato, l'algoritmo impiega O (n) tempo.
  • Algoritmo di scafo convesso incrementale - O (n log n)
  • Matrimonio prima della conquista - O (n log h): algoritmo sensibile all'output ottimale.
  • Algoritmo di Chan - O (n log h): algoritmo più sensibile all'output ottimale più semplice.

Grazie per aver elencato questi @underdark ... quale scegli?
Marin,



3

Quello che vuoi è lo scafo convesso. In PostGIS c'è una funzione (in realtà GEOS) che ti dà lo scafo convesso, ST_ConvexHull (geometria) .

Su Wikipedia ci sono molte informazioni sugli scafi concavi.


1

Se vuoi che un algoritmo faccia questo (piuttosto che pacchetti che possono farlo), penso che dovresti triangolare i dati; o fondamentalmente definire una linea da ciascun punto a ogni altro punto. Quindi, partendo da (diciamo) il punto con il valore Y più alto, traccia un percorso attorno all'esterno seguendo la linea collegata con l'angolo / cuscinetto esterno più piccolo.

Saresti in grado di accelerare la traccia eliminando prima le linee intersecanti. Il confine esterno non avrà incroci.

btw - FME lo farà anche con i trasformatori ConvexHullAccumulator o ConvexHullReplacer!


1

Se sei interessato a guardare un algoritmo esistente implementato nel codice, NetTopologySuite ha un algoritmo per farlo

Vedi ConvexHull.cs

Per inciso, NTS e un sacco di altre librerie sono racchiuse in un bel progetto chiamato DotSpatial, che si trova qui

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.