Laboratorio di Modellazione Geometrica A.A. 2002-3

Calcolo dell'orientamento di una terna di punti nel piano e applicazioni.

Consideriamo tre problemi geometrici:
  1. Orientamento di una terna di punti
  2. Determinazione se un punto e' interno / esterno / sul contorno di un poligono convesso (in particolare di un triangolo)
  3. Calcolo della quota di un punto su un terreno modellato a triangoli


Orientamento di una terna di punti

Una delle primitive geometriche forndamentali, usata come operazione primitiva in un problemi piu' complessi.

Dati tre punti A, B, C, da che parte giace C rispetto alla retta passante per A, B ed orientata da A verso B?

Risposte possibili:

Si valuta il segno del determinante
| yB-yA  yC-yA |
| xB-xA  xC-xA |

= (yB-yA)(xC-xA) - (yC-yA)(xB-xA)
= yA*xB - yB*xA + yC*xA - yA*xC + yB*xC - yC*xB

Problemi numerici

Se il risultato e' molto piccolo in valore assoluto, puo' succedere che gli sia attribuito un segno errato a causa di errori di approssimazione inevitabili usando l'aritmetica floating point.

Una soluzione che di solito funziona e' quella di assumere una tolleranza epsilon>0 (molto piccola) e considerare come uguali a zero tutte le quantita' che in valore assoluto sono minori di epsilon.

Complessita' temporale

Costante in quanto e' coinvolto un numero fissato di punti e di coordinate (3 e 6 rispettivamente).


Determinazione della posizione di un punto rispetto ad un poligono convesso

Siano P1, P2, P3, ..., P(n) i vertici di un poligono convesso, ordinati in senso antiorario.
Sia Q un altro punto. Qsta dentro, fuori, o sul contorno del poligono?

Complessita' temporale

O(n) dove n e' il numero di vertici (o, equivalentemente, di lati) del poligono.

Nel caso peggione (punto interno o sul contorno), si riduce ad esattamente n chiamate alla primitiva che controlla l'orientamento di una terna di punti. Ciascuna chiamata ha un costo costante.

Nel caso particolare in cui il poligono e' un triangolo (n=3), la complessita' e' O(n) = O(3) = O(1) cioe' costante.


Calcolo della quota di un punto su un terreno modellato a triangoli

Matematicamente, un terreno e' una superficie nello spazio 3D che puo' essere proiettata ortogonalmente sul piano xy senza che due punti della superficie vadano a coincidere sullo stesso punto del piano.

La regione piana che si ottiene dalla proiezione sul piano xy e' chiamata dominio del terreno. La superficie del terreno puo' essere pensata come il grafico di una funzione definita sui punti del dominio, che associa ad ogni punto (x,y) del dominio la relativa quota z sul terreno.

In un terreno reale, questa funzione non ha espressione matematica, quindi non e' rappresentabile finitamente. Approssimiamo il terreno reale discretizzando la funzione. Come si approssima la linea curva di un grafico 2D mediante una catena di segmenti, cosi' noi approssimiamo la superficie del terreno mediante un reticolo di facce triangolari.

Il dominio e' suddiviso in triangoli. Di ogni triangolo sono note le quote dei tre vertici, che mappano il triangolo stesso in 3D. L'insieme di tutti i triangoli fornisce l'approssimazione a facce piane dell'intero terreno.

Inconsistenze potrebbero sorgere se triangoli confinanti in 2D fossero mappati in 3D a quote diverse. In tal caso l'insieme di facce in 3D non sarebbe piu' il grafico di una funzione, l'effetto evidente sarebbe la presenza di "spaccature" nella superficie. Per evitare questo, e' necessario che la suddivisione del domimio in triangoli soddisfi certe proprieta'. Tali proprieta' rispecchiano il concetto di suddivisione piana, introdotto piu' avanti nel corso.
Per adesso supponiamo semplicemente di avere in input un insieme di triangoli "buoni".

Figura: terreno e suo dominio, terreno discretizzato in triangoli, configurazione di triangoli non "buona" per rappresentare un terreno.

Definizione del problema

Dato un insieme di triangoli descriventi un terreno ed un punto P=(xP,yP) nel piano, determinare la quota corrispondente a P sul terreno.

Algoritmo

Se il punto P giace sul contorno comune di piu' triangoli, l'algoritmo sopra descritto calcola la quota di P in base ad uno dei triangoli in questione (il primo che incontra). Questo e' corretto perche' triangoli confinanti in 2D assumono in 3D la stessa quota sul confine comune (in quanto abbiamo assunto che l'insieme di triangoli sia "buono").

Calcolo della quota

Siano P1=(x1,y1), P2=(x2,y2), P3=(x3,y3) i tre vertici del triangolo in cuo cade il punto P, e siano z1, z2, z3 le quote corrispondenti.

L'equazione del piano passante per i tre vertici mappati in 3D e' la seguente:

(x-x1)a + (y-y1)b + (z-z1)c = 0
dove
a = (y1-y2)(z1-z3)-(z1-z2)(y1-y3)
b = (z1-z2)(x1-x3)-(x1-x2)(z1-z3)
c = (x1-x2)(y1-y3)-(y1-y2)(x1-x3)
in cui bisogna sostituire le due coordinate (xP,yP) di P e ricavare la z:
z = ( -((xP-x1)a + (yP-y1)b) / c ) + z1
Il denominatore c e' garantito diverso da zero se il triangolo non e' degenere in 2D. Infatti si annullerebbe solo se P3 fosse collineare a P1 e P2.

Files

Il visualizzatore usa le librerie grafiche OpenGL e Glut, installate nel laboratorio SW2.

Il formato del file che contiene i triangoli e' il seguente:

I separatori possono essere spazi, tabulazioni, ritorni a capo in numero arbitrario e anche mischiati fra loro.
Suggerimento: per la lettura del file di triangoli guardate come e' fatta la funzione di lettura in visraw.c.