Sei sulla pagina 1di 11

Novembre 2006

Bézier vs Spline
Progetto di Geometria Computazionale
di
Mauro Gentile

Manuale BACK Applet

Teoria

Introduzione

Lo scopo di questa applicazione è lo studio ed il confronto delle curve di Bézier e delle B-


Spline. Per riuscire a cogliere le differenze tra questi due tipi di curve, è necessario
sicuramente comprendere cosa sono e come queste vengano costruite.

Curve di Bézier

Le curve di Bézier sono una tipologia di curve polinomiali, forse il tipo più importante. Esse
sono definite tramite un poligono di controllo in un intervallo:
I = [0,1].
Il grado della curva è determinato dal valore K = n-1, con n uguale al numero di vertici del
poligono di controllo.

Definizione

Data una sagoma definita da n+1 punti, detti vertici di controllo, si costruisce la spezzata che li
interpola, tale spezzata è chiamata poligono di
controllo.
Si definisce Curva di Bézier la combinazione lineare tra i vertici di controllo Vi ed i pesi Bni(t):

con n = grado della curva.

Analizziamo di seguito diversi esempi di curve di grado differente e cerchiamo di capire


quale siano gli algoritmi che ne permettono la costruzione.

Grado = 1

Una curva di Bézier di grado pari ad uno corrisponde ad un tratto di retta.


Il poligono di controllo è costituito chiaramente da due solo punti P0 e P1.
Siano ad esempio P0 e P1 due punti di un piano, la curva di Bézier avrà funzione pari a:
P(t) = P0 + t*(P1-P0) = (1-t)*P0 + (t)*P1
Grado = 2

Una curva di Bézier di grado pari a due corrisponde ad un arco di parabola.


Il poligono di controllo è costituito chiaramente da tre punti P0, P1 e P2. La funzione calcolata
in precedenza non si può adattare per essere adoperata con tre punti, invece di due. È
sicuramente necessario un passaggio ulteriore. Occorre creare due curve ausiliare di grado
inferiore (grado 1), ottenute dal poligono di partenza. Queste due curve saranno date dai
segmenti P0P1 e P1P2. Vediamo come procedere.
Considerato un valore t all'interno dell'intervallo I = [0,1], si ottengono due punti all'interno dei
due segmenti sopra indicati P0P1 e P1P2, che chiameremo P01 e P11. Unendo i due punti P01 e
P11 si ottiene un ulteriore segmento P01 P11 detto poligonale di primo livello e calcolato quindi
in questo modo:

(0,t,1) = (Pn, Pn1, Pn+1) con n = 0 oppure 1


Sul segmento così creato, si definisce un ulteriore punto, sempre in funzione di t, che è proprio
quello corrispondente alla curva di Bézier di grado 2 per quel determinato valore assunto da t.
L'algoritmo procede allo stesso modo per ogni valore di t compreso nell'intervallo I = [0,1],
permettendo di ottenere quindi la curva desiderata.
La curva avrà dunque funzione:
P01(t) = (1-t)*P0 + (t)*P1
P11(t) = (1-t)*P1 + (t)*P2
P02(t) = (1-t)*P01(t) + (t)*P11(t) = (1-t)2*P0 + 2(1-t)(t)*P1 + (t2)*P2

La struttura è chiaramente ricorsiva. Questo è


molto più evidente nella visualizzazione a piramide capovolta che permette di capire
immediatamente quali sono i punti coinvolti e come lavora l'algoritmo.

Grado = 3

Una curva di Bézier di grado pari a tre ha un poligono di controllo che è costituito da quattro
punti P0, P1, P2 e P3.
In questo caso il procedimento è analogo a quello del punto precedente solo che bisogna
raggiungere comunque curve di grado uno su cui operare e quindi sarà necessario un ulteriore
passaggio, fino ad ottenere la funzione:
P03(t) = (1-t)3*P0 + 3(1-t)2(t)*P1 + 3(1-t)2(t2)*P2 + (t3)*P3
La struttura è ancora quindi ricorsiva.

La curva risultante è la seguente:


A questo punto possiamo essere certi di avere intuito come procede l'algoritmo. Vediamo
dunque quali sono i due metodi equivalenti per costruire una curva di Bézier.

