Intersezione circolare con algoritmo Sweep Line


15

Sfortunatamente non sono ancora così forte nel comprendere l' algoritmo Sweep Line . Tutti i documenti e i libri di testo sull'argomento sono già stati letti, tuttavia la comprensione è ancora lontana. Solo per chiarire, provo a risolvere quanti più esercizi possibile. Ma compiti davvero interessanti e importanti sono ancora una sfida per me.

L'esercizio seguente l'ho trovato nelle note di lezione di Line Segment Intersection dell'onnipotente Jeff Erickson.

Esercizio 2. Descrivi e analizza un algoritmo sweepline per determinare, dati cerchi nel piano, se due si intersecano, nel tempo . Ogni cerchio è specificato dal suo centro e dal suo raggio, quindi l'ingresso è costituito da tre matrici e . Fare attenzione a implementare correttamente le primitive di basso livello.nO(nlogn)X[1 ..n],Y[1 ..n]R[1 ..n]

Proviamo a semplificare una cosa complessa. Che cosa sappiamo dell'intersezione dei cerchi? Quale analogo può essere trovato con l'intersezione di linee. Due linee potrebbero intersecarsi se adiacenti, quale proprietà dovrebbero avere due cerchi per intersecarsi? Sia la distanza tra il centro dei cerchi, e centri dei cerchi. Considera alcuni casi:dr0r1

  • Caso 1: se non ci sono soluzioni, i cerchi sono separati.d>r0+r1

  • Caso 2: Sequindi non ci sono soluzioni perché un cerchio è contenuto all'interno dell'altro.d<|r0-r1|

  • Caso 3: Se e i cerchi sono coincidenti e ci sono un numero infinito di soluzioni.d=0r0=r1

Quindi, sembra che le condizioni di intersezione siano pronte, ovviamente potrebbero essere condizioni sbagliate. Per favore correggi se è così.

Algoritmo. Ora dobbiamo trovare qualcosa in comune tra due cerchi che si intersecano. Con l'intersezione da analogico a linea, è necessario disporre della condizione di inserimento e della condizione di eliminazione nella coda degli eventi. Supponiamo che i punti evento siano le coordinate x del primo e dell'ultimo punto toccati dalla linea di sweep verticale. Nel primo punto inseriamo il cerchio nello stato e controlliamo l'intersezione (3 casi per il controllo sono menzionati sopra) con i cerchi più vicini, nell'ultimo punto eliminiamo il cerchio dallo stato .

Sembra che sia abbastanza per l'algoritmo della linea di sweep. Se c'è qualcosa che non va, o potrebbe esserci qualcosa che dovrebbe essere fatto diversamente, sentiti libero di condividere i tuoi pensieri con noi.

Addendum :

Inserisco un cerchio quando la linea di sweep verticale tocca il cerchio per la prima volta e rimuovo un cerchio dallo stato quando la linea di sweep lo tocca per l'ultima volta. Il controllo dell'intersezione deve essere eseguito per il cerchio precedente più vicino. Se aggiungessimo un cerchio allo stato e ci fosse già un altro cerchio che abbiamo aggiunto prima ed era ancora lì, quindi il cerchio precedente non era "chiuso", quindi potrebbe esserci un incrocio.


4
onnipotente [citazione necessaria]
JeffE

@com cosa intendi per "cerchia precedente più vicina"?
Joe,

1
Presumo che statusmantenga i cerchi che attualmente si intersecano con la linea di sweep? Supponiamo che al momento ci siano 100 cerchi statuse che tu elabori un evento di inserimento e inserisca il 101 ° cerchio. Quanti cerchi confronta per verificare l'intersezione? Come scegli quali cerchi confrontare?
Joe,

yyyyyy

Risposte:


5

Sei sicuramente sulla strada giusta. La grande domanda è: quando inserisci un cerchio, quali altri cerchi controlli per l'intersezione? Come si esegue questo controllo?

Nel caso di intersezione del segmento di linea, i segmenti di linea in corrispondenza di una determinata coordinata x sono totalmente ordinati. (Puoi elencarli dalla coordinata Y più bassa alla più alta). Pertanto, è possibile mantenere i segmenti di linea in un albero di ricerca binario e quando si aggiunge un nuovo segmento, è necessario solo scoprire dove appartiene nell'albero di ricerca binario e controllare i suoi vicini per eventi di intersezione.

Nel caso dei cerchi, non è immediatamente chiaro quali cerchi controllare. Se la tua risposta è "tutte", il tuo algoritmo ha bisogno di un po 'di lavoro.

Riesci a trovare un modo per rappresentare i cerchi in modo che siano totalmente ordinati, come i segmenti di linea?

Prova a rappresentare i cerchi come due semicerchi. Ogni evento insert è in realtà due eventi: inserire la metà superiore e la metà inferiore.


Sfortunatamente non ho idea dei semicerchi, forse consideri il semicerchio come un'unità minima di cerchio che può essere intersecata (3 casi di intersezione: l'intersezione è sul semicerchio superiore, o su quello inferiore, o su entrambi). All'accattonaggio tutti i cerchi sono ordinati per coordinata x dei loro confini sinistro e destro. Quindi non dovremmo considerare x coordinato nello stato , perché tutti i cerchi sono già presenti nell'ordine delle coordinate x. Pertanto sembra più logico considerare la coordinata y del centro (del semicerchio), o qualsiasi combinazione di y e raggi. La tua opinione?
com

@com Hai bisogno di punto centrale e raggio per determinare se due cerchi si intersecano, come hai fatto nei tuoi controlli di intersezione. Solo la coordinata y e il raggio da soli non specificano completamente il limite del cerchio. Sembra esserci qualcosa di fondamentale negli algoritmi di sweep line che non capisci, ma è difficile per me dire di cosa si tratta.
Joe,

0

Potrei pensare a questo approccio analogo allo sweep di Bentley Ottmann che corre nel tempo O ((n + k) logn).

Potrei ridurre il problema dell'intersezione del cerchio all'intersezione del segmento di linea. Considererò il diametro verticale parallelo all'asse Y per ciascuno dei cerchi. L'algoritmo deve utilizzare una linea orizzontale che sposta il piano dal basso verso l'alto.

Ora abbiamo il punto finale superiore, punto finale inferiore per ciascuno dei cerchi. Inoltre, dobbiamo modificare il predicato di intersezione per dire che due segmenti si intersecano se e solo se la linea di sweep attraversa entrambi i cerchi in un punto.

Poiché il problema dell'intersezione di linea può essere risolto nel tempo O ((n + k) logn), lo stesso limite segue anche per l'intersezione del cerchio.

Sono abbastanza convinto che questo avrebbe funzionato, ma se voi ragazzi potreste evidenziare un caso che questo non gestirà in generale, fatemi sapere.

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.