|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2001
Messaggi: 181
|
Punto apparteente ad un poligono
Salve a tutti,
sto implementando un prodotto scritto in c++ e mi servirebbe conoscere l'appartenenza di un punto ad un poligono. Mi spiego meglio: dato un poligono P2D e dato un punto Pnto di coordinate (X,Y) mi interessa conoscere se tale punto cade nel poligono. Sono riuscito a farlo solo per i poligoni convessi (ogni angolo interno è < 180 gradi), ma proprio non riesco per quelli concavi.(http://www.itportal.it/developer/vb/...ni/default.asp) Qualcuno saprebbe aiutarmi? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
ciao, mi sono trovato ad affrontare lo stesso problema, ma ci ho solo pensato, niente implementazioni... l'idea è di tipo brute-force, quindi non so quanto sia efficiente. Però ogni lato del poligono induce una disequazione del tipo ax + by + c >= 0 (oppure <=), dove l'uguale lo metti solo se la frontiera del poligono fa parte del poligono stesso. il segno della disuguaglianza dipende dal particolare lato (credo). ora, per vedere se un punto qualsiasi appartiene al poligono, le sue coordinate devono verificare TUTTE le disuguaglianze indotte dai lati del poligono.
spero di esserti stato utile. mad_hhatter |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Sep 2001
Messaggi: 181
|
Scusami ma non mi è chiaro, forse avro posto male il problema.
Allora, semplifichiamo le cose e pensiamo ad un quadrato ABCD, dove: A(0,0), B(5,0), C(5,5), D(0,5) e prendiamo in cosiderazione il pnto E(3,3) che appartiene al poligono e il punto F(6,6) che non appartiene. Come applicheresti il tuo algoritmo? P.S. Stiamo parlando di poligoni di 50 punti e non di 4. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
supponi di avere una rappresentazione ordinata dei vertici del poligono, in modo che se la lista è A,B,C,D allora percorrendo i punti in tale ordine percorro il poligono in senso orario o antiorario (è indifferente). Se invece hai solo un elenco disordinato la cosa si fa problematica. Cmq, posto di avere tale ordinamento, puoi prendere i punti a 2 a 2 e ottenere l'equazione della retta di ciascun lato. ora una retta ha equazione ax+by+c = 0. se tu prendi la diseguaglianza ax+by +c >= 0 descrivi il semipiano generato dalla retta ax+by+c=0. Ora, l'intersezione dei semipiani associati a tutti i lati dà la porzione di spazio che definisce il poligono stesso. l'unica cosa è che bisogna vedere come definire il segno della disuguaglianza per considerare il semipiano giusto.
scrivendo le disuguaglianze per tutti i lati ottieni un sistema di N disuguaglianze. se un punto le verifica tutte, allora sei certo che cadenel poligono. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
no, lascia perdere tutto, con i poligoni concavi non funziona!!! sono un idiota, mi dispiace.
perchè allora non suddividere un poligono concavo in sottopoligoni convessi(al peggio triangoli) e verificare se il punto appartiene a uno di essi? in questo modo puoi sfruttare l'algoritmo che hai già perchè lavoreresti con poligoni convessi |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
FruGOOGLa per "Jordan Curve Theorem". Dato un punto crei un raggio in una direzione arbitraria e conti il numero di intersezioni tra quel raggio e i lati del poligono. Se il totale è dispari, il punto si trova nel poligono. Se è pari, il punto è fuori dal poligono.
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
geniale, sei un mito
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Ma che geniale, io non so manco perchè funziona
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
beh funziona perchè un poligono è una linea chiusa e se parti dall'esterno, ogni volta che fai un attraversamento in uscita devi per forza averne fatto uno in entrata, mentre se parti dall'interno hai un attraversamento in uscita più 0 o più coppie di attraversamenti uscita-entrata, uno per ciascuna concavità che incontri...
è un metodo geniale nella sua semplicità |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Xò se il raggio creato è tangente al poligono non funziona
|
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Sep 2001
Messaggi: 181
|
Quote:
Per adesso è cosi' che l'ho implementato, aggiungendo dei controlli in +, ma computazionalmente non è leggero. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
beh, quel metodo credo non possa essere alleggerito piu di tanto: tu cerchi le intersezioni con TUTTI i lati del poligono?
perche' se interseca in un vertice non funziona? |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Non funziona se il raggio è tangente al poligono in qualche suo punto perchè invece di contare 1 x l'entrata e 1 x l'uscita conta solo 1
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Credo che sia sufficiente prendere come raggio la distanza fra il punto ed il vertice più lontano aumentata di uno
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 1377
|
Ricerca operativa.. che incubo di esame è stato per noi
Se vi vedete per ripassare, chiamatemi! |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
il fatto e', cmq, che per qualsiasi vertice io possa prendere mi viene in mente un controesempio: una forma particolare del poligono per cui l'algoritmo PUO' fallire... forse bisognerebbe provare piu' vertici... oppure prendere 2 vertici consecutivi e prendere il raggio passante per un punto appartenente al lato da essi individuato. e se per caso tale lato risulta parallelo al raggio (nel caso in cui i 2 punti siano allineati con il punto da testare), cambio uno dei due vertici |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:45.



