Algoritmo di De Casteljau
Questo algoritmo è proprio quello applicato negli esempi soprastanti. Partendo da un poligono
di controllo < P0,...,Pk>, si vengono a formare delle poligonali man mano di grado inferiore.
Quindi si passa ad una poligonale con (k-1) punti, poi ad una con (k-2) punti e così via, fino ad
ottenere un unico punto che è proprio il punto della curva di grado corrispondente al valore di t
all’interno dell’intervallo I = [0,1] scelto.
Calcolando tutti i punti della curva, corrispondenti quindi ai diversi valori di t all’interno
dell’intervallo, si ottiene la curva di Bézier desiderata.

L'algoritmo
di De Casteljau è un algoritmo ricorsivo, come già specificato in precedenza, che non è
conveniente in termini di calcolo computazionale in quanto necessita di calcolare numerosi
punti intermedi prima di ottenere il punto della curva.
Per costruire una curva di Bézier conviene usare l'algoritmo che adopera i polinomi
di Bernstein.

Polinomi di Bernstein
Osservando con attenzione le formule degli esempi soprastanti, soprattutto quelle per le curve
di Bézier di grado 2 e di grado 3, si nota che i polinomi (1-t) e t sono sempre presenti, corredati
da un coefficiente ed un esponente. È evidente inoltre che questi polinomi dipendono
chiaramente dal grado della curva in esame. I polinomi di Bernstein sono quindi così definiti:
con i = 0...k e k = grado della curva.

I polinomi di Bernstein hanno una importante caratteristica: la loro somma è sempre pari ad 1;
questo garantisce che per trasformare la curva tramite una affinità è sufficiente trasformare i
vertici del poligono di controllo.
La curva di Bézier ottenuta con i polinomi di Bernstein è dunque così definita:
Uniformare il grado di due curve
Per uniformare il grado di due curve di Bézier bisogna aggiungere
opportunamente dei punti al poligono di controllo della curva di grado
minore per portarla allo stesso grado della curva con cui si vuole
uniformarla.
Ad esempio:
Supponiamo di avere una curva di grado 1 ed una curva di grado 3. Bisogna aggiungere due
punti al poligono di controllo della curva di grado 1. I due nuovi punti devono essere
equidistanti da P0 e P1, dividendo il segmento P0P1 in tre parti uguali. Quindi si ha un poligono
di controllo formato da quattro punti allineati che genera una curva di grado 3.

Conclusioni
Lo studio delle curve di Bézier porta alle seguenti conclusioni:
• L'intervallo di una curva è sempre I = [0,1]
• Il primo punto coincide con P0, è proprio P0
• L'ultimo punto coincide con PK, è proprio PK
• La curva non passa mai per altri punti intermedi del poligono
di controllo
• La curva di Bézier è sempre contenuta all'interno dell'involucro
convesso del poligono di controllo
• Trasformare il poligono di controllo equivale a trasformare
l'intera curva
• Non esiste controllo locale
• Risulta impossibile costruire curve pari a circonferenze
• Per incollare curve diverse bisogna uniformarne i gradi.

Curve B-Spline
Le curve spline sono delle curve composte da altre curve. Esse sono dette
perciò curve composite. Una curva spline è costruita congiungendo curve
polinomiali mantenendone continuità e regolarità. In genere il tipo di
continuità adottato è di tipo C2, questo significa che l'ultimo punto della
curva antecedente ed il primo punto della curva successiva coincidono e la
tangente e la curvatura delle due curve in quel punto è identica. In pratica
questo significa che in quel punto, in cui le due curve coincidono, si ha lo
stesso valore della derivata prima e della derivata seconda.
Le curve B-Spline si distinguono dalle spline perché sono in realtà un caso particolare in cui
come curve polinomiali vengono adoperate le curve di Beziér.
Questa tipologia di curve spline si suddivide in tre differenti categorie: B-Spline uniformi, non
uniformi e nurbs.
Le B-Spline uniformi sono parametrizzate su intervalli di lunghezza unitaria.
Le B-Spline non uniformi sono invece parametrizzate su intervalli di tipo differente. Nella
terza categoria, oltre ad essere parametrizzate su intervalli differenti, le funzioni utilizzate sono
razionali, ossia sono definite come rapporto di funzioni polinomiali.
Definizione
Le spline sono oggetti fisici che risalgono alla seconda metà del novecento; si trattava di un
righello elastico utilizzato dagli ingegneri per costruire delle determinate curve interpolanti. La
forma ottenuta era quella che minimizzava l'energia elastica dell'oggetto, Cioè quella che
minimizza il quadrato della curvatura:

