Académique Documents
Professionnel Documents
Culture Documents
Nei capitoli precedenti si sono viste le trasformazioni geometriche bi– e tridimensionali e le proiezioni.
Esse si applicano a punti nel piano o nello spazio. E’ giunto il momento di vedere come sia possibile
descrivere forme più complesse dei punti, in modo da riuscire a trattare entità geometriche più vicine
a quelle che si trovano nel ”mondo esterno“.
Per iniziare si descriveranno le curve cubiche parametriche, che permettono di trattare linee
morbide sia nel piano che nello spazio. Si passerà poi alla descrizione dei metodi per rappresentare
le superfici nello spazio (vedremo reti di poligoni, superfici bicubiche parametriche e superquadriche)
ed infine volumi.
Gli argomenti che saranno trattati hanno un ovvio utilizzo in grafica, per la descrizione degli
oggetti che si vogliono rappresentare, ed in visione artificiale, per il modellamento delle forme
ricostruite a partire dalle informazioni pittoriche (o meno) disponibili. Vi sono poi altri tipi di
applicazioni piuttosto importanti: ad esempio le curve cubiche parametriche (ma anche le superfici)
sono utili per l’interpolazione di segnali ed immagini a partire dai campioni, per la definizione di
traiettorie nello spazio e tutte le volte che è necessario scegliere interattivamente una funzione di
trasformazione (come per la modifica degli istogrammi delle immagini).
In realtà quasi tutti i sistemi grafici disegnano le linee, alla fine, mediante approssimazione
74
5.1. CURVE CUBICHE PARAMETRICHE 75
poligonale: questo avviene perchè i segmenti di retta si sanno disegnare e troncare velocemente.
La qualità è comunque alta, visto che in fase di disegno è possibile calcolare facimente il numero di
segmenti necessari a seconda del fattore di ingrandimento usato.
Per migliorare la rappresentazione delle linee si usano comunemente delle approssimazioni di
grado più elevato del primo (il primo grado corrisponde ovviamente ai segmenti).
L’approssimazione di grado superiore di linee nello spazio si può realizzare in tre modi diversi:
1. Esprimendo ad esempio y e z come funzioni esplicite di x, cioè y = f(x) e z = g(x). I problemi
di questo tipo di rappresentazione sono: i) non è possibile esprimere curve con valori di y e/o z
multipli per la stessa x, come ad esempio le circonferenze, senza spezzare la rappresentazione in
più tratti; ii) questo tipo di rappresentazione non è invariante alla rotazione (ruotare una linea
richiede molto lavoro anche perchè può essere necessario spezzare un segmento di curva in più
segmenti); iii) la descrizione di tratti di linea con tangente verticale è difficile (l’inclinazione
tende all’infinito).
2. Esprimendo la curva come la soluzione di una equazione implicita della forma f(x, y, z) = 0.
I problemi di questa rappresentazione sono: i) l’equazione può avere più soluzioni di quelle
desiderate, ad esempio una circonferenza si può modellare mediante x2 +y2 = 1, che è corretto,
ma una semicirconferenza come si modella ? Certo, si può modellare come x2 + y2 = 1 per
y ≥ 0, ma il vincolo è esterno alla rappresentazione implicita.... ii) se due curve sono unite fra
di loro può essere difficile stabilire se le tangenti al punto di unione sono le stesse (la continuità
delle tangenti è un fattore critico in molte applicazioni).
In compenso è facile stabilire il lato di un punto rispetto alla curva, se un punto appartiene
alla curva ed il valore della normale alla curva in qualunque punto. Per questi motivi in alcuni
casi la forma implicita viene usata.
3. Esprimendo le curve in forma parametrica, cioè come x = x(t), y = y(t) e z = z(t).
La rappresentazione parametrica di tratti di curva supera le limitazioni viste per le altre due
rappresentazioni ed offre una serie di vantaggi aggiuntivi: ad esempio i vettori tangenti espressi in
forma parametrica non sono mai infiniti (mentre le inclinazioni possono esserlo).
Usando la rappresentazione parametrica una generica curva nello spazio (o nel piano) si descrive
come una sequenza di tratti polinomiali. Il parallelo con la descrizione mediante sequenza di segmenti
di retta è evidente, con in più il vantaggio che ciascun segmento può essere modellato in modo
indipendente (salvo rispettare i vincoli nei punti di unione, se si vuole che non siano visibili).
Il grado delle funzioni polinomiali usate normalmente è pari a 3: polinomi di grado inferiore non
permettono infatti una sufficiente flessibilità nel controllare la forma dei tratti, mentre polinomi di
ordine superiore possono creare problemi di oscillazioni non volute. I polinomi cubici sono invece
abbastanza generali, in quanto permettono la scelta di quattro parametri di controllo (vedremo che
si possono scegliere, ad esempio, i punti estremi e le tangenti in tali punti). Inoltre le curve cubiche
parametriche sono le curve di grado minore che non sono obbligate a giacere su di un piano in 3D.
Ciò si può facilmente capire dato che una curva di secondo grado può essere sempre specificata da tre
punti di controllo e che tali tre punti definiscono il piano dal quale la curva non può uscire. In verità
vi sono applicazioni in cui si usano polinomi di grado maggiore, ma sono abbastanza infrequenti:
ad esempio si usano per modellare le superfici quando sia necessario controllare derivate di ordine
superiore al fine di ottenere un buon coefficiente aereodinamico nella progettazione di automobili od
aerei.
I polinomi cubici che definiscono un segmento di curva nello spazio Q(t) = [ x(t) y(t) z(t) ] sono
della forma:
x(t) = a x t3 + b x t2 + c x t + d x
y(t) = a y t3 + b y t2 + c y t + d y
z(t) = a z t3 + b z t2 + c z t + d z
Siccome siamo interessati a tratti limitati consideriamo, senza perdita di generalità, che t sia
limitato nell’intervallo:
0≤t≤
1.
Definendo T = t3 t2 t 1 e definendo la matrice dei coefficienti come:
ax ay az
bx by bz
C = cx cy cz
dx dy dz
76 CAPITOLO 5. RAPPRESENTAZIONE DI FORME
y(t) y(t)
x(t)
t x(t)
Figura 5.2 Due segmenti parametrici di curva bidimensionale uniti insieme ed i polinomi che la
formano. Gli assi t sono visualizzati supponendo che t vari fra 0 ed 1 per il primo tratto e fra 1 e
2 nel secondo, al fine di rendere chiara la figura e per mostrare la continuità dei polinomi in t. I
pallini che identificano l’inizio e la fine dei diversi tratti sono inseriti per chiarezza, ma di solito non
vengono disegnati.
La figura 5.2 mostra come una curva Q(t) sia generata mediante due funzioni x(t) ed y(t). Si
possono anche vedere le due funzioni come appaiono viste rispetto al parametro t, che normalmente
è invisibile, e si può notare come Q(t) possa essere un funzione a valori multipli anche se i due
polinomi che la formano sono ovviamente a valore singolo. Nella figura 5.2, come nella altre figure
del capitolo, viene mostrata una curva 2D rappresentata da Q(t) = [x(t) y(t)].
La rappresentazione della curva bidimensionale come due funzioni nel parametro t non è unica,
ovvero vi sono più funzioni Q(t) che danno origine alla stessa curva disegnata ed è impossibile a
partire dal disegno di Q(t) risalire ad una unica rappresentazione in funzione di t.
La derivata di Q(t) è il vettore parametrico tangente della curva, e vale
d d d d d
0
Q(t) = Q (t) = x(t) y(t) z(t) = T · C = [3t2 2t 1 0] · C
dt dt dt dt dt
Il vettore tangente Q0 (t) è la velocità di un punto che si muove lungo la linea rispetto al parametro t,
mentre la derivata seconda è la sua accelerazione. Se una telecamera (virtuale o reale) si muove lungo
una curva cubica parametrica ed acquisisce una immagine ogni intervallo di t, Q0(t) rappresenta la
sua velocità e Q00(t) la sua accelerazione. In questi casi è richiesta una continuità parametrica C 2
affinchè la sequenza risultante non mostri movimenti innaturali della telecamera. In generale ci si
deve occupare della continuità parametrica quando la curva generata rappresenta la traiettoria di
un qualcosa nello spazio, perchè il movimento rispetto al parametro t è in un certo modo visibile,
mentre è sufficiente preoccuparsi della sola continuità geometrica se la curva viene semplicemente
disegnata (in questo caso il movimento rispetto a t non viene rappresentato in nessun modo).
In generale la continuità C 1 implica quella G1, mentre l’inverso non è vero. Per altro l’apparente
continuità di una curva disegnata è la stessa sia che valga C 1 che G1 . Esiste un caso speciale nel
quale C 1 NON implica G1 ; quando entrambi i vettori tangenti sono nulli ([0 0 0]) al punto di unione.
In questo caso i vettori tangenti sono uguali, ma le direzioni della curva (le tangenti geometriche)
possono essere diverse. Vista in termini di un punto che si muove sulla curva seguendo t questo
significa rallentare fino a fermarsi nel punto di unione e poi ripartire in direzione diversa.
Il disegno di una funzione parametrica è diverso dal disegno di una funzione del tipo y = f(x),
dove la variabile indipendente è riportata sull’asse x e quella dipendente sull’asse y. Nel disegno di
una curva parametrica la variabile indipendente t non viene riportata da nessuna parte: è questo il
motivo per il quale è impossibile determinare il vettore tangente alla curva a partire dal suo disegno
(è possibile determinarne la direzione, ma non il modulo). Questo può essere dimostrato facilmente:
sia γ(t), 0 ≤ t ≤ 1 una curva parametrica con vettore tangente in 0 pari a γ 0 (0): considerando
la curva η(t) = γ(2t), 0 ≤ t ≤ 0.5 si ha che i disegni di γ(t) e η(t) sono indistinguibili, mentre
η0(0) = 2γ 0 (0). Questo è il motivo per cui si introduce la continuità geometrica.
Ogni segmento di curva Q(t), essendo cubico, è definito da quattro parametri e quindi è possibile
imporre quattro vincoli geometrici alla sua forma. Nel seguito vedremo le curve cubiche parametriche
di Hermite, ciascun tratto delle quali è definito dai punti estremi e dalle relative tangenti, quelle di
Bezier, definite dai punti estremi e da due ulteriori punti che determinano le tangenti, e le B-splines,
definite da quattro punti. Le prime due hanno continuità fino alla C 1 , mentre le B-splines hanno
continuità C 2 ma, in generale, non passano da alcun punto di controllo.
Abbiamo visto che un segmento di curva cubica parametrica puo‘ essere definito da Q(t) = T · C.
La matrice C contiene le informazioni sia dei vincoli del tratto di curva che della forma generale
del tipo di curva che stiamo considerando: conviene esprimerla nella forma C = M · G, dove M è
la matrice base 4x4 fissa dato il tipo di curva e G è il vettore colonna di 4 elementi che contiene i
vincoli geometrici del particolare tratto. Quindi
m11 m12 m13 m14 G1
m21 m22 m23 m24 G2
Q(t) = [ x(t) y(t) z(t) ] = T · M · G = t3 t2 t 1 m31 m32 m33 m34 G3
la matrice base di Ermete MH , che indica come il vettore geometrico di Ermete GH viene utilizzato
nei polinomi cubici, scriviamo 4 equazioni, una per ciascun vincolo, e risolviamo per i coefficienti
incogniti. Definendo GHx , la componente x del vettore geometrico, come:
P1 P1x
P4 P4x
GH = R1
GHx = R1x
R4 R4x
e ricordando che
x(t) = T · MH · GHx = t3 t2 t 1 · MH · GHx
i vincoli su x(0) e x(1) si trovano per sostituzione diretta
R4 3 2 1 0
Espandendo il prodotto T ·MH in Q(t) = T ·MH ·GH si ottengono le quattro funzioni interpolanti
di Ermete o Hermite blending functions BH , che sono i quattro polinomi che interpolano ciascun
elemento del vettore geometrico:
Osservando le quattro funzioni interpolanti mostrate in Fig. 5.3 si nota che in t = 0 tre funzioni sono
nulle e solo quella che interpola P1 è diversa da zero. Questo significa che per t = 0 l’unico elemento
del vettore geometrico che influenza la curva è proprio P1 . Poichè inoltre la relativa funzione vale
uno, la curva parte dal punto P1. Nello stesso modo si può osservare, dalla sola analisi delle funzioni
5.1. CURVE CUBICHE PARAMETRICHE 79
interpolanti, che la curva termina nel punto P4. Ciò deve ovviamente valere per qualsiasi tipo di
curva che passi da punti di controllo.
La Fig. 5.4 mostra una serie di curve di Ermete. La sola differenza fra esse è il modulo (lunghezza)
del vettore tangente nel primo punto, cioè R1, mentre la direzione di R1 ed i valori degli altri tre
vincoli geometrici non cambiano. Ovviamente più il vettore R1 è lungo, maggiore è la sua influenza
sulla curva. Nella stessa figura si può notare come per particolari valori dei vettori tangenti il tratto
di curva possa auto-intersecarsi (anche se, ovviamente, le singole componenti x(t) ed y(t) non sono
autointersecanti).
Figura 5.4 Una famiglia di curve di Ermete (a sinistra): solo il modulo del vettore tangente nel
primo punto varia. A destra un esempio di curva auto-intersecante.
La Fig. 5.5 mostra un’altra famiglia di curve di Ermete: in questo caso l’unica differenza fra le varie
curve è la direzione del vettore tangente nel primo punto, cioè la direzione di R 1.
Figura 5.5 Un’altra famiglia di curve di Ermete: solo la direzione del vettore tangente nel primo
punto varia.
Affinchè due curve di Ermete si possano unire in modo morbido, cioè con continuità di tipo G 1, come
in Fig. 5.6, i vettori geometrici devono avere la forma seguente:
P1 P4
P4 P7
R1 e k > 0
kR4
R4 R7
Ovvero devono avere un estremo (P4 ) in comune e almeno la direzione del vettore tangente nel punto
comune uguale. Se anche il modulo è uguale, ovvero se k = 1, allora si ha continuità di tipo C 1 .
80 CAPITOLO 5. RAPPRESENTAZIONE DI FORME
Figura 5.6 Due tratti di curva di Ermete che si uniscono con continuità di tipo G1.
P4
I vettori tangenti agli estremi sono legati ai punti di controllo da:
La curva di Bézier interpola i due punti estremi ed approssima gli altri due. I motivi per i quali la
costante che lega punti a tangenti nella equazione sopra vale proprio tre sono due. Il primo si può
capire risolvendo il seguente problema:
Si supponga che le equazioni che legano tangenti agli estremi e punti siano della forma
R1 = β(P2 − P1) e R4 = β(P4 − P3 ). Si considerino quattro punti di controllo allineati
ed equispaziati, come P1 = (0, 0), P2 = (1, 0), P3 = (2, 0) e P4 = (3, 0). Per quale valore
di β la velocità di un punto che si muove lungo la curva Q(t) (considerando t il tempo)
è costante ? (Suggerimento, provare β = 3)
Il secondo motivo è legato al convex hull e verrà ripreso fra poco. Per trovare la matrice base di
Bézier MB si potrebbe ripetere quanto fatto per le curve di Ermete, ma è più semplice mettere in
relazione i vettori geometrici delle due forme secondo quanto già visto:
P1 1 0 0 0 P1
P4 0 0 0 1 P2 = MHB · GB
GH = R1 = −3 3
0 0 P3
R4 0 0 −3 3 P4
P3 P2
P1 P4 P1 P4
P2
P3
Figura 5.7 Due curve di Bezier ed i loro punti di controllo. Le linee tratteggiate indicano i rispettivi
convex hulls.
Per trovare la matrice base di Bézier MB è allora sufficiente partire dalla forma di Ermete e sostituire
il vettore geometrico:
Il prodotto Q(t) = T · MB · GB è
I quattro polinomi BB = T · MB , che sono le funzioni interpolanti dei quattro punti di controllo,
sono chiamati i polinomi di Bernstein e sono mostrati in Fig. 5.8.
Figura 5.8 I polinomi di Bernstein, che sono le funzioni interpolanti per le curve di Bézier.
Osservando le funzioni interpolanti si nota che, come per le curve di Ermete, la curva deve passare dai
punti P1 e P4. In questo caso è però valida anche un’altra proprietà: la somma delle quattro funzioni
è pari a 1 per ogni t fra 0 e 1 e nessuna di esse è mai negativa. Quindi Q(t) è una media pesata
(positivamente) dei quattro punti di controllo, e si può facilmente vedere che deve perciò essere
contenuta nel convex hull dei quattro punti di controllo. Tale convex hull è il poligono convesso
formato dai punti di controllo (vedi Fig. 5.7), che si può pensare formato da un elastico lasciato
libero di chiudersi attorno ai punti. Questa proprietà è importante, nel senso che limita in modo
semplice la parte di piano (o spazio) che contiene la curva, e viene spesso usata per il troncamento
(clipping) delle curve.
La Fig. 5.9 mostra due segmenti di curva di Bézier con un estremo comune. La continuità di tipo
G1 in tale estremo è possibile se P3 − P4 = k(P4 − P5) con k > 0, ovvero se i tre punti P3, P4 e P5
sono distinti e collineari. Se k = 1 le curve hanno anche continuità C 1 all’unione.
P2
P5
P6
P4
P1 P3 P7
Figura 5.9 Due curve di Bézier unite nel punto P4 . I punti P3, P4 e P5 sono collineari.
5.1.3 B splines
Il nome spline deriva dai lunghi nastri di metallo flessibile che i disegnatori usavano per tracciare
linee curve di forma arbitraria. I disegnatori fissavano in qualche modo alcuni punti del nastro
metallico e questo (se non veniva piegato) interpolava i punti garantendo la continuità di primo e
secondo grado ovunque (ovviamente continuità geometrica, non essendoci parametri !). E’ possibile
trovare un equivalente matematico di ciò, le splines cubiche naturali, tale da interpolare (passare
82 CAPITOLO 5. RAPPRESENTAZIONE DI FORME
su) i punti di controllo e garantire continuità C 0 , C 1 e C 2. Rispetto alle curve di Ermete e Bézier
queste garantiscono un grado in più di continuità e sono quindi più morbide (migliori alla vista).
D’altra parte non permettono il controllo delle tangenti nei punti di unione (cosa che a volte è un
vantaggio e a volte no). Il difetto più grave delle splines cubiche naturali è che tutti i coefficienti dei
polinomi che descrivono i vari tratti dipendono da tutti gli n punti di controllo: il relativo calcolo
comporta l’inversione di una matrice di dimensione n + 1 per n + 1. Questo rende in calcolo della
curva molto pesante, specie in applicazioni interattive. Per contro le curve cubiche parametriche
viste in precedenza hanno la proprietà che un singolo punto di controllo influenza solo pochi tratti
di curva, rendendo il ricalcolo della intera curva dopo lo spostamento di un punto molto veloce.
Le B–splines consistono in tratti di curva cubica parametrica tali per cui i relativi parametri
dipendono da pochi punti di controllo ed il tipo di continuità è pari a quello delle splines naturali,
cioè C 2 , nei punti di unione. Lo svantaggio di queste curve è che non passano dai punti di controllo
ma li approssimano (tutto non si può avere...). Il nome corretto delle curve che vediamo in questa
sezione è B-Splines uniformi non razionali: i termini aggiuntivi, spiegati nel seguito, servono per
distinguerle da altri tipi di curve.
Per introdurre le B-Splines è necessario cambiare notazione rispetto alle due curve cubiche già viste,
nel senso che poichè le B-Splines non passano per i punti di controllo e segmenti vicini usano punti
in comune è più naturale trattare l’argomento introducendo tutti i segmenti di curva insieme.
Le B-Splines cubiche approssimano una serie di m + 1 punti di controllo P0 , P1, . . . , Pm , m ≥ 3, con
una curva formata da m − 2 segmenti di curva polinomiale cubica Q3, Q4, . . . , Qm .
Anche se sarebbe possibile definire le B-Splines in modo tale che in ogni segmento di curva 0 ≤ t < 1,
è meglio modificare la notazione in modo da rendere sequenziali i domini del parametro t nei vari
segmenti. Quindi ne risulta che il dominio del parametro t su cui il generico segmenti Qi è definito
è ti ≤ t < ti+1 . Nel caso particolare di m = 3, c’è quindi un solo segmento di curva definito
nell’intervallo t3 ≤ t < t4 da quattro punti di controllo P0, P1, P2 e P3.
Per ogni i ≥ 4, c’è un punto di unione, o knot, fra i segmenti Qi−1 e Qi per il valore del parametro
t = ti : il valore del parametro in tale punto è detto knot value. I punti iniziale e finale, ai valori t 3
e tm+1 , sono anch’essi definiti knots, cosicchè vi sono un totale di m − 1 knots. La Fig. 5.10 mostra
una B-Spline 2D con i punti di unione (knots) marcati.
Figura 5.10 Una B-Spline composta da sei segmenti di curva ed i relativi nove punti di controllo.
Per generare una B-Spline chiusa è sufficiente replicare i primi tre punti di controllo alla fine:
P0, P1, . . ., Pm , P0, P1, P2. In questo tipo di splines i punti di unione o knots sono equispaziati
rispetto al parametro t (questo spiega il termine uniforme). Si assume che t3 = 0 e che gli intervalli
siano unitari, cioè ti+1 − ti = 1. Esistono B-Splines non uniformi, che non tratteremo, che hanno
alcuni vantaggi a prezzo di una maggiore complessità (vedi [FvDFH90]). Il termine nonrazionali
distingue queste B-Splines da altre nelle quali x(t), y(t) e z(t) sono definite come rapporto di due
polinomi (esiste un quarto polinomio cubico, w(t), che divide i polinomi cubici che rappresentano
x(t), y(t) e z(t)). Le B-Splines razionali hanno un fondamentale vantaggio rispetto alle nonrazionali:
le proiezione di una di tali curve si può ottenere proiettando i punti di controllo e calcolando la curva
proiettata usando questi ultimi. Il termine B- significa che queste Splines hanno funzioni base, al
contrario delle splines naturali che non le hanno.
Ciascuno degli m − 2 segmenti di curva di una B-Spline è definito da quattro degli m + 1 punti di
controllo. In particolare, il segmento Qi è definito dai punti Pi−3, Pi−2, Pi−1 e Pi. Quindi il vettore
5.1. CURVE CUBICHE PARAMETRICHE 83
Figura 5.11 Sinistra: una B-Spline al variare della posizione del punto di controllo P4. Destra: le
quattro funzioni interpolanti delle B-Splines.
Figura 5.12 Effetti di punti di controllo multipli su di una curva B-Spline. In (a) non ci sono
punti multipli ed i convex hulls dei due segmenti di curva si sovrappongono. In (b) c’è un punto a
molteplicità due, cosicchè i due convex hulls si toccano lungo un segmento di linea retta: il punto di
unione è quindi obbligato ad essere su tale segmento rettilineo. In (c) c’è un punto a molteplicità
tre e quindi i convex hulls diventano segmenti di linea retta con un solo punto in comune (il punto
multiplo): la curva passa ora dal punto di controllo triplo, ma ail prezzo di rendere rettilinei i due
segmenti di curva e di uno spigolo (la continuità C 2 è ovviamente ancora presente, ma si ha solo G0).
Overhauser splines). Esse sono utilizzabili tutte le volte che è necessario interpolare (passare per)
un certo numero di punti dati senza che esistano vincoli a priori sulla direzione delle tangenti nei
punti di unione. Sostanzialmente sono curve di Ermete nelle quali le tangenti ai punti di unione
sono calcolate automaticamente sulla base dei punti di controllo precedente e successivo. Il vettore
tangente al punto Pi è infatti parallelo alla direzione della linea che collega i punti Pi−1 e Pi+1 ed il
modulo del vettore tangente è legato alla distanza fra gli stessi due punti (vedi Fig. 5.13).
Figura 5.13 Una spline di Catmull–Rom. I punti sono interpolati dalla spline che passa da ciascuno
in direzione parallela alla linea che congiunge i punti precedente e successivo.
Chiamando MCR la matrice base delle curve di Catmull–Rom ed usando lo stesso vettore dei vincoli
geometrici delle B-Splines uniformi non razionali, cioè GBsi , si ottiene:
−1 3 −3 1 Pi−3
1 2 −5 4 −1 Pi−2
Qi (t) = T · MCR · GBsi = T
2 −1 0 1 0 P i−1
0 2 0 0 Pi
Altri tipi di splines contengono parametri modificabili (anche localmente) per il controllo fine della
curva, ad esempio si possono modificare tensione, continuità, velocità di un punto che percorre la
curva ed altro.
5.1. CURVE CUBICHE PARAMETRICHE 85
Figura 5.14 SINISTRA: il segmento di curva di Bézier definito dai punti Pi è diviso in t = 12 per
ottenere due nuovi segmenti definiti dai punti Li (tratto a sinistra) e Ri (tratto a destra). DESTRA:
controllo se un segmento di curva può essere considerato rettilineo. Se sia d 2 che d3 sono minori di
una certa soglia fissata il segmento è considerato rettilineo e può essere approssimato dal segmento
di retta P1P4.
Come esempio di suddivisione presentiamo ora il caso delle curve di Bézier: tutte le rappresentazioni
sono suddivisibili, ma in modo più complesso e, a volte, con alcuni problemi aggiuntivi. Dato un
segmento di curva di Bézier Q(t) definito dai punti di controllo P1, P2, P3 e P4 , si vuole trovare
un segmento di sinistra, definito dai punti L1 , L2 , L3 e L4 , ed un segmento di destra, definito dai
punti R1, R2, R3 e R4, in modo tale che il segmento di sinistra sia coincidente con Q(t), segmento
originale, per 0 ≤ t < 12 ed il segmento di destra sia coincidente con Q(t) per 12 ≤ t < 1.
Esiste un modo facile per suddividere un segmento di Bézier per qualsiasi valore di t fra 0 ed 1,
vedi [FvDFH90], che, opportunamente semplificato per il caso t = 21 , diventa (vedi anche Fig. 5.14
a sinistra):
L2 = (P1 + P2 )/2 H = (P2 + P3)/2 L3 = (L2 + H)/2
R3 = (P3 + P4)/2 R2 = (H + R3)/2 L4 = R1 = (L3 + R2)/2
Da notare come siano necessarie solo addizioni e shift per dividere per due.
Questo risultato può essere riorganizzato in forma matriciale in modo da evidenziare la matrice di
L R
divisione sinistra DB e quella destra DB . Tali matrici possono essere usate per ottenere i due nuovi
L R
vettori dei vincoli geometrici GB e GB :
8 0 0 0 P1
1
4 4 0 0 P2
GL L
B = DB · GB =
8 2 4 2 0 P 3
1 3 3 1 P4
1 3 3 1 P1
1
0 2 4 2 P2
GR R
B = DB · GB =
8 0 0 4 4 P3
0 0 0 8 P4
86 CAPITOLO 5. RAPPRESENTAZIONE DI FORME
Da notare come ciascuno dei nuovi punti di controllo dei vettori geometrici G L R
B e GB sia una somma
pesata dei punti di controllo Pi del segmento prima della divisione, essendo i pesi positivi ed a somma
unitaria. Quindi ciascuno dei nuovi punti di controllo è nel convex hull del segmento originario.
Quindi i nuovi punti non sono più lontani dalla curva Q(t) dei punti originari e, in generale, sono
più vicini. Questa proprietà è valida per tutte le splines che hanno il convex hull. Da notare inoltre
L R
la simmetria fra DB e DB , conseguenza della simmetria nella costruzione geometrica.
G2 = M2−1 · M1 · G1 = M1,2 · G1
In questo modo si arriva a 9 moltiplicazioni e 10 addizioni per punto. Una velocizzazione ben
superiore si ottiene passando al calcolo incrementale con il metodo delle differenze, in modo analogo
a quanto visto per il tracciamento di segmenti di retta e cerchi (ovvero utilizzando la stessa procedura,
anche se in questo caso i polinomi sono di terzo grado mentre nei casi visti essi erano, rispettivamente,
di grado uno e due). Il metodo alle differenze, che si trova spiegato bene in [FvDFH90], permette di
arrivare a 9 addizioni e nessuna moltiplicazioni per punto 3D, a parte le inizializzazioni.
Il secondo metodo per tracciare le curve cubiche parametriche è quello della suddivisione ricorsiva.
Questo metodo è intrinsecamente migliore, in quanto permette di dividere la curva in segmenti di
retta in modo adattivo: dove la curva è quasi rettilinea verranno generati pochi segmenti, dove
piega molto ne verranno generati di più. In ogni caso l’errore che si commette, ovvero la massima
distanza fra segmento di retta e parte della curva che da esso è rimpiazzata, è entro una tolleranza
stabilita in precedenza. Usando il primo metodo si deve invece scegliere fra avere una buona
rappresentazione dei tratti curvi a prezzo di avere molti segmenti nei tratti quasi rettilinei o pochi
segmenti ed una rappresentazione poco accurata. La rappresentazione di Bézier è particolarmente
adatta alla suddidivisione ricorsiva dato che la suddivisione è veloce (sei shift e sei addizioni). Poichè
la suddivisione termina quando il segmento di curva cubica può essere sostituito dal segmento di
retta che unisce i punti estremi, è necessario anche un test veloce per capire quale è l’errore che si
commette con tale sostituzione. La curve di Bézier consente anche di realizzare rapidamente tale
test, utilizzando la proprietà del convex hull, come spiegato in Fig. 5.14 a destra.
Per altre forme di splines la suddivisione ed il test di rettilineità possono non essere cosı̀ semplici: in
questi casi conviene convertirle nella forma di Bézier prima del tracciamento.
5.2. RAPPRESENTAZIONE DI SUPERFICI 87
Una rete di poligoni, o Poligon Mesh, è un’insieme di superfici planari poligonali confinanti, dove
i poligoni sono spesso triangoli. Questo tipo di rappresentazione è molto adatta a rappresentare
oggetti con superfici piane, come case, scatole, piramidi ecc. Può essere utilizata anche per
la rappresentazione di superfici curve, vedi Fig. 5.15, a patto che si accettino le conseguenti
approssimazioni.
Una rete di poligoni è composta da poligoni, ciascuno dei quali contiene vertici e lati. In una rete
di poligoni ciascun lato deve essere condiviso da almeno due poligoni (a parte per i poligoni di
bordo di superfici aperte) ed anche i vertici sono, in generale, condivisi da più poligoni. Un singolo
poligono viene definito da una sequenza ordinata e chiusa di vertici complanari. Una rete di poligoni
può essere rappresentata in molti modi diversi, ciascuno caratterizzato da vantaggi e svantaggi.
L’obiettivo del programmatore è quello di scegliere la rappresentazione più adeguata. Va notato che
per una stessa applicazione possono essere utilizzate rappresentazioni differenti, ad esempio una per
la rappresentazione interna al programma, una per la memorizzazione su disco ed una per facilitare la
creazione o manipolazione interattiva della superficie da parte di un utilizzatore. Due criteri di base,
relativi a spazio e tempo, sono spesso usati come parametri di valutazione. Le operazioni tipiche
su una rete di poligoni sono trovare tutti i lati aventi in comune lo stesso vertice, trovare i poligoni
che condividono un lato od un vertice, trovare i vertici connessi dallo stesso lato, trovare i lati di un
poligono, visualizzare la rete ed identificare gli errori nella rappresentazione (ad esempio un vertice,
un confine o un poligono mancanti). In generale, più sono espresse esplicitamente le relazioni tra
poligoni, vertici e lati più sono veloci le operazioni e maggiore è lo spazio di memoria richiesto.
88 CAPITOLO 5. RAPPRESENTAZIONE DI FORME
I vertici sono memorizzati in ordine, orario od antiorario a seconda della convenzione scelta, uguale
per tutti i poligoni (la sequenza dei vertici viene utilizzata, ad esempio, per decidere quale è il
lato visibile e per il calcolo della normale uscente dal poligono). I lati uniscono i vertici successivi
nella lista ed un lato unisce il primo punto all’ultimo, garantendo cosı̀ che il poligono sia chiuso.
Questa rappresentazione è efficiente e compatta per un singolo poligono, ma ha molti svantaggi
per rappresentare una rete. Uno di tali svantaggi è lo spreco di memoria, in quanto le coordinate
dei vertici comuni a più poligoni (ovvero quasi tutti per superfici aperte e tutti per quelle chiuse)
vengono replicate più volte. Inoltre non c’è alcuna rappresentazione esplicita di lati e vertici comuni:
ad esempio per trovare tutti i lati che incidono su di un dato vertice di un certo poligono è necessario
trovare tutti i poligoni che condividono il vertice, ovvero confrontare le triplette delle coordinate del
vertice con quelle dei vertici di tutti gli altri poligoni. Ovviamente è un processo lungo, ma c’è di
peggio: la rappresentazione di numeri in virgola mobile all’interno di un elaboratore elettronico può
subire lievi variazioni a seguito delle approssimazioni nei calcoli, per cui lo stesso vertice può spostarsi
lievemente ed il test di uguaglianza fallire (questo deriva anche dal fatto che due numeri reali possono
essere lo stesso numero ma non avere neanche una cifra in comune, come 0.99999 . . . e 1.00000 . . .).
Con questa rappresentazione la visualizzazione della rete come poligoni pieni o mediante tracciamento
dei lati dei poligoni necessita comunque la trasformazione di ogni vertice ed il troncamento (clipping)
di ciascun lato di ciascun poligono, ripetendo quindi le operazioni più volte sugli stessi vertici e lati.
Già questo comporta molti più calcoli di quelli strettamente necessari, in più ciascun lato condiviso
viene tracciato due volte con ovvi problemi dovuti alla sovrascrittura per dispositivi quali plotter e
display vettoriali. Anche nel caso di visualizzazione su display raster possono crearsi artefatti, nel
caso in cui i lati vengano disegnati in direzioni opposte.
Nel caso di rappresentazione mediante puntatori ad una lista di vertici, ciascun vertice della rete
viene memorizzato soltanto una volta in quella che viene chiamata lista dei vertici:
Un poligono viene descritto attraverso una lista di indici (i puntatori) relativi alla lista dei vertici.
Un poligono costituito dai vertici 3 5 7 e 10 sarebbe quindi rappresentato come P = (3, 5, 7, 10).
V2
V = (V1,V2,V3,V4) = ((x1,y1,z1), ....., (x4,y4,z4))
P1 = (1, 2, 4)
P2 V3
V1 P1
P2 = (4,2,3)
V4
Figura 5.16 Una semplice rete di poligoni e la sua rappresentazione mediante puntatori ad una
lista di vertici.
Questa rappresentazione, di cui è mostrato un esempio in Fig. 5.16, ha diversi vantaggi al di là
della rappresentazione esplicita del poligono. Dal momento che ogni vertice è memorizzato una sola
volta, viene risparmiata una considerevole quantità di spazio. Inoltre le cooordinate di un vertice
possono essere cambiate facilmente. D’altro canto, è ancora difficile trovare i poligoni che condividono
un lato, ed i lati dei poligoni confinanti sono ancora tracciati due volte. Questi due problemi possono
essere eliminati attraverso una rappresentazione esplicita dei lati.
Definendo i poligoni attraverso puntatori ad una lista di lati abbiamo nuovamente la lista di vertici
V, ma i poligoni vengono rppresentati con un insieme di puntatori ad una lista di lati, nella quale
ciascun lato compare una sola volta. Ciascun lato nella lista dei lati contiene i puntatori a due vertici
nella lista dei vertici (che definiscono il lato stesso) ed uno o due puntatori alla lista dei poligoni
5.2. RAPPRESENTAZIONE DI SUPERFICI 89
poligoni (puntatori che servono per velocizzare le operazioni di ricerca). Di conseguenza descriviamo
un poligono come P = (E1 , ..., En), ed un lato come E = (V1 , V2, P1, P2). Quando un lato appartiene
ad un solo poligono, P1 oppure P2 sono di valore nullo. La Fig. 5.17 mostra un esempio di tale
rappresentazione.
V2
V=(V1,V2,V3,V4)=((x1,y1,z1), ..., (x4,y4,z4))
E2
E1=(V1,V2,P1,K)
E1 E4 E2=(V2,V3,P2,K)
P2 E3=(V3,V4,P2,K)
V3
P1 E4=(V4,V2,P1,P2)
V1 E5=(V4,V1,P1,K)
E3 P1=(E1,E4,E5)
E5 P2=(E2,E3,E4)
V4
Figura 5.17 Una semplice rete di poligoni e la sua rappresentazione mediante puntatori ad una
lista di lati. In questa figura il simbolo K rappresenta il puntatore vuoto.
Le linee che definiscono la rete di poligoni possono quindi essere disegnate a partire dalla lista
dei lati, evitando ridondanze e problemi. Esistono tuttavia applicazioni per cui lo stesso lato può
essere condiviso da più di due poligoni (non molte, in verità): in tale caso bisogna estendere la
rappresentazione per includere un numero arbitrario di poligoni.
Nessuno dei tre metodi suddetti permette di determinare facilmente quali lati siano incidenti ad un
vertice: è necessario analizzare tutti i lati presenti.
Ax + By + Cz + D = 0 (5.1)
il calcolo dei coefficienti si può usare il metodo mostrato in Fig. 5.18, basato sulla somma con segno
dei trapezi formati dai lati. Per il coefficiente C l’area si ottiene sottraendo dall’area del trapezio A 3
le aree dei trapezi A2 e A1. In generale il coefficiente C si ricava come:
n
1 X
C = (yi + yi⊕1 )(xi⊕1 − xi ) (5.2)
2 i=1
dove l’operatore ⊕ è la solita addizione con l’eccezione che n ⊕ 1 = 1. Le formule per ricavare A
e B sono analoghe, tranne che B deve essere cambiato di segno. Per inciso, dal calcolo delle aree
con segno si ricava un ottimo algoritmo per determinare se i vertici di un poligono 2D sono ordinati
in senso orario od antiorario: basta osservare il segno dell’area, se è positivo l’ordine è orario, se
negativo è antiorario.
y (x1 , y1 )
(x3 , y3 )
A3
A1
A2 (x2 , y2 )
x
1 1 1
C = (y1 + y2 )(x2 − x1) + (y2 + y3 )(x3 − x2) + (y3 + y1 )(x1 − x3 )
2
| {z } 2
| {z } |2 {z }
−A1 −A2 A1 +A2 +A3
| {z }
A3
Figura 5.18 Calcolo del coefficiente C (vedi Eq. 5.2) per il caso di un triangolo utilizzando la
proiezione sul piano (x,y).
Dopo aver determinato l’equazione del piano utilizzando tutti i vertici, è possibile stimare quanto sia
non planare il poligono calcolando la distanza dal piano a ciascun vertice. La distanza d del vertice
(x, y, z) dal piano è:
Ax + By + Cz + D
d = √
A2 + B 2 + C 2
La distanza cosı̀ calcolata può essere sia positiva che negativa, a seconda del lato del punto rispetto
al piano. L’equazione del piano non è unica, qualsiasi costante moltiplicativa k non nulla cambia i
coefficienti ma non il piano. E’ spesso conveniente memorizzare i coefficienti in modo che la normale
sia normalizzata, ovvero moltiplicando per una costante
1
k = √
A + B2 + C 2
2
col che anche la distanza d viene calcolata più semplicemente, essendo il denominatore uno.
Fig. 5.19. Se i valori ammessi di t tendono all’infinito la famiglia di curve diventa una superficie. Se
i Gi(t) sono polinomi cubici, allora la superficie è chiamata superficie bicubica parametrica.
Assumendo quindi che gli elementi del vettore geometrico Gi(t) siano polinomi cubici ne segue che
essi possono essere rappresentati come Gi(t) = T · M · Gi, dove Gi = [ gi1 gi2 gi3 gi4 ]T.
Trasponiamo ora l’equazione Gi(t) = T · M · Gi usando l’identità (A · B · C)T = C T · B T · AT :
Gi(t) = GT T
i ·M ·T
T
= [ gi1 gi2 gi3 gi4 ] · MT · TT
Sostituendo ora nell’Eq. 5.3 per ciascuno dei quattro elementi del vettore G(t) si ottiene
g11 g12 g13 g14
g21 g22 g23 g24
Q(s, t) = S · M · · MT · TT
g31 g32 g33 g34
g41 g42 g43 g44
cioè
Q(s, t) = S · M · G · MT · TT , 0 ≤ s, t ≤ 1.
Scritte separatamente per x, y e z si ottiene
x(s, t) = S · M · Gx · M T · T T
y(s, t) = S · M · Gy · M T · T T
z(s, t) = S · M · Gz · M T · T T
Dalla forma generale, appena introdotta, passiamo ora alle superfici bicubiche parametriche
specifiche, che utilizzano diverse matrici geometriche e base.
R4(t) x
Le funzioni P1x e P4x definiscono la componente x dei punti di partenza e di arrivo per le curve nel
parametro s, mentre R1x e R4x sono le componenti x dei vettori tangenti in tali punti. Per ogni
valore di t vi sono quindi due punti terminali e due vettori tangenti. La Fig. 5.19 mostra P 1(t), P4(t)
e le curve cubiche in s che risultano per t = 0.0, 0.2, 0.4, 0.6, 0.8, 1.0.
Seguendo la derivazione vista nel caso generale si arriva a:
T
x(s, t) = S · MH · GHx · MH · TT
92 CAPITOLO 5. RAPPRESENTAZIONE DI FORME
ed analoghe per y e z.
Le tre matrici 4 × 4 GHx , GHy e GHz controllano la geometria della superficie di Ermete,
esattamente come il vettore geometrico GH controlla la curva. Gli elementi delle tre matrici possono
essere scritti nella forma seguente:
δ δ
x(0, 0) x(0, 1) δt x(0, 0) δt x(0, 1)
δ δ
x(1, 0) x(1, 1) δt
x(1, 0) δt
x(1, 1)
G Hx = δ
x(0, 0) δ x(0, 1) δ2 x(0, 0) δ2 x(0, 1)
δs δs δsδt δsδt
δ δ δ2 δ2
δs
x(1, 0) δs
x(1, 1) δsδt
x(1, 0) δsδt
x(1, 1)
La sottomatrice 2 × 2 nell’angolo in alto a sinistra contiene le coordinate x dei quattro spigoli della
superficie. Le due sottomatrici 2 × 2 in alto a destra e in basso a sinistra contengono le coordinate x
dei vettori tangenti lungo s e t agli spigoli, mentre la sottomatrice 2 × 2 in basso a destra definisce le
tangenti miste agli spigoli (dette twist). Questi ultimi quattro numeri controllano la forma interna
della supeficie, mentre gli altri dodici specificano il suo contorno (vedi Fig. 5.20). Da notare che le
prime due righe determinano i bordi per s = 0 e s = 1, mentre le prime due colonne determinano
i bordi per t = 0 e t = 1.
Figura 5.20 Componenti della matrice geometrica per una superficie di Ermete.
determinano la forma del contorno esterno, mentre i 4 punti interni hanno la stessa funzione dei twist
nel caso di Ermete, ovvero modificano la forma interna. Le superfici di Bezier hanno vantaggi nel
controllo interattivo (spostare i punti è più intuitivo che definire le tangenti), godono dell proprietà
del convex hull e sono facilmente divisibili, tutti vantaggi ereditati dalle corrispondenti curve.
Per unire due superfici di Bezier bisogna ovviamente che i 4 punti di controllo dello spigolo comune
siano gli stessi (continuità C 0 e G0) e che le derivate all’unione siano coincidenti (per C 1, allineate
per G1), cosa che si ottiene allineando i 4 punti a cavallo della linea di unione, come in Fig. 5.23. I
punti da allineare sono (P13, P14, P15), (P23, P24, P25), (P33, P34, P35) e (P43, P44, P45). Ciascona
tripla definisce due segmenti di retta allineati le cui lunghezze devono avere lo stesso rapporto nei
quattro casi per avere continuità G1 ed essere uguali per C 1‘. In figura è ovviamente mantenuta la
sola continuità G1.
ad essa. Inoltre l’equazione sopra può essere scritta in forma matriciale come:
P · Q · PT = 0
essendo P = [ x y z 1 ] e
a d f g
d b e h
Q =
f
e c j
g h j k
La superficie rappresentata da Q può essere facilmente scalata o ruotata: se M è una matrice 4 × 4
di trasformazione geometrica la nuova superficie trasformata si ottiene mediante
Q0 = M −1 · Q · (M −1 )T
df df df
La normale alla superficie di una funzione f(x, y, z) è il vettore [ dx dy dz ], più facilmente calcolabile
rispetto alle normali ad una superficie bicubica parametrica.
Le superfici superquadriche sono una estensione di quelle quadriche e permettono di definire
cilindri, elissoidi, tori e superfici iperboliche a una o due falde con in più la possibilità di modificarne
la forma rendendola tondeggiante, squadrata o ”a cuscino”.
Ad esempio una superficie toroidale è definita come
rx(a + cose1(η)) cose2(ω)
ρ(η, ω) = ry(a + cose1(η)) sine2 (ω)
rz sine1(η)
dove η e ω sono rispettivamente gli angoli di longitudine e latitudine. I valori di rx, ry ed rz sono
i raggi lungo i tre assi (la superficie deve poi essere traslata/ruotata a seconda delle esigenze, nella
forma appena vista è centrata nell’origine). I parametri e1 ed e2 controllano la forma risultante
(valgono 1 per il solito toro, meno di uno per squadrare, più di uno per appiattire): e1 influenza la
forma in direzione longitudinale, e2 in latitudine.
5.3. RAPPRESENTAZIONE DI VOLUMI 95
esempio il moto di un utensile di taglio (fresa) in 3D genera una volume di taglio che è uno sweep.
Che oggetto si genera ruotando la forma seguente attorno alla linea di base (tratteggiata) ?
Decomposizione a celle
Una delle forme più generali di partizione spaziale viene detto decomposizione a celle. Ogni sistema
basato su tale metodo definisce un insieme di celle primitive che sono tipicamente parametrizzate e
spesso curve. La decomposizione a celle permette di formare oggetti complessi da oggetti più semplici
(le primitive) collegandoli insieme. Tale operazione può essere pensata come una particolare forma
di unione in cui gli oggetti non devono intersecarsi. Ulteriori vincoli nell’operazione di collegamento
richiedono spesso che due celle condividano un solo punto, linea o faccia.
Figura 5.24 Le celle mostrate in a) possono essere usate (trasformate) per costruire lo stesso
oggetto in modi differenti, come in b) e c). Neanche l’uso di un solo tipo di cella garantisce l’unicità
della rappresentazione
2 3
Quadrant
0 1 numbering
P
1 3
0 2
P P P F
F P P E P E F P F F P P
F F E E F E F E F E F F F E F E F E F F F F F E
Figura 5.27 Albero che descrive l’oggetto in Fig. 5.26. Le lettere indicano: F (full) pieno, P
parzialmente pieno, E (empty) vuoto.
Figura 5.28 Numerazione degli ottanti in un albero ad otto nodi (l’ottante 0 non è visibile).
I quadranti sono spesso identificati dai numeri 0, 1, 2, 3, e gli ottanti con i numeri da 0 a 7. Ad
eccezione di alcuni casi particolari si può dimostrare che il numero di nodi in un albero quaternario o
in un albero ad otto nodi è proporzionale rispettivamente al perimetro o alla superficie dell’oggetto
da rappresentare. Ciò deriva dalla necessità di tener conto dei confini dell’oggetto da codificare. I
soli nodi interni che vengono suddivisi sono quelli attraverso cui passa parte del bordo. Pertanto
qualsiasi operazione su una di tali strutture dati (lineare nel numero di nodi contenuti) viene eseguita
in un tempo proporzionale alla dimensione del perimetro o dell’area.
Una variante possibile è la rappresentazione degli oggetti mediante semplici alberi binari, sia in
2 che in 3D (e, se serve, anche in più dimensioni). Invece di dividere lungo tutti gli assi ad ogni
nodo, una partizione dello spazio mediante albero binario divide ciascun asse, ad ogni nodo, in metà
equivalenti (ad un livello lungo x, al successivo lungo y eccetera). Un albero binario ha solitamente
più nodi rispetto ai corrispondenti alberi quaternari e alberi ad otto nodi, ma possiede all’incirca lo
stesso numero di foglie: la sua semplice struttura permette, per certe applicazioni, una formulazione
più agevole degli algoritmi.
La conversione fra la rappresentazione a voxel e quella ad albero a otto nodi e viceversa è molto
semplice, e spesso la rappresentazione ad albero è notevolmente più compatta (anche se è più difficile
da elaborare). Da notare che la rappresentazione dello stesso oggetto traslato o ruotato (anche di
poco) può dare origine ad alberi molto differenti. Poichè quadtree e octree sono stati abbastanza
di moda per un certo periodo, è possibile trovare facilmente in letteratura algoritmi per la loro
elaborazione ed immagazzinamento (ad esempio calcolare l’unione o la intersezione di due alberi, o
ruotare un albero di multipli di 90 gradi).