Come posso verificare se un cerchio e un poligono concavo si intersecano?


19

Ho un poligono (a volte convesso, ma spesso concavo) e un mucchio di cerchi con raggi diversi. Come posso sapere se un cerchio si interseca / si sovrappone al poligono?

Potrei dividere il mio poligono concavo in pezzi convessi. Sarebbe d'aiuto?

Risposte:


26

ci sono due casi di questo problema. Il primo è l'intersezione e il secondo che si sovrappone (contenente).

Primo (intersezione / poligono all'interno del cerchio):

Trova il punto più vicino su ogni bordo del poligono rispetto al centro del cerchio. Se la distanza tra il punto più vicino al centro è inferiore al raggio, si ottiene l'intersezione o la sovrapposizione.

Secondo (il cerchio è intero in poligono): scatta un raggio dal centro del cerchio a destra (o sinistra / su / giù) e conta le intersezioni raggio / segmento (bordi poligonali). Se il conteggio delle intersezioni è pari, il cerchio è esterno al poligono. Se il suo strano cerchio è dentro.

Condividerò picter dalla lezione per questo caso:

inserisci qui la descrizione dell'immagine

E prenditi cura dei casi singolari.

Spero che questo possa aiutare.


modifica: penso che sia giusto aggiungere crediti all'immagine. L'autore è Petr Felkel, assistente professore all'Università tecnica ceca di Praga


Non penso che funzionerà semplicemente "sparando" un raggio a destra. Forse ho letto male il tuo approccio, ma da quello che ho capito fallirebbe con una configurazione come illustrato qui: imgur.com/Whg2u
bummzack,

2
Sì, ma questo è descritto nel primo caso. Il raggio di tiro risolverà solo il cerchio contenente il poligono (secondo caso nella mia descrizione). Devi testare entrambi i casi. È veloce, facile da implementare e non necessita di memoria.
Notabene,

1
Mi dispiace di aver confuso "edge" con "vertice" e quindi ho interpretato male il tuo primo controllo. Quando la legge correttamente, funziona :)
bummzack,

7

Il primo passo, come indovini, è quello di dividere il poligono concavo in più convessi. La ragione di ciò è che userai il teorema dell'asse di separazione , che funziona solo su poligoni convessi.

SAT di per sé funziona solo su due poligoni convessi. L '"asse di separazione" nel nome si riferisce agli assi perpendicolari ai bordi del poligono. Le cerchie, sfortunatamente, ne hanno un numero infinito. Tuttavia, si scopre che esiste un modo abbastanza semplice per scoprire quali di questi assi sono rilevanti, osservando ciò che si proietta verso l'esterno per intersecare i vertici del poligono.

Invece di esaminare l'intero algoritmo qui, il software Metanet (creatori di N / N +) ha un buon tutorial sul rilevamento delle collisioni usando SAT , la terza sezione della quale copre SAT quando uno degli oggetti è un cerchio .


Hai un riferimento per dividere un poligono concavo in poligoni convessi? Il link SAT che hai fornito non menziona nulla del genere.
ehsanul,

Questo è in realtà un problema molto complesso a seconda della geometria del poligono, ma tutti i motori 3D lo fanno, poiché l'hardware in genere può rendere solo quadranti e triangoli complanari, non poligoni.
SplinterReality,

1
@ehsanul: en.wikipedia.org/wiki/Polygon_triangulation descrive un paio di approcci popolari.

0

Ecco cosa faccio.

  1. Utilizzare il test della linea orizzontale per rilevare se il centro del cerchio si trova all'interno del poligono. Se lo è, allora si intersecano.
  2. In caso contrario, verificare il seguente caso. Per ogni lato del poligono
    1. Trova la pendenza del lato poligonale
    2. Calcola la pendenza perpendicolare
    3. (LEGGERE ATTENTAMENTE QUESTO) Trova l'intersezione tra una linea con la pendenza del lato del poligono che si interseca con uno dei vertici che rende il lato e la linea della pendenza perpendicolare a quella del lato che interseca il centro del cerchio.
    4. Se il punto di intersezione stabilito si trova all'interno del cerchio, ciò significa che il cerchio ad un certo punto attraversa il lato in questione e quindi interseca il poligono
  3. Infine, se nient'altro è conclusivo, controlla se vi sono vertici del poligono all'interno del cerchio (a causa di test precedenti, devi solo verificare una volta). In tal caso, si intersecano. Altrimenti, puoi dire in definitiva che non lo fanno.
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.