NOTE AL SECONDO ESERCIZIO DI LABORATORIO

Problema affrontato

Localizzazione di un punto in una triangolazione piana:

Modalita' di soluzione

Preprocessiamo Tau costruendovi sopra un tipo particolare di quadtree che facilita la ricerca del triangolo contenente P.

Ingredienti

Avete gia' codice per 1 e 2 (realizzati come primo esercizio di laboratorio).

Vi diamo scheletro codice per 3, da completare usando le primitive relative alla vostra implementazione della struttura triangle-based.

Dovrete scrivere il codice per 4.

Maggiori dettagli su che cosa dovete fare in fondo.

Queste note spiegano


Quadtree per supporto a point location in triangolazione

Quadtree

Albero quaternario in cui sciascun nodo corriponde ad un'area rettangolare nel piano

Quadtree per triangolazioni

Quadtree costruito a partire da una triangolazione Tau nel modo seguente:
Classifichiamo le foglie in base alla condizione di arresto che le ha generate: Supponendo di sapere che un punto P (il punto da localizzare) si trova in una data foglia del quadtree, allora possiamo calcolare facilmente in quale triangolo di Tau cade. A seconda del tipo di foglia:

Implementazione del quadtree

Implementazione standard per alberi quaternari, piu' collegamenti alla triangolazione Tau memorizzati nelle foglie. Ogni foglia memorizza il suo tipo e, a seconda del tipo:


Costruzione del quadtree per triangolazioni

INPUT: una triangolazione tau
OUTPUT: un quadtree T

Idea

Si segue lo schema top-down riportato sopra. Si parte con un albero "tentativo" fatto dalla sola radice e si suddivide ricorsivamente fino al raggiungimento delle condizioni di arresto.

Ad ogni passo abbiamo un nodo corrente (che dobbiamo determinare se sara' una foglia oppure sara' suddiviso), e un insieme di vertici e triangoli "da collocare" nel nodo corrente (se sara' foglia) o nel sotto-albero che lo espandera' (se sara' suddiviso).

Passo generico

INPUT: OUTPUT:

Algoritmo

Chiamata iniziale

Inizialmente, l'algoritmo viene chiamato con N = la radice del quadtree da creare e V, T = l'insieme di tutti i vertici, tutti i triangoli di Tau.

Primitive geometriche

Per distribuire gli elementi di V e T tra i figli del nodo corrente, servono primitive per classificare un vertice, un lato e un triangolo rispetto al rettangolo di un nodo.

Nota: il confronto lato-con-rettangolo non compare nell'algoritmo descritto sopra, ma serve come sottocomponente del confronto triangolo-con-rettangolo.

Sia R il nostro rettangolo e siano (Xmin,Ymin), (Xmax,Ymax) le sue coordinate estreme.

Contenimento vertice-in-rettangolo

Un punto P=(x,y) cade nel rettangolo R sse Xmin < x < Xmax e Ymin < y < Ymax.

Intersezione lato-con-rettangolo

Siano p1 e p2 gli estremi del lato.


Intersezione triangolo-con-rettangolo

Sia t un triangolo di vertici p1,p2,p3.

Casi particolari

Nei problemi geometrici tipicamente i casi particolari sono vari e laboriosi da trattare.
Eliminiamo molti problemi con la seguente assunzione (fatta solo a scopo didattico, non realistica, non ammissibile in un programma per applicazioni "vere"): In questo modo, un vertice non cadra' mai sul contorno di un rettangolo, un triangolo non potra' mai essere tangente internamente ad un rettangolo.

Un triangolo puo' essere tangente esternamente ad un rettangolo ma solo nella configurazione "angolo del rettangolo giacente all'interno di un lato del triangolo". In questa configurazione il triangolo viene riconosciuto correttamente esterno al rettangolo purche' il confronto lato-con-rettangolo sia eseguito in modo stretto (ritornando "intersezione" solo in caso di intersezione propria).

Limite alla profondita' dell'albero

Nel caso di triangoli molto sottili e allungati, puo' essere necessario dividere moltissimo prima di giungere ad una delle configurazioni di arresto, e in tutte le configurazioni che si attraversano prima di arrivarvi magari ci sono solo pochi triangoli.

Suddividere troppo a fondo aumenta la profondita' dell'albero e quindi la complessita' della ricerca.

E' preferibile avere una foglia con 3 o 4 triangoli piuttosto che avere una foglia con uno o due triangoli preceduta da un cammino di parecchi nodi.

Percio' si pone una profondita' massima al di la' della quale non si suddivide piu': il nodo corrente diviene foglia di tipo STOP, e tutti i triangoli che lo intersecano (= i triangoli correntemente "da collocare") sono associati al nodo.

Qui profondita' max = 6, nodi UN_TRIANGOLO rossi, DUE_TRIANGOLI magenta, VERTICE blu, VUOTI neri, STOP verdi:


Point location su triangolazione usando quadtree

Due fasi:

Ricerca della foglia

Si parte dalla radice. Se il nodo corrente N e' una foglia, fine. Altrimenti si determina quale dei figli di N contiene P, e si prosegue su tale figlio.

Ricerca del triangolo nella foglia

A seconda del tipo di foglia: Per trattare il caso di foglia VERTICE, e' necessario usare le relazioni memorizzate nella struttura triangle-based per trovare i triangoli incidenti in un vertice v.

La relazione VT parziale fornisce il primo triangolo. Ogni triangolo si trova dal precedente selezionando dalla relazione TT l'adiacente che condivide v avendo cura di muoversi sempre nello stesso senso (orario o antiorario) attorno a v.

Casi particolari

Ancora a scopo semplificativo e didattico, assumiano che il punto dato non dia luogo a casi particolari.


CHE COSA VI DIAMO / CHE COSA DOVETE FARE

Che cosa vi diamo

Tutto il codice e' impacchettato nel file ese2.tgz. Scompattandolo con tar xzf ese2.tgz si crea una directory chiamata ESE2 e contenente i seguenti file:
  1. Sorgenti C del programma "costruzione di quadtree per triangolazione":
  2. Sorgenti C dei programmi di utilita':
  3. makefile
NOTA: Nello stato attuale le varie funzioni definite in "build.c" hanno delle parti "in sospeso" che vanno completate con le primitive relative alla vostra implementazione della struttura dati triangle-based.

Che cosa bisogna fare

  1. Completare il programma di costruzione inserendo le primitive relative alla propria implementazione della struttura dati triangle-based.
    Le parti da completare sono segnate con commenti preceduti dalla parola "COMPLETARE".

  2. Implementare l'algoritmo di point location.

  3. Far stampare al programma che implementa l'algoritmo di point location un file contenente la triangolazione, il punto, e il triangolo determinato come risposta secondo la seguente sintassi:

  4. Verificare che gli algoritmi di costruzione e di point location funzionino, aiutandosi anche con i programmi di visualizzazione forniti (ved. dopo).

  5. Fornire una valutazione della complessita' spaziale del quadtree.

  6. Fornire una valutazione della complessita' temporale dell'algoritmo di point location.
Nota sulle complessita':
Per semplicita' assumere che non vi siano nodi STOP. Parametri utili sono h = profondita' massima stabilita per il quadtree, n = numero di triangoli in Tau, k = numero massimo di triangoli incidenti in un vertice.

Nota bene: non dettagliare cose banali, ma spiegare i punti chiave.

Che cosa bisogna consegnare

Entro il 2 giugno 1999 (per coloro che intendono dare l'esame a giugno) o il 7 giugno 1999 (per gli altri) occorre consegnare: