Sei sulla pagina 1di 25

Capitolo 5

Rappresentazione di forme: linee,


superfici e volumi

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).

5.1 Curve cubiche parametriche


Il modo più semplice per modellare una linea curva nello spazio o nel piano è quella di suddividerla
in una somma di segmenti di retta, meglio se più corti dove la curvatura è più alta (vedi Fig. 5.1).
Questo è il metodo più comunemente usato in grafica, ma ha dei difetti evidenti: in primo luogo i
segmenti si vedono, anche perchè l’occhio umano è molto sensibile alle alte frequenze e quindi agli
spigoli. Aumentare il numero di segmenti migliora le cose, ma al prezzo di una rappresentazione
meno compatta e di più difficile gestione (e comunque ce ne vogliono proprio tanti per renderli
invisibili). Inoltre la modifica interattiva di una linea descritta in questo modo è noiosa, poichè
bisogna posizionare a mano un gran numero di punti.

Figura 5.1 Una linea morbida e la sua approssimazione mediante segmenti.

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.

Possiamo riscrivere Q(t) in forma più compatta come:

Q(t) = [ x(t) y(t) z(t) ] = T · C

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

Se due segmenti di curva si uniscono, la curva risultante ha continuità geometrica G 0. Se la direzione


(ma non necessariamente il modulo) dei due vettori tangenti alla curva è la stessa nel punto di unione,
allora la curva ha continuità geometrica G1. Affinchè le curve abbiano un aspetto morbido, ovvero
non si notino i punti di unione, esse devono avere continuità geometrica almeno G 1 nei punti di
unione. Affinchè vi sia continuità geometrica G1 è necessario che i due vettori parametrici tangenti
siano uno un multiplo dell’altro, ovvero T1 = kT2 con k scalare maggiore di zero. Se i vettori
tangenti di due segmenti di cubica sono uguali nel punto di unione allora la curva ha continuità di
primo grado nel parametro t, o continuità parametrica C 1. Se la direzione ed il modulo di tutte le
derivate fino all’ordine n sono uguali nel punto di unione la curva possiede continuità parametrica
di ordine n, ovvero C n. Da notare come ciascun segmento di cubica sia ovunque continuo con tutte
le derivate continue (cioè è analitico, essendo un polinomio): la continuità che interessa è solo quella
nei punti di unione.
5.1. CURVE CUBICHE PARAMETRICHE 77

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 
  

m41 m42 m43 m44 G4


Poichè, in ogni tratto, gli elementi di M e di G sono costanti, il prodotto T · M · G produce dei
polinomi cubici in t. Enfatizzando il prodotto T · M (solo per la componente x(t)) si ottiene:
x(t) = (t3 m11 + t2m21 + tm31 + m41 )g1x +
(t3 m12 + t2m22 + tm32 + m42 )g2x +
(t3 m13 + t2m23 + tm33 + m43 )g3x +
(t3 m14 + t2m24 + tm34 + m44 )g4x +
Si vede che la curva si ottiene come somma pesata degli elementi del vettore geometrico, i pesi
esssendo le 4 funzioni fra parentesi tonda, che per tale motivo sono chiamate funzioni interpolanti o
blending functions.
Da notare la somiglianza di notazione rispetto alla approssimazione di primo grado (segmenti di
retta), nella quale ogni segmento è definito da due estremi e le funzioni interpolanti sono lineari:
x(t) = (1 − t)g1x + (t)g2x
Per vedere come si calcola la matrice base M vediamo ora un tipo specifico di curva cubica
parametrica.

5.1.1 Curve di Ermete (Hermite)


La forma di Ermete (dal nome del famoso matematico) delle curve cubiche parametriche è
determinata dai vincoli sui punti estremi P1 e P4 e sulle tangenti agli estremi R1 e R4. Per trovare
78 CAPITOLO 5. RAPPRESENTAZIONE DI FORME

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

x(0) = P1x = [0 0 0 1] · MH · GHx

x(1) = P4x = [1 1 1 1] · MH · GHx


