Derivate di una curva di Bézier

Per calcolare vettori tangenti e normali ad una curva di Bézier in un punto dobbiamo calcolare le derivate prima e seconda in quel punto. Fortunatamente il calcolo delle derivate di una curva di Bézier in un punto è semplice.

Ricordiamo che la curva di Bézier definita per mezzo degli n + 1 punti di controllo P0, P1, ..., Pn è rappresentata dalla seguente equazione:

dove Bn,i(u) è definito come

Poiché i punti di controllo sono costanti e indipendenti dalla variabile u, il calcolo della curva della derivata C'(u) si riconduce al calcolo delle derivate dei Bn,i(u). Dopo qualche semplice manipolazione algebrica abbiamo il seguente risultato per B'n,i(u):

Quindi calcolando la derivata della curva C(u) si ottiene:

Siano Q0 = n(P1 - P0), Q1 = n(P2 - P1), Q2 = n(P3 - P2), ..., Qn-1 = n(Pn - Pn-1). L'equazione sopra si riduce alla seguente:

Pertanto la derivata di C(u) è una curva di Bézier di grado n - 1 definita per mezzo dei punti di controllo n(P1 - P0), n(P2 - P1), n(P3 - P2), ..., n(Pn - Pn-1). Questa curva viene solitamente chiamata come l'odografo della curva originaria di Bézier. Notare che Pi+1 - Pi è il vettore direzione da Pi a Pi+1 e n (Pi+1 - Pi) è n volte più lungo del vettore direzione. Una volta noti i punti del poligono di controllo, i punti di controllo delle derivate si ottengono immediatamente. La figura di sinistra mostra una curva di Bézier di grado 7 e la figura di destra mostra la sua derivata che è una curva di Bézier di grado 6.

Le curve di Bézier sono tangenti alla loro prima e ultima gamba

Ponendo u = 0 e u = 1 si ottiene C'(0) = n (P1 - P0) e C'(1) = n (Pn - Pn-1). La prima significa che il vettore tangente a u = 0 è diretto nella direzione di P1 - P0 moltiplicata per n. Pertanto la prima gamba nella direzione indicata è tangente alla curva di Bézier. La seconda significa che il vettore tangente a u = 1 è diretto secondo la direzione di Pn - Pn-1 moltiplicata per n. Pertanto l'ultima gamba nella direzione indicata è tangente alla curva di Bézier. Le figure seguenti mostrano tale proprietà.

Unione di due curve di Bézier con continuità C1

Il fatto che una curva di Bézier sia tangente alla prima e ultima gamba ci fornisce una tecnica per unire due o più curve di Bézier per disegnare una forma desiderata. Sia C(u) la prima curva definita dagli m + 1 punti di controllo P0, P1, P2, ..., Pm. Sia D(u) la seconda curva definita dagli n + 1 punti di controllo Q0, Q1, Q2, ..., Qn. Se vogliamo unire assieme le due curve di Bèzier allora Pm deve essere uguale a Q0. Ciò garantisce un'unione continua di classe C0. Ricordiamo che la prima curva è tangente all'ultima gamba e la seconda curva è tangente alla prima gamba. Di conseguenza per ottenere una transizione liscia, Pm-1, Pm = Q0, e Q1 deve giacere sulla stessa linea in modo che la direzione da Pm-1 a Pm e la direzione da Q0 a Q1 sono uguali. Questo e' mostrato nella figura sotto.

Se l'unione delle due curve di Bézier così ottenuta appare liscia, tuttavia risulta ancora un'unione di classe C0 e non ancora di classe C1. Tuttavia è di classe G1, perché hanno le stesse direzioni del vettore tangente. Per raggiungere la continuità di classe C1 dobbiamo essere certi che il vettore tangente in u = 1 della prima curva, C'(1), e il vettore tangente in u = 0 della seconda curva, D'(0), are identici. In altre parole vale la seguente equazione:

Tale relazione stabilisce che per raggiungere la continuità di classe C1 nel punto di unione il rapporto della lunghezza dell'ultima gamba della prima curva (cioè |pm - pm-1|) e la lunghezza della prima gamba della seconda curva (cioè |q1 - q0|) deve essere n/m. Poiché i gradi m e n sono fissi, possiamo regolare le posizioni di pm-1 or q1 sulla stessa linea in modo che la relazione sopra sia soddisfatta.

La figura di sinistra mostra due curve di Bézier. La polilinea di colore chiaro rappresenta una curva di Bézier di grado 4, mentre la polilinea di colore scuro rappresenta una curva di Bézier di grado 5. Poiché l'ultima gamba della prima curva e la prima gamba della seconda curva non si trovano sulla stessa linea, le due curve non sono unite in modo liscio. La figura di destra mostra due curve di Bézier che sono tangenti ad una linea nel punto di unione. Tuttavia esse non sono continue di classe C1. La curva di sinistra è di grado 4, mentre la curva di destra è di grado 7. Tuttavia, il rapporto tra l'ultima gamba della curva di sinistra e la prima gamba della seconda curva sembra vicino a 1 piuttosto che a 7/4=1.75. Per ottenere la continuità di classe C1 dovremmo aumentare (rispettivamente diminuire) la lunghezza dell'ultima (rispettivamente prima) gamba a sinistra (rispettivamente a destra). Tuttavia esse sono continue di classe G1.

