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.
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:
Caso 1: se non ci sono soluzioni, i cerchi sono separati.
Caso 2: Sequindi non ci sono soluzioni perché un cerchio è contenuto all'interno dell'altro.
Caso 3: Se e i cerchi sono coincidenti e ci sono un numero infinito di soluzioni.
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.
status
mantenga i cerchi che attualmente si intersecano con la linea di sweep? Supponiamo che al momento ci siano 100 cerchi status
e che tu elabori un evento di inserimento e inserisca il 101 ° cerchio. Quanti cerchi confronta per verificare l'intersezione? Come scegli quali cerchi confrontare?