Ricordando poi che la derivata di x(t) rispetto a t vale ẋ(t) = [3t2 2t 1 0] · MH · GHx i vincoli sulle
derivate agli estremi sono
ẋ(0) = R1x = [0 0 1 0] · MH · GHx
ẋ(1) = R4x = [3 2 1 0] · MH · GHx
I quattro vincoli possono essere espressi in forma matriciale nel seguente modo:
   
P1 0 0 0 1
 P4   1 1 1 1 
 R1  = GHx =  0 0 1 0  · MH · GHx
   

R4 3 2 1 0

Quindi MH è l’inversa della matrice indicata, ovvero:


 −1  
0 0 0 1 2 −2 1 1
 1 1 1 1   −3 3 −2 −1 
MH =   0 0 1 0 
 = 
 0

0 1 0 
3 2 1 0 1 0 0 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:

Q(t) = T · MH · GH = BH · GH = (2t3 − 3t2 + 1)P1 + (−2t3 + 3t2)P4 +


(t3 − 2t2 + t)R1 + (t3 − t2 )R4

Figura 5.3 Le quattro funzioni interpolanti di Ermete.

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.

5.1.2 Curve di Bézier


Questo tipo di curva cubica parametrica, che prende il nome da Pierre Bézier, viene specificata dai
due punti estremi (P1 e P4) e da ulteriori due punti (P2 e P3) che indirettamente specificano le
tangenti nei punti estremi (vedi Fig. 5.7). Il vettore dei vincoli geometrici di Bézier è quindi formato
da quattro punti:  
P1
 P2 
GB =   P3 

P4
I vettori tangenti agli estremi sono legati ai punti di controllo da:

R1 = Q̇(0) = 3(P2 − P1), R4 = Q̇(1) = 3(P4 − P3)

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:

Q(t) = T · MH · GH = T · MH · (MHB · GB ) = T · (MH · MHB ) · GB = T · MB · GB


5.1. CURVE CUBICHE PARAMETRICHE 81

Svolgendo il prodotto MH · MHB si ottiene MB :


 
−1 3 −3 1
 3 −6 3 0 
MB = MH · MHB =  
 −3 3 0 0 
1 0 0 0

Il prodotto Q(t) = T · MB · GB è

Q(t) = (1 − t)3P1 + 3t(1 − t)2 P2 + 3t2(1 − t)P3 + t3P4

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

geometrico delle B-Splines è:


 
Pi−3
 Pi−2 
GBsi = 
 Pi−1  ,
 3 ≤ i ≤ m.
Pi

Il primo segmento di curva, Q3 , è definito dai punti da P0 a P3 per valori di t fra t3 = 0 e t4 = 1.


Poichè ogni segmento di curva è definito da quattro punti di controllo, ne segue che ciascun punto di
controllo (ad eccezione dei primi e degli ultimi) influenza quattro tratti di linea (all’inizio ed alla fine
ne influenzano meno). Muovere un punto di controllo in una certa direzione muove fino a quattro
tratti di curva nella stessa direzione mentre gli altri tratti non vengono influenzati in alcun modo
(vedi Fig. 5.11 a sinistra). Questo mostra come le B-Splines godano della proprietà del controllo
locale.

Figura 5.11 Sinistra: una B-Spline al variare della posizione del punto di controllo P4. Destra: le
quattro funzioni interpolanti delle B-Splines.

Se definiamo Ti come il vettore riga [(t − ti )3 (t − ti)2 (t − ti ) 1], possiamo scrivere

Qi(t) = Ti · MBs · GBsi , ti ≤ i ≤ ti+1 .

L’intera curva si ottiene applicando questa formula per 3 ≤ i ≤ m.


La matrice base per le B-Splines è
 
−1 3 −3 1
1  3 −6 3 0 
MBs = 
6  −3 0 3 0 
1 4 1 0

La sua derivazione non viene qui riportata.