Sussiste un'altra applicazione interessante della proprietà di tangenza. Se il primo e l'ultimo punto di controllo coincidono (cioè P0 = Pn) e P1, P0 e Pn-1 sono collineari, la curva di Bézier generata sarà chiusa e continua di classe G1 nel punto di unione come mostrato sotto. Per conseguire la continuità di classe C1 in P0, dobbiamo avere P1 - P0 = Pn - Pn-1 (vale a dire la prima e l'ultima gamba hanno la stessa lunghezza e P1, P0 = Pn, Pn-1 sono collineari).

Notare che sebbene la curva sopra somigli ad un'ellisse, tuttavia non lo è perché questa curva è di grado 6 e le curve di Bèzier sono polinomi che non possono rappresentare cerchi ed ellissi.

Una relazione tra la derivata e l'algoritmo di de Casteljau

Riscriviamo la derivata di una curva di Bézier come

Pertanto la derivata di una curva di Bézier è la differenza tra due curve di Bézier di grado n-1. Per semplicità siano C1(u) and C2(u) le due curve:

Da queste definizioni sappiamo che la prima curva C1(u) è definita dai punti di controllo P1, P2, ..., Pn, che la seconda curva C2(u) è definita dai punti di controllo P0, P1, ..., Pn-1, e che la derivata è

Pertanto in teoria per calcolare la derivata di C(u) in un punto particolare u, possiamo usare l'algoritmo di de Casteljau per calcolare C1(u) e C2(u). Poi, calcolando la loro differenza seguita da una moltiplicazione per n otteniamo C'(u). Pertanto il punto sulla curva C(u) ed il suo vettore tangente C'(u) possono essere calcolati contemporaneamente mediante l'algoritmo di de Casteljau.

Ora applichiamo l'algoritmo di de Casteljau per calcolare C1(u) e C2(u). Vedi la figura sotto. La colonna più a sinistra ha tutti i punti di controllo assegnati. Il punto n0 fornisce il punto C(u) sulla curva, e il segmento che unisce (n-1)0 e (n-1)1 è l'ultima polilinea di controllo della rete di de Casteljau. Di fatto n0 giace nel segmento di (n-1)0 e (n-1)1 e lo divide secondo il rapporto u:1-u.

Poiché la curva C1(u) è definita mediante i punti di controllo 01, 02, ..., 0n, usando il diagramma sopra sappiamo che (n-1)1 è il punto sulla curva C1(u). Analogamente, poiché C2(u) è definito mediante i punti di controllo 00, 01, ..., 0(n-1), usando il diagramma sopra sappiamo che (n-1)0 è il punto sulla curva C2(u). Pertanto il vettore C1(u)-C2(u) è il vettore dal punto (n-1)0 al punto (n-1)1, e la derivata di C(u) è n volte C1(u)-C2(u).

Cosa significa questo? Poiché il segmento di linea da (n-1)0 a (n-1)1 della rete di de Casteljau ha la stessa direzione del vettore tangente a C(u), risulta tangente alla curva in C(u)! Riassumendo

L'ultima polilinea, in pratica un segmento di linea, della rete di de Casteljau è tangente alla curva di Bézier in C(u).

La figura seguente mostra un esempio. Il punto mostrato corrisponde a u = 0.5. Risulta chiaro che l'ultimo segmento della rete di Casteljau è tangente a C(0.5).

Derivate di ordine più alto

Il calcolo delle derivate di una curva di Bézier di ordine più alto è semplice. Ricordiamo che la derivata di C(u) è la seguente:

Applicando la formula della derivata alla curva di Bézier sopra si ottiene la seguente, che fornisce la derivata seconda della curva originaria di Bézier:

Dopo aver ottenuto C'(u) e C''(u), la triade mobile e la curvatura in C(u) possono essere calcolate facilmente. Derivate di ordine più alto possono essere calcolate ricorsivamente applicando la formula della derivazione.

Per esprimere le derivate di ordine più alto in forma coincisa, useremo il concetto delle differenze finite. Definiamo Di0 come il punto di controllo Pi per 0 <= i <= n. Definiamo poi la differenza di primo livello Di1 come la differenza del precedente livello:

Notare che la differenza di primo livello ha solo n punti, uno in meno del numero dei punti di controllo assegnati. Più precisamente il primo livello della differenza risulta

La differenza di secondo livello viene definita come la differenza dei punti di primo livello:

Questa differenza di secondo livello ha n-1 punti. Ripetendo la procedura possiamo definire la differenza di livello k come segue: la differenza di livello k ha n-k+1 punti.

Mediante questa notazione le derivate di ordine più alto possono essere espresse in forma coincisa. Innanzitutto riscriviamo C'(u) come segue, facendo uso dei Di1:

Applicando la derivata a C'(u) per calcolare C''(u) otteniamo la formula di C''(u) nei Di2:

Fare lo stesso a C''(u) per ottenere una formula per C'''(u) nei Di3:

Continuare il processo e infine calcolare la k-ma derivata C[k](u) nei Dik:

Pertanto per calcolare la derivata k-ma di C(u) in un particolare u, prima calcoliamo i Dik e applichiamo l'algoritmo di de Casteljau per calcolare il punto corrispondente a u sulla curva di Bézier definita dai Dik. Più precisamente possaimo disporre tutti i Di0 sulla colonna 0, assignare alle frecce in direzione sud-est e nord-est rispettivamente -1 and 1 per calcolare la colonna 1 dei Di1. Riopetere la procedura finché si raggiunge la colonna k come mostrato sotto:

Infine applicare l'algoritmo di de Casteljau ai punti sulla colonna k con u e moltiplicare il risultato per n(n-1)(n-2)...(n-k+1); in tal modo si ottiene il vettore di C[k](u)!