Poiché la curvatura dipende dalle derivate


prime e seconde, la spline risulta
essere un polinomio interpolante di grado
3 con il massimo delle continuità
possibili: classe C2. Vista in questo modo l'analogia con le funzioni polinomiali a tratti risulta
essere immediata.

Funzioni polinomiali a tratti


Consideriamo un intervallo I=[a, b], applichiamo una partizione fino ad ottenere un vettore t =
[t0 = a, t1, … , tn = b]. Su ogni intervallo definiamo un polinomio di ordine K

Naturalmente diverse
partizioni
identificano polinomi
diversi, una volta fissato l'ordine. L'insieme S'K,t delle funzioni così definite è uno spazio
vettoriale. Come è intuitivo pensare, su ogni intervallo possiamo considerare un qualunque
polinomio; quindi è possibile costruire diverse curve. Ogni polinomio di grado K è una
funzione di classe almeno CK-1; quindi per le funzioni polinomiali a tratti, globalmente è
sensato chiedere la continuità della (K - 1)esima derivata; in questo modo otteniamo un
sottospazio SK,t: lo spazio delle spline.
Vogliamo trovare una base, Bi,K per questo sottospazio SK,t; tale che ogni spline
possa essere scritta come combinazione lineare degli elementi della base:

Ordine = 1
Il grado è nullo, le funzioni sono quindi rette parallele all'asse x.
Vogliamo dei polinomi costanti
a tratti.

La generica spline della base avrà forma:

Ordine = 2
La generica spline è una spezzata:

Le spline della base possono


essere ottenute come
combinazioni lineari degli elementi della base precedente:
Il grafico della spline di base risulterà essere un triangolo isoscele se la partizione
è equispaziata, altrimenti risulterà scaleno. Notiamo che agli estremi dell’intervallo la base è
sempre nulla. Inoltre la dimensione dello spazio è 5, ma abbiamo a disposizione solo 3
elementi di base, bisognerà quindi aggiungerne altri 2.

Ordine = 3
Osserviamo che il numero di
intervalli presi in
considerazione per costruire la base aumenta come l'ordine del polinomio da costruire. Questo
fa sì che in ogni intervallo ci siano tre pezzi di parabola; e come per il caso di ordine 2 gli
elementi trovati non sono sufficienti per creare una base, dobbiamo completarla con 4
elementi: due a destra e due a sinistra dell'intervallo I = [a,b].

Ordine K generico
In generale mancheranno 2*(K-1) elementi per definire la base: K- 1 a destra dell'intervallo e
K- 1 a sinistra. Si dovrà, quindi, agire sulla partizione per aggiungere questi elementi.

Dopo l’analisi svolta, volgiamo la nostra attenzione alle curve B-Spline uniformi che sono il
tipo di curve adoperate all’interno del progetto.