Le funzioni interpolanti (blending functions) delle B-Splines sono date dal prodotto T i · MBs e sono
mostrate in Fig. 5.11 a destra. Da notare come le funzioni interpolanti siano esattamente le stesse
per ogni segmento di curva, poichè l’intervallo del parametro t è lo stesso per ogni segmento. Siccome
le quattro funzioni sommano a uno e sono non negative, vale la proprietà del convex hull. E’ facile
vedere come le B-Splines cosı̀ definite garantiscano la continuità C 0, C 1 e C 2 nei punti di unione: se
non vi fidate potete a) fare i conti oppure b) guardare [FvDFH90].
La maggiore continuità offerta dalle B-Splines rispetto alle altre curve viste finora le rende migliori
alla vista, ma, come già detto, questo si paga con un minore controllo su dove passa la curva. La
curva può essere costretta ad avvicinarsi di più ad un punto di controllo od anche a passare per un
punto di controllo, ma il risultato non è molto piacevole (vedi Fig. 5.12).

5.1.4 Altre forme di splines


Esistono ovviamente molte altre forme di Splines, alcune delle quali si trovano su [FvDFH90], utili
nelle svariate applicazioni in cui sono usate. Un tipo che spesso viene usato anche in elaborazione
di immagini (per lo zoom interpolato di immagini, ad esempio) sono le Catmull–Rom (dette anche
84 CAPITOLO 5. RAPPRESENTAZIONE DI FORME

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

5.1.5 Suddivisione delle curve cubiche parametriche


Supponiamo di aver creato una serie di segmenti di curva per approssimare una certa forma e di
non riuscire, muovendo i punti di controllo, ad ottenere esattamente la forma voluta. Probabilmente
non vi sono abbastanza punti di controllo per ottenere l’effetto desiderato. Vi sono due modi per
aumentare il numero di punti di controllo: il primo è quello di elevare il grado delle curve, ad
esempio da tre a quattro. Questo tipo di aggiustamento è talvolta necessario, specie se si desidera
una continuità di grado elevato, ma spesso non è conveniente, in quanto la curva risultante oscilla
maggiormente (si aumentano i punti di inflessione in ogni singolo segmento).
Il secondo modo per aumentare il numero dei punti di controllo è quello di suddividere uno o più
segmenti di curva in due segmenti. Ad esempio un segmento di curva di Bézier con i suoi quattro
punti di controllo può essere diviso in due segmenti con un totale di sette punti di controllo (i due
nuovi segmenti condividono un punto di controllo). I due nuovi segmenti sono esattamente uguali
al segmento originale finchè nessuno dei punti di controllo viene variato. Un altro buon motivo per
suddividere le curve è quello di rendere efficiente il tracciamento delle stesse, come vedremo nella
prossima sezione.

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.

5.1.6 Conversione fra diverse rappresentazioni


E’ spesso necessario convertire una rappresentazione in un’altra. Data una curva rappresentata da un
vettore geometrico G1 e da una matrice base M1 si vuole cioè trovare in vettore geometrico equivalente
G2 per la matrice base M2 in modo tale che le due curve siano identiche: T · M2 · G2 = T · M1 · G1,
ovvero M2 · G2 = M1 · G1 . Risolvendo per G2 si ottiene

G2 = M2−1 · M1 · G1 = M1,2 · G1

Quindi la matrice che converte una rappresentazione in un’altra è M1,2 = M2−1 · M1 .


Ad esempio, la matrice che converte dalla B-Spline alla curva di Bézier vale:
 
1 4 1 0
1  0 4 2 0 

MBs,B = MB−1 · MBs =
6  0 2 4 0 
0 1 4 1

5.1.7 Tracciamento delle curve cubiche parametriche


Ci sono due metodi base per il tracciamento delle curve cubiche parametriche. Entrambi dividono
ciascun segmento di curva in segmenti di retta, che si sanno tracciare facilmente. Il primo metodo
prevede di valutare x(t), y(t) e, se del caso, z(t) in un numero fisso di punti ti equispaziati: ad
esempio 16 punti calcolati in ti = i/16 per i = 0, . . . , 15. Il secondo metodo è quello di suddividere la
curva ricorsivamente fermandosi quando i punti di controllo sono sufficientemente vicino alla curva
stessa.
Per quanto riguarda l’efficienza del primo metodo, che prevede il calcolo di f(t) = at 3 + bt2 + ct + d
(dove f(t) rappresenta x(t), y(t) e z(t)), si ha che il calcolo diretto richiede una somma per ottenere
il nuovo valore di t più due moltiplicazioni per ottenere t2 e t3 più tre moltiplicazioni e tre somme
per polinomio per un totale di 11 moltiplicazioni e 10 somme per ciascun punto 3D. Si può ridurre
leggermente utilizzando la regola di Horner per la fattorizzazione dei polinomi, ossia

f(t) = at3 + bt2 + ct + d = ((at + b)t + c)t + d

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

5.2 Rappresentazione di superfici


Per la rappresentazione delle superfici valgono ovviamente le stesse considerazioni fatte per le curve.
In particolare per quanto riguarda la rappresentazione parametrica. In questa sezione vedremo due
rappresentazioni di tipo parametrico, di primo e terzo grado, ed una rappresentazione implicita.
Tratteremo quindi le reti di poligoni, le superfici bicubiche parametriche e le superfici quadriche.

5.2.1 Reti di poligoni

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.

Figura 5.15 Una scena rappresentata in assonometria mediante reti di poligoni.

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

Rappresentazione delle reti di poligoni


Nel seguito verranno discussi tre tipi di rappresentazioni delle reti di poligoni: esplicita, con puntatori
ad una lista di vertici e con puntatori ad una lista di lati. Nella rappresentazione esplicita ciascun
poligono è rappresentato da una lista di coordinate di vertici:

P = ((x1 , y1, z1), ............, (xn, yn , zn)).

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:

V = ((x1, y1 , z1), ........., (xn, yn, zn)).

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.

Consistenza nelle rappresentazioni a reti di poligoni


Se la rete di poligoni non viene generata da modelli matematici (ed esempio per triangolazione di una
sfera di raggio dato) ma interattivamente o a partire da dati acquisiti può contenere errori. Pertanto
è necessario poter verificare che tutti i poligoni siano chiusi, che tutti i lati siano usati almeno una
volta ma non più di un massimo variabile a seconda dell’ applicazione e che ciascun vertice sia
collegato ad almeno due lati. In alcuni casi ci si aspetterà anche che la rete di poligoni sia totalmente
connessa (ovvero che ciascun vertice sia raggiungibile da ogni altro vertice muovendosi solo lungo i
lati), topologicamente planare o non avere buchi. Gli algoritmi di verifica sono abbastanza complessi
ed è molto difficile essere sicuri della totale correttezza di una rete di poligoni: comunque delle tre
rappresentazioni discusse quella con i lati definiti in modo esplicito è la più semplice da verificare,
poichè contiene più informazione rispetto alle altre.

Equazione del piano che contiene un dato poligono


Uno dei problemi classici lavorando con i poligoni nello spazio è quello di trovare il piano che
li contiene. Esistono applicazioni nelle quali il piano su cui giace un poligono è noto dalla sua
costruzione, ma in molti altri casi ciò non è vero. Un modo per trovare tale piano è quello di
utilizzare tre dei vertici del poligono. L’equazione di un generico piano nello spazio è

Ax + By + Cz + D = 0 (5.1)

I coefficienti A, B e C definiscono la normale al piano, [A B C].


Dati tre punti P1, P2 e P3 sul piano, la normale al piano può essere calcolata mediante il prodotto
vettoriale P1P2 × P1 P3 (oppure P2P3 × P2 P1 eccetera). Se il prodotto vettoriale è nullo vuol dire che
i tre punti sono allineati e non definiscono un piano. Se i tre punti erano i vertici di un poligono con
più di tre vertici è necessario sceglierne altri tre. Se il prodotto vettoriale non è nullo, D può essere
calcolato sostituendo la normale [A B C] e uno qualsiasi dei tre punti nell’Eq. 5.1.
Se in un poligono vi sono più di tre vertici, essi possono anche non essere complanari, sia per ragioni
di approssimazione numerica che per errori di costruzione: in questi casi la tecnica migliore è quella
di cercare il piano che meglio approssima i vertici, ovvero quello che passa più vicino ad essi. Per far
questo si può ricordare come i coefficienti A, B e C siano rispettivamente proporzionali alle aree (con
segno) delle proiezioni del poligono sui piani (y,z), (x,z) e (x,y). Ad esempio, se un poligono è parallelo
al piano (x,y), allora dal calcolo delle aree si ricava subito che A = B = 0, come ci si aspettava.
Questo metodo è migliore del calcolo basato su tre punti perchè non dipende dai particolari vertici
scelti, che possono essere non complanari con la maggior parte degli altri o allineati fra di loro. Per
90 CAPITOLO 5. RAPPRESENTAZIONE DI FORME

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.

5.2.2 Superfici bicubiche parametriche


Le superfici bicubiche parametriche sono la generalizzazione delle curve cubiche parametriche Q(t) =
T · M · G, dove G, il vettore dei vincoli geometrici, è costante. Come prima cosa, per convenienza
di notazione, chiamiamo s anzichè t il parametro, ottenendo Q(s) = S · M · G. Quindi permettiamo
agli elementi del vettore G di muoversi secondo un certo percorso (una linea) in 3D parametrizzato
in t, cioè:  
G1 (t)
 G2 (t) 
Q(s, t) = S · M · G(t) = S · M ·   G3 (t) 
 (5.3)
G4 (t)
Fissando t = t1, Q(s, t1 ) è una curva poichè G(t1) è costante. Se t assume un nuovo valore, ad esempio
t2 essendo t1 − t2 molto piccolo, si ottiene una nuova curva Q(s, t2) molto simile alla precedente. Se
si scelgono molti valori del parametro t fra 0 e 1, si ottiene una famiglia di curve, come mostrato in
5.2. RAPPRESENTAZIONE DI SUPERFICI 91

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.

Figura 5.19 Linee a valori costanti di t.

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.

Superfici bicubiche parametriche di Ermete (Hermite)


Le superfici di Ermete sono completamente definite dalla matrice geometrica GH di dimensioni
4 × 4. La sua derivazione, che segue quanto appena visto per il caso generale, parte dalla definizione
di curva cubica parametrica di Ermete sostituendo i valori costanti nel vettore geometrico con altre
curve cubiche di Ermete. Riscrivendo in questo modo (solo per la componente x) l’equazione della
curva di Ermete si ottiene
 
P1 (t)
 P4 (t) 
x(s, t) = S · MH · GHx (t) = S · MH ·   R1(t) 

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.

Le superfici bicubiche parametriche di Ermete permettono la continuità C 1 e G1 fra le diverse


componenti, esattamente come era per le curve. Per ottenere questo bisogna innanzitutto che le curve
di bordo siano le stesse (continuità C 0), ovvero che i punti di controllo siano identici lungo la curva di
unione. Per avere continuità C 1 bisogna poi che le tangenti attraverso la linea di contorno (compresi
i twist) siano uguali (per continuità G1 basta che siano uguali le direzioni, ma non i moduli). Se
il bordo di unione per la superficie uno è quello a s = 1 e quello per la due è a s = 0, come
in Fig. 5.21, per avere continuità G1 la prima riga della matrice geometrica della superficie 2 deve
essere uguale alla seconda riga della matrice geometrica della superficie 1, mentre la terza riga deve
essere proporzionale alla quarta (con coefficiente di proporzionalità maggiore di zero). Quindi
  
− − − − g21 g22 g23 g24
 g21 g22 g23 g24   − − − − 
   k > 0
 − − − −   kg41 kg42 kg43 kg44 
g41 g42 g43 g44 − − − −
Il coefficiente k deve ovviamente valere 1 per avere continuità C 1. Le condizioni per avere unione
continua lungo altri spigoli sono ovviamente analoghe.

Superfici bicubiche parametriche di Bézier


La derivazione delle superfici di Bezier è del tutto analoga a quella delle superfici di Ermete. La
matrice geometrica GB contiene 16 punti, mostrati in Fig. 5.22. Ovviamente i 12 punti sul contorno
5.2. RAPPRESENTAZIONE DI SUPERFICI 93

Figura 5.21 Due superfici unite.

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.

Figura 5.22 I 16 punti di controllo per una superficie di Bezier.

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.

5.2.3 Superfici quadriche e superquadriche


Le superfici quadriche sono quelle definite in modo implicito da un’equazione del tipo f(x, y, z) =
0, dove f è un polinomio quadrico in x, y, z. Le superfici quadriche permettono una facile
rappresentazione di superfici semplici, come sfere, elissoidi e cilindri. Esse sono definite in generale
da
f(x, y, z) = ax2 + by2 + cz 2 + 2dxy + 2eyz + 2fxz + 2gx + 2hy + 2jz + k

Se a = b = c = −k = 1 ed i restanti coefficienti sono nulli allora l’equazione sopra definisce


una sfera. Se tutti i coefficienti da a ad f sono nulli la supeficie risultante è un piano. Questo
tipo di rappresentazione risulta particolarmente adatto per particolari applicazioni, ad esempio per
modellare molecole (rappresentate solitamente come catene di sfere), ed è spesso integrato in sistemi
di modellazione solida. I motivi che possono rendere opportuno rappresentare superfici in questo
modo sono la compattezza della rappresentazione, la velocità nel disegno, la facilità per calcolare la
normale in un punto o per controllare se un dato punto è sulla superficie o interno/esterno rispetto
94 CAPITOLO 5. RAPPRESENTAZIONE DI FORME

Figura 5.23 Due superfici di Bezier unite.

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

5.3 Rappresentazione di volumi


Le superfici 3D viste finora permettono la definizione di oggetti nello spazio specificandone la
superficie esterna e spesso questo è tutto ciò che serve in applicazioni di grafica. Vi sono però
numerose applicazioni, sia in grafica che in altri campi, in cui la definizione degli oggetti deve
essere più accurata, sia perchè è necessario modellare anche l’interno dell’oggetto che per poter
applicare algoritmi che necessitano di informazioni volumetriche, ad esempio per stabilire relazioni
di interno/esterno o per controllare posibili intersezioni (in generale non è molto facile stabilire se
un insieme di superfici 3D delimita un volume nello spazio senza errori).
Nella progettazione assistita, ad esempio, si usa l’analisi ad elementi finiti per calcolare la risposta
a fattori quali l’applicazione di forze o di gradienti di temperatura ad un certo manufatto, le cui
proprietà volumetriche devono essere note. Una rappresentazione volumetrica accurata può inoltre
rendere possibile la generazione automatica delle istruzioni alle macchine a controllo numerico che
realizzeranno tale oggetto, come è abbastanza comune nella progettazione meccanica. Nella TAC,
tomografia assiale computerizzata, i dati che si ottengono riguardano proprietà (tipicamente la
densità) di tipo volumetrico, campionate in x, y e z, che devono essere memorizzate, elaborate
e visualizzate in modo efficiente. Anche in grafica può essere necessario modellare i volumi, ad
esempio per la gestione della rifrazione o per rendere verosimili le animazioni di oggetti complessi
(dal motore di automobile al corpo umano).
Le proprietà che, in generale, uno schema di rappresentazione volumetrica dovrebbe avere sono
piuttosto stringenti: i) deve poter rappresentare un largo numero di oggetti del mondo reale, ii) non
deve essere ambiguo, ovvero ad un dato modello deve poter essere associato un solo oggetto fisico,
iii) deve essere accurato, nel senso di poter rappresentare gli oggetti senza approssimazione (o con
approssimazione controllata), iv) dovrebbe essere unico, ovvero tale che un dato oggetto possa essere
rappresentato in un solo modo (cosı̀ è facile effettuare i test di uguaglianza), v) deve essere semplice
costruire la rappresentazione di un oggetto, anche in modo interattivo, vi) dovrebbe essere impossibile
creare una rappresentazione invalida, cioè un modello formalmente corretto che non corrisponde ad
alcun oggetto, vii) deve permettere la rotazione, scalamento ed altre trasformazioni del modello
senza distruggere la validità dell’oggetto, viii) deve essere compatto, in modo da risparmiare spazio
in memoria, ix) deve permettere lo sviluppo di algoritmi efficienti per il calcolo delle proprietà fisiche
di interesse del solido e x) deve permettere la visualizzazione grafica del modello in modo efficiente.
Progettare uno schema di rappresentazione volumetrica che goda di tutte le proprietà elencate è
molto difficile, anche in campi di applicazioni limitati. Vi sono quindi diversi modi di rappresentare
i volumi, ciascuno con vantaggi e svantaggi a seconda della applicazione. Ne vedremo alcuni, i più
usati, in modo da avere una panoramica generale del problema (senza pretesa di esaustività).

5.3.1 Uso di primitive (Primitive Instancing)


In questo caso il sistema di modellazione definisce un insieme di primitive (solidi 3D) rilevanti per
l’area di applicazioni alle quali si rivolge. Queste primitive sono parametrizzate non solo in termini di
trasformazioni geometriche, ma anche in modo mirato. Ad esempio per la progettazione meccanica
si può pensare di definire una primitiva Ingranaggio i cui parametri sono il diametro, il numero di
denti, lo spessore e pochi altri, o addirittura il cui unico parametro è il numero di catalogo della
ditta che li fornisce. In generale questo metodo è spesso usato per oggetti relativamente complessi
che sono noiosi da definire come combinazione di semplici forme geometriche e che sono facilmente
caratterizzati da un piccolo numero di parametri ad alto livello. Lo svantaggio di sistemi di questo
tipo è che non è possibile creare nuove primitive senza scrivere il codice che le definisce (e, per inciso,
anche quello che le visualizza e ne calcola le proprietà).

5.3.2 Estrusione (Sweep Representations)


Il concetto base è quello di prendere un oggetto e di muoverlo nello spazio lungo una traiettoria.
L’insieme dei punti successivamente occupati definisce un nuovo oggetto. Ad esempio ruotare di
180 gradi un disco attorno ad un suo diametro definisce una sfera. Se l’oggetto è un’area 2D e la
traiettoria è rettilinea e perpendicolare al piano dell’oggetto si ha una estrusione (o translational
sweep). Molti oggetti di tipo industriale sono effettivamente realizzati secondo tecniche simili, ad
esempio spingere della pasta attraverso un foro circolare genera gli spaghetti (come ben comprende
chi ha giocato con il Didò). Questa tecnica si rivela molto potente per certi tipi di oggetti e può
essere ancora più generale permettendo alla forma base di variare durante il movimento. Inoltre è
molto naturale per descrivere certe tecniche di costruzione industriali anche non di estrusione, ad
96 CAPITOLO 5. RAPPRESENTAZIONE DI FORME

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) ?

5.3.3 Rappresentazioni a partizioni spaziali


Nelle rappresentazioni a partizioni spaziali ciascun solido è decomposto in un insieme di solidi di
tipo più semplice tali da essere adiacenti e con intersezione nulla: a tali solidi viene dato il nome
di primitive, che possono variare tra loro per forma, dimensioni, parametrizzazione ed orientazione
(avete presente il Lego ?). La differenza con la tecnica di Primitive Instancing vista in precedenza è
che qui un solido è definito dall’unione di semplici primitive, mentre allora era UNA primitiva.

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

Sebbene la rappreasentazione tramite decomposizione a celle di un oggetto sia priva di ambiguità,


essa non è unica, come risulta in Fig. 5.24, il che può rendere difficile anche la semplice verifica se
due solidi sono uguali. Le decomposizioni a celle hanno inoltre la caratteristica di essere difficilmente
verificabili in consistenza, poichè ciascuna coppia di celle dovrebbe teoricamente essere controllata
onde verificare l’effettiva assenza di intersezione. Ciononostante è un metodo di estrema importanza
per l’analisi ad elementi finiti.

Valutazione dell’occupazione spaziale (voxel)


La valutazione dell’occupazione spaziale è un caso particolare della decomposizione a celle nella quale
il solido è suddiviso in celle identiche disposte in una griglia 3D fissa di forma regolare. Tali celle
sono spesso dette voxel (elementi di volume) in analogia ai pixel (elementi di superficie).
La Fig. 5.25 evidenzia un oggetto tridimensionale rappresentato attraverso la valutazione
dell’occupazione spaziale. Il tipo più comune di cella è un cubo, e la rappresentazione dello spazio
come ”matrice di cubi” viene detta cuberille. La codifica naturale di un solido per mezzo dei voxel è
quindi una matrice 3D in cui ciascun elemento è un bit, che indica se il corrispondente voxel è pieno
(occupato dall’oggetto) o vuoto. Per modellare un oggetto l’unica cosa da fare è decidere quali celle
sono occupate e quali non lo sono (il che non è esattamente il massimo per applicazioni interattive
!). In tale rappresentazione è facile stabilire quali voxel sono sulla superficie e quali interni, come
anche determinare l’adiacenza tra oggetti diversi.
5.3. RAPPRESENTAZIONE DI VOLUMI 97