B-Spline uniformi
Una curva B-Spline uniforme approssima una poligonale, data dai vertici di un poligono di
controllo in cui essa è coscritta.
Supponiamo di avere un poligono di controllo formato da n+1 punti, la curva B-Spline
approssima n+1 punti P0,P1,…,Pn.
Ad esempio, se supponessimo di avere un poligono di controllo formato da solamente 4 punti
<P0,P1,P2,P3>, la B-Spline sarà formata da un’unica curva di Bézier di grado 3; difatti in questo
caso non ci sarà alcuna differenza tra una B-Spline uniforme cubica ed una curva di Bézier
relative allo stesso poligono di controllo.
Il grado di una curva è assolutamente indipendente dal poligono di controllo e dal numero di
vertici in esso presenti.
Le funzioni spline di base sono definite a partire dai nodi, una sequenza non decrescente di
n+1 numeri reali <t0,t1,t2,…,tn>, detta “sequenza dei valori nodali”. L’intervallo dei parametri
tra valori successivi all’interno della sequenza in generale non è necessariamente costante, anzi
valori nodali successivi possono addirittura coincidere. Nel caso di spline uniformi come
quelle presentate all’interno di questo progetti vengono fatti collassate i primi g e gli ultimi g
nodi, dove g è il grado della curva, e gli intervalli valgono sempre 1.
Ad esempio, una sequenza del tipo <0,0,0,1,2,3,4,4,4> è del tutto lecita ed è difatti una
sequenza adoperata all’interno del progetto sviluppato, in cui i vertici più esterni del poligono
di controllo toccano la curva di grado 3.
In genere infatti le curve spline non passano né toccano il poligono di controllo nei suoi vertici,
nemmeno nel vertice iniziale o quello finale, al contrario di ciò che avviene per le curve di
Bézier. Esiste la possibilità però che questo accada. Se la molteplicità del numero di nodi è
pari al grado g della curva, la curva allora passerà in quel punto. Questo significa che per far sì
che una B-Spline cubica passi per il punto iniziale e finale occorrerà una sequenza di nodi
simile a quella sopra adoperata nell’esempio precedente. La sequenza inizierà quindi con <
0,0,0,…> e terminerà con <…,4,4,4> se la curva è di grado g=3 o, nel caso del grado g=4, con
< 0,0,0,0,…> e <…,4,4,4,4>.
La sovrapposizione di nodi va ad influire direttamente sulla forma della curva, andandola a
modificare, sebbene il poligono di controllo rimanga identico.

Analizziamo ora
il legame tra i
nodi ed il poligono di controllo. Tra essi non esiste alcun legame particolare se non il fatto che
il numero M dei nodi è pari al numero N dei vertici del poligono di controllo sommati al grado
g della curva B-Spline:
M=N+g-1
A questo punto che abbiamo capito come funzionano le curve B-Spline e cosa le
caratterizzano, vediamo qual è l’algoritmo adoperato per costruirle.

Algoritmo di De Boor
Le curve vengono definite per mezzo della seguente funzione:

con N = m + 1
Bisogna però prestare attenzione. I polinomi
qui indicati, non sono quelli di Bernstein, ma
quelli calcolati per mezzo delle formule ricorsive di De Boor:

Il programma sviluppato utilizza una convenzione ben specifica: tutte le curve spline costruite
sono di grado 3, eccezion fatta nel caso si modifichi il valore tramite l’opzione “Ordine”, in
questi casi i primi 3 nodi della sequenza vengono collassati, così come gli ultimi 3, mentre i
nodi intermedi sono equidistanti e il loro valore è man mano incrementato di 1. Ad esempio,
una sequenza potrebbe essere <0,0,0,1,2,3,4,4,4>.
Essendo così definite, le curve B-Spline così costruite passano necessariamente per i punti
estremi del poligono di controllo.

Curve di Bézier vs Curve B-Spline


Analizziamo qui di seguito quali sono i punti che accomunano le curve di
Bézier e le B-Spline e quali invece le differenze:
1. La curva è contenuta all'interno dell'involucro convesso del poligono di
controllo?
 Bezier: SI
 B-Spline: SI
2. Qual è l'intervallo I su cui vengono calcolate?
 Bezier: I=[0,1]
 B-Spline: I=[a,b]
3. Come si lega il grado della curva rispetto al poligono di controllo?
 Bezier: Grado = Numero di vertici - 1
 B-Spline: Indipendente dal poligono di controllo
4. La curva tocca il poligono di controllo?
 Bezier: Si, nel primo e nell'ultimo punto
 B-Spline: No, ma si può far si che lo faccia, facendo collassare
tanti nodi quanto il grado della curva difatti si può farla passare
per qualsiasi punto del poligono.
5. La forma della curva e del poligono sono in qualche modo correlate?
 Bezier: No, solo in modo molto approssimato
 B-Spline: Si e anzi li si può addirittura far coincidere, con
particolari accorgimenti
6. Si può avere una trasformazione affine sulla curva?
 Bezier: Si, operando sui vertici del poligono di controllo
 B-Spline: Si, operando sui vertici del poligono di controllo
7. Si può avere il controllo locale sulla curva?
 Bezier: NO
 B-Spline: SI
8. Si possono disegnare delle circonferenze?
 Bezier: NO
 B-Spline: Si, adoperando curve razionali.