Figura 5.25 Un toro rappresenteto a voxel.

La valutazione dell’occupazione spaziale viene spesso utilizzata in applicazioni biomediche per la


rappresentazione di dati volumetrici ottenuti da fonti quali la Tomografia Assiale Computerizzata:
in questi casi il singolo voxel può contenere più di un bit di informazione, ad esempio 8 bit possono
codificare l’informazione di densità A fronte dei suddetti vantaggi la valutazione dell’occupazione
spaziale ha intrinsecamente un certo numero di difetti, analogamente alla rappresentazione di una
forma bidimensionale attraverso una bitmap ad 1 bit. Ad esempio non c’è alcuna informazione
di ”occupazione parziale” e conseguentemente molti solidi possono soltanto essere approssimati: il
toroide di Fig. 5.25 ne è un chiaro esempio. Se le celle sono costituite da cubi, allora i soli oggetti
che è possibile modellare esattamente sono quelli aventi facce parallele ai lati dei cubi stessi e i cui
vertici cadano esattamente sulla griglia. Analogamente ai pixel in una bitmap le celle possono in
linea di principio essere piccole a piacere al fine di incrementare l’accuratezza di rappresentazione,
ma l’occupazione di memoria diventa un paramero fondamentale dal momento che aumenta con i
cubo della risoluzione lineare. Altri problemi derivano da fatto che la rappresentazione a voxel non è,
in generale, invariante alla rotazione (la rappresentazione dello stesso oggetto diversamente ruotato
rispetto agli assi può avere un diverso numero di voxel occupati).

Alberi ad otto nodi (Octrees)


Gli alberi ad otto nodi o octrees sono una variante gerarchica rispetto alla valutazione
dell’occupazione spaziale (voxel), pensati per ridurre la richiesta di memoria necessaria con tale
tecnica. Derivano dagli alberi quaternari o quadtrees, modello usato nella codifica di immagini
bidimensionali.

Figura 5.26 Un oggetto rappresentato usando i pixel (a sinistra) e mediante quadtree.

Un albero quaternario si ricava dividendo successivamente una parte di piano bidimensionale


(solitamente un quadrato) in entrambe le dimensioni onde formare quadranti uguali, come mostrato
in Fig. 5.26. Ciascun quadrante può essere pieno, parzialmente pieno oppure vuoto a seconda di
quanto il quadrante interseca l’area. Un quadrante parzialmente vuoto è diviso ricorsivamente in
sottoquadranti. Tale suddivisione continua fino a quando si giunge ad avere omogeneità in tutti i
quadranti (completamente pieni o completamente vuoti), oppure sino al momento in cui si raggiunge
una prefissata profondità nell’albero.
Nella Fig. 5.26 ogni nodo che risulti parzialmente pieno giunti alle foglie dell’albero viene
considerato come se fosse completamente pieno. Le suddivisioni successive sono memorizzate in
un albero avente quadranti parzialmente vuoti nei nodi interni e quadranti pieni o vuoti alle foglie,
come mostrato in Fig. 5.27.
98 CAPITOLO 5. RAPPRESENTAZIONE DI FORME

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.

L’albero ad otto nodi è simile all’albero quaternario ma partiziona ricorsivamente lo spazio


(anzichè il piano) in ottanti (anzichè quadranti), come indicato in Fig. 5.28).

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).