dove non diversamente specificato.
I vettori sono convenzionalmente intesi come vettori colonna† .
Gli oggetti grafici sono usualmente rappresentati come liste di punti; in generale una curva sarà rappresentata con
una matrice d×n† †In questo contesto d=2 o 3 .
Per migliorare l’efficienza le operazioni tra vettori sono implementate in modo da eseguire la stessa
operazione in blocco su liste di vettori di lunghezza arbitraria (ovvero punto a punto lungo una
curva).
Su una base canonica: vw = ∑
viwi = vT w
Dati v(t),w(t):
![]() |
Dati v(t),w(t):
![]() |
Casi particolari:
![]() |
![]() |
Una combinazione di punti:
![]() |
si dice baricentrica se ∑
iαi = 1, convessa se anche αi > 0∀i
Se la combinazione è baricentrica, può essere scritta come la somma di uno qualsiasi degli addendi e
un vettore:
![]() |
Una combinazione baricentrica convessa è utile per rappresentare parametrizzazioni di oggetti:
Esempio 1.1 (Punto medio di un segmento).
s = b0b1; b0,b1 ∈ℝ2;
M = ∑
i=1,2αibi = b0 + α0(b0 − b0) + α1(b1 − b0) = b0 + α1(b1 − b0); α1 = α2 =
Esempio 1.2 (Punti di un segmento). Generalizzando l’esempio precedente:
s = b0b1; b0,b1 ∈ℝ2; t ∈ [0, 1];
P(t) = tb0 + (1 − t)b1 = b0 + (1 − t)(b1 − b0)
Definizione 1.3 (Spazio di lavoro). Si definisce spazio affine di ordine d, a partire da un punto O ∈ℝd, l’insieme:
![]() |
Definizione 1.4 (Convex Hull).
![]() |
in cui gli αi formano una combinazione baricentrica convessa.
CH è il più piccolo insieme convesso che contiene i punti b0...bn
Generalmente si usano funzioni del tipo
![]() | (1.1) |
in cui A ∈Md×d e v ∈ℝd che sono lineari e permettono di definire facilmente le trasformazioni più comuni in grafica.
Traslazione La traslazione si ottiene con una funzione del tipo (1.1) in cui A ≡ I, per cui Φ(x) = x + v. Alternativamente è possibile modificare la matrice A:
![]() |
Rotazione La rotazione intorno all’origine (del sistema di riferimento ortonormale corrente) si ottiene ancora con una funzione del tipo (1.1) in cui v ≡ 0 (vettore nullo, non c’è traslazione) ed in cui la matrice, nel caso tridimensionale, assume la forma† :
![]() |
Scalatura La scalatura si ottiene imponendo un fattore di scala ad ogni dimensione della matrice identità:
![]() |
Le trasformazioni affini sono lineari rispetto alle combinazioni baricentriche. Infatti:
![]() |
Inoltre, se A è ortogonale† †ATA = AAT = I ,
una trasformazione della famiglia (1.1) lascia invariati angoli e lunghezze.
Infatti, dati x,y vettori, per le lunghezze:
![]() |
Per gli angoli, se x,y sono tali che xT y = |x||y| cos θ ed, in quanto vettori, possono essere letti come x = a − b; y = c − d (con a,b,c,d ∈ℝd):
![]() |
Definizione 1.6 (Curva). Si definisce curva l’immagine di un’applicazione X : I → Ed continua e localmente iniettiva.
Definizione 1.7 (Rappresentazione Parametrica). L’applicazione X : I → Ed continua e
localmente iniettiva si dice rappresentazione a parametri in I della curva; in generale una stessa
curva può ammettere più di una rappresentazione parametrica.† †Ad esempio, un segmento di retta (curva degenere) tra l’origine e il punto (1,1) può essere rappresentata
in forma implicita (ax + by + c = 0), esplicita (y = mx + q) o parametrica su un’intervallo I(= [0,1] per
esempio):
X(t) = o equivalentemente X(t) =
Definizione 1.8 (Rappresentazione parametrica differenziabile). La rappresentazione X(t) di dice differenziabile se esiste la funzione:
![]() |
Se Ẋ≠0 su tutto l’intervallo di definizione I, X si dice differenziabile regolare
La non unicità della rappresetazione parametrica suggerisce che si possa passare da una rappresentazione all’altra di una stessa curva, utilizzando di volta in volta la parametrizzazione con le caratteristiche più adatte al contesto.
Definizione 1.9 (Funzioni di riparametrizzazione). Sia τ : I → I2. Si definisce
riparametrizzazione di X rispetto a τ una funzione tale che
(τ(t)) = X(t).
Si ha che:
![]() |
in cui dX∕dt è la tangente alla curva e dt∕dτ è uno scalare > 0.
Se τ ∈C1 e > 0 su tutto I la riparametrizzazione si dice ammissible; in questo caso la curva è
percorsa tutta nello stesso verso e la sua tangente non cambia verso né direzione, ma solo il
modulo.
Osservazione 1.1 (Tangente alla curva). La tangente alla curva non può essere usata per
caratterizzarla, in quanto potenzialmente cambia modulo al cambiare della rappresentazione.
Per caratterizzare una curva occorre definire il versore tangente:
![]() |
Definizione 1.10 (Rappresentazione parametrica regolare). Se Ẋ(t)≠0 ∀t ∈ I la rappresentazione parametrica si dice regolare.
La lunghezza dell’arco può essere usata come funzione di riparametrizzazione ammissibile, che ha
anche la caratteristica di essere lineare rispetto alle lunghezze sulla curva. In particolare
S : [a,b] → [0,l], e =
implica che se X(t) è regolare anche S(t) lo è, e vale
anche:
![]() |
Osservazione 1.2 (Invarianza rispetto alla rappresentazione). La lunghezza dell’arco è invariante rispetto alla rappresentazione parametrica della curva, infatti, cambiando parametrizzazione:
![]() |
Definizione 1.12 (Fernet Frame). Il Frenet Frame è un sistema di coordinate ortonormali definito localmente in un punto di una curva X(t).
È possibile definire un Frenet frame† †L’insieme di tutti i Frenet frame è rappresentato tramite tre vettori ortonormali e1,e2,e3; in realtà ogniuno di essi è una funzione del parametro della rappresentazione della curva (C’è un Frenet frame diverso per ogni punto della curva). a partire dalle derivate di una qualsiasi rappresentazione parametrica X(t) di una curva:
![]() |
‡Identità “BAC-CAB”: A × (B × C) = B(A ⋅ C) − C(A ⋅ B).
La curvatura è una grandezza caratteristica della curva indipendente dalla sua rappresentazione
parametrica.
L’espressione della curvatura si semplifica notevolmente quando la rappresentazione è lunghezza
dell’arco:
![]() |
in quanto Ẋ(s) ≡ 1.
La torsione si annulla solo quando il prodotto misto è nullo:
![]() |
La torsione è non nulla solo nello spazio e non su un piano.
Definizione 2.1 (Base di Bernstein). I polinomi di Bersntein sono una famiglia di polinomi definiti, per ogni n ∈ℕ+, come:
![]() |
Definizione 2.2 (Polinomi di Bernstein in forma ricorsiva).
B00 | = 1 | ||
Bjn | = 0, j≠0, 1,...,n | ||
Bin | = (1 − t)B in−1 + tB i−1n−1 |
Caso (i = 0 e i = n).
![]() |
Caso (0 < i < n). in quanto =
+
:
Bin(t) | = ![]() ![]() | ||
= (1 − t)![]() ![]() | |||
= (1 − t)Bin−1 + tB i−1n−1 |
Definizione 2.3 (Polinomi di Berstein di grado n). Si definisce Polinomio di Bernstein di grado n la serie:
![]() |
I polinomi di Bernstein sono definiti su tutto ℝ, ma ci si limita a studiarne le proprietà nell’intervallo [0, 1] (sufficiente in questo contesto).
Osservazione 2.1 (Mappabilità della base). I polinomi di Bernstein possono essere definiti, in maniera equivalente, su qualsiasi intervallo [a,b] mappabile a [0, 1]:
![]() |
Ogni polinomio della base è non negativo in quanto prodotto di componenti non negative
(,ti, (1 − t)n−i).
![]() |
infatti, ∀t ∈ℝ:
![]() |
![]() |
infatti:
![]() |
†Per il binomio di Newton vale la proprietà =
I polinomi di Bernstein sono una base per Πn; infatti, Bin può essere scritto come:
![]() |
da cui:
![]() |
Se la matrice del cambio di base è non singolare i polinomi di Bernstein sono linearmente indipendenti; la matrice è non singolare in quanto triangolare superiore con tutti elementi non nulli sulla diagonale (determinante non nullo).
![]() |
Infatti, per induzione su n:
![]() |
e supponendo che valga per n − 1:
∑
i=0n![]() | = ∑
i=0n![]() ![]() | ||
= ![]() ![]() ![]() ![]() | |||
= ![]() ![]() ![]() | |||
= ![]() ![]() ![]() | |||
= ![]() ![]() ![]() | |||
= ![]() ![]() ![]() |
Un polinomio di Bernstein p(t) = ∑ k=0nc kBkn(t) a coefficienti c 0,..,cn, dato V il numero di variazioni di segno della sequenza di costanti e N numero di radici reali di p(t) contate con la loro molteplicità, gode della proprietà:
![]() |
Infatti,
![]() |
parametrizzato su u ∈ [0,∞], ovvero considerando t = e (1 − t) =
, diventa:
![]() |
che è un polinomio sulla base canonica per il quale vale la regola di Cartesio† †Il numero di radici positive (contato con molteplicità) è dato dal numero di cambi di segno (variazioni) fra due coefficienti consecutivi. .
Bin(0) | = ![]() | ||
Bin(1) | = ![]() |
La derivata dei polinomi di Bernstein può essere espressa in termini della base di Bernstein stessa:
![]() | = ![]() ![]() | ||
= ![]() ![]() | |||
= n![]() ![]() | |||
= n![]() | |||
= n![]() |
![]() | = ![]() ![]() | ||
= ![]() | |||
= ![]() | |||
Definizione 2.4 (Curva di Bézier). Dati b0,...,bn ∈Ed insieme di punti di controllo, si definisce curva di Bézier il polinomio:
![]() |
Definizione 2.5 (Poligono di controllo). Si definisce poligono di controllo il poligono che si ottiene unendo ordinatamente i punti di controllo.
La curva giace completamente nella convex hull dei punti di controllo, in quanto ogni punto della curva è una combinazione baricentrica di questi† †I polinomi di Bernstein partizionano l’unità .
Segue direttamente dai valori agli estremi dei polinomi di Bernstein che X(0) ≡ b0 e X(1) ≡ bn.
Data Φ : Ed →Ed di tipo Φ(p) = Ap + v, si ha:
![]() |
Le curve di Bézier sono simmetriche rispetto all’ordine dei punti di controllo, infatti, dati ci = bn−i:
![]() |
Se i punti di controllo sono allineati ed equidistanti la convex hull è il segmento b0bn e la curva giace su una retta:
![]() |
†Precisione lineare dei polinomi di Bernstein
Modificando uno dei punti di controllo b0,...,bn:
![]() |
si ottiene:
![]() |
ovvero tutti i punti della curva si spostano nella direzione di v con un’incidenza che dipende da t e dalla forma del j−esimo polinomio di Bernstein. In generale, in quanto i polinomi hanno una forma a campana, i punti della curva sono interessati in maniera proporzionale alla distanza dal punto di controllo modificato.
La proprietà di variation diminishing aiuta a capire l’andamento della curva; si può infatti sapere il
numero massimo di intersezione che la curva può avere con una retta (N) a partire da quello del
poligono di controllo (Np). In particolare, N ≤ Np e N = Np − 2k.
Sia r = αx + βy + γ, le intersezioni si possono ricavare, separando le dimensioni, con
l’equazione:
![]() |
da cui:
![]() |
e la proprietà segue direttamente da quella di variation diminishing dei polinomi di Bernstein.
Ẋ(t) | = ∑
i=0nb
iBin(t) = n∑
i=0nb
i![]() | ||
= n![]() | |||
= n∑ i=0n−1(b i+1 − bi)Bin−1(t) = n∑ i=0n−1Δb iBin−1(t) |
dove Δbi = def(bi+1 − bi).
La derivata di una curva di Bézier è quindi ancora una curva dello stesso tipo ma di grado minore e
con punti di controllo differenti.
Dalla forma della derivata seconda:
![]() |
si può generalizzare† †Falling factorial: xk = x(x − 1)...(x − k + 1), ovvero i primi k termini del fattoriale. Nota: xk = :
![]() |
In quanto:
![]() |
la curva di Bézier è sempre tangente ai segmenti che uniscono i primi e gli ultimi due punti del poligono di controllo.
I punti della curva possono essere calcolati ricorsivamente definendo:
![]() |
Si dimostra per induzione che questa formula ricorsiva, in r passi, calcola i punti della curva. Per r = 1:
![]() |
Supponendo che valga per r − 1, si ha:
bir(t) | = (1 − t)b ir−1(t) + tb i+1r−1(t) | ||
= (1 − t) ∑ j=0r−1b i+jBjr−1(t) + t∑ j=0r−1b i+j+1Bjr−1(t) | |||
= (1 − t) ∑ k=ii+r−1b kBk−ir−1(t) + t∑ k=i+1i+rb kBk−i−1r−1(t) | |||
= ∑
k=ii+r![]() | |||
= ∑ k=ii+rb kBk−ir(t) = ∑ j=0rb j+iBjr(t) |
Una curva di Bézeier è rappresentabile con un’altra di grado più elevato, ovvero esiste soluzione all’equazione:
![]() |
Per la proprietà di interpolazione agli estremi si deve avere c0 = b0 e cn+1 = bn.
Moltiplicando a sinistra per (t + (1 − t)) e usando la proprietà di partizionamento dell’unità dei
polinomi di Bernstein, si ha:
![]() |
da cui, considerando b−1 = bn+1 = 0:
∑
i=0nb
i![]() ![]() | |||
= ∑
i=0nb
i![]() ![]() | |||
= ∑
i=0n+1b
i−1![]() ![]() | |||
= ∑
i=0n+1![]() |
![]() |
Osservazione 2.2. I punti di controllo ci sono ottenuti come combinazione lineare dei due vertici adiacenti del poligono di controllo di partenza, quindi il nuovo poligono è inscritto nel vecchio.
Osservazione 2.3 (Repeated degree elevation). Per disegnare una curva si può pensare di innalzare il grado del poligono di controllo finnchè questo non sia sufficientemente vicino alla curva; i coefficienti dell’r-esima iterazione sono:
![]() |
Fissato t, se r →∞ il poligono tende effettivamente alla curva, ma il costo computazionale è molto più elevato dell’algoritmo di de Casteljau in quanto servono molte elevazioni per raggiungere una precisione paragonabile.
Una curva può essere suddivisa in due curve dello stesso grado giunte in un punto.
Dati ∈]0, 1[ e:
![]() |
si cercano:
![]() |
Definizione 2.6 (Operatori identità e shift).
Si definiscono gli operatori I,E tali che Ibi = bi,Ebi = bi+1.
Osservazione 2.4 (Rappresentazione alternativa delle curve di Bézier). I punti della curva di
Bézier (algoritmo di de Casteljau) si possono rappresentare a partire dagli operatori shift e
identità: bir = r−1b
i.
I coefficienti ck e dk si ottengono dall’algoritmo di de Casteljau come:
![]() |
infatti† †Il caso CR si dimostra in maniera analoga :
CL(τ) | = ∑
k=0nb
0k(![]() ![]() | ||
= ∑
k=0n![]() ![]() | |||
= ∑
k=0n![]() ![]() | |||
= ∑
k=0n![]() ![]() ![]() | |||
= ![]() | |||
= ![]() |
Le curve di Bézieri razionali sono un’estensione alle curve di Bézier che mira a migliorarne la controllabilità.
Un insieme è rappresentabile mediante coordinate omogenee se è possibile associare un vettore numerico (x1,...,x2) ad ogni elemento dell’insieme, in modo tale che due vettori distinti siano associati a due oggetti diversi solo se linermente indipendenti.
Definizione 2.7 (Spazio proiettivo). Lo spazio proiettivo P(K) associato ad uno spazio vettoriale K è definito come l’insieme dei suoi sottospazi vettoriali di dimensione uno (rette).
Se ogni vettore di uno spazio vettoriale di dimensione finita è rappresentabile tramite le sue coordinate (x1,...,xn), ogni retta è descrivile come lo span lineare di un vettore non nullo: λ(x1,...,xn).
Interpretazione geometrica in d = 3 Si immagini un piano E2 immerso in uno spazio E3 ed allineato col sistema di riferimento, ad esempio perpendicolare all’asse z. I punti di E3 sono rappresentabili tramite l’insieme delle triple (x,y,z) oppure, a partire dai punti di E2, come unione dei punti al finito ed i punti all’infinito:
![]() |
Analogamente è possible rappresentare i punti del piano a partire dai punti dello spazio attravero
un’operazione di proiezione: (x,y,z) → (,
, 1).
Curve di Bézier razionali
Una curva di Bézier razionale in uno spazio Ed è la proiezione di
una curva di Bézier classica definita in uno spazio Ed+1. In particolare si
definisce† †Per comodità di notazione si intende lo spazio proiettivo perpendicolare alla prima componente del vettore, ovvero
(x,y,z,...,cn) → (1,,
,...) :
![]() |
in cui i Bi sono vettori in Ed+1. La prima componente della curva (d + 1)-dimensionale è pertanto:
![]() |
ed applicando direttamente il concetto di proiezione si ottiene la curva proiettiva in Ed:
![]() |
Osservazione 2.5. Se β0 = β1 = ... = βn, X(t) ≡ ∑ i=0nb iBin(t) ovvero rimane una Bézier definita dai punti di controllo bi.
Sia s = 1 − t. La proprietà segue direttamente da quella dei polinomi di Bernstein:
![]() |
Definendo la curva come:
![]() |
si ha che:
![]() |
ovvero la curva è una combinazione convessa dei punti di controllo ed appartiene alla convex hull di questi.
Deriva direttamente dal fatto che la curva è una combinazione baricentrica di punti; la dimostrazione è analoga a quella per le curve di bézier classiche.
In generale non vale, infatti:
![]() |
da cui:
![]() |
Se i βi sono omogenei però la proprietà si mandiene valida.
La curva interpola i punti di controllo agli estremi:
X(0) | = ![]() | ||
X(1) | = ![]() |
I punti della curva X(t) = ∑
i=0nb
ivi(t), con vi(t) = ,w(t) = ∑
i=0nβ
iBin(t), che giacciono
sulla retta ax + by + c = 0 sono:
a∑ i=0nb ixvi(t) + b∑ i=0nb iyvi(t) + c∑ i=0nv i(t) | = 0 | ||
∑ i=0n(ab ix + bbiy + c)vi(t) | = 0 | ||
∑
i=0n![]() | = 0 |
Modificando uno dei pesi:
![]() |
si ottiene la curva:
![]() |
Confrontando la curva modificata con quella originale si ha:
(![]() | = ∑ i=0nβ ibiBin(t) + Δβ jbjBjn(t) −∑ i=0nβ ibiBin(t) − X(t)Δβ jBjn(t) | ||
= ΔβiBin(t)[b j − X(t)] |
![]() |
Modificando un peso si ha quindi un effetto su ogni punto della curva, direttamente proporzionale alla distanza bj − X(t): la curva tende ad avvicinarsi al punto bj se Δβj è positivo, allontanarsi altrimenti.
Sia:
![]() |
Si può calolare la derivata di X(t):
![]() |
Le derivate di c(t) e w(t) sono note:
c(r) | = nr ∑ i=0n−rΔrβ ibiBin−r | ||
w(r) | = nr ∑ i=0n−rΔrβ iBin−r |
![]() |
La tangenza agli estremi è mantenuta, infatti:
Ẋ(0) | = n![]() | ||
Ẋ(1) | = n![]() |
![]() |
Definizione 2.8 (Curva di Bézier razionale in forma standard). Una curva di Bézier razionale si dice in forma standard se i pesi associati agli estremi del poligono di controllo sono unitari.
Per trasformare una curva razionale in una in forma standard, si utilizza la riparametrizzazione:
![]() |
La derivata della funziona di riparametrizzazione ϕ(u) vale:
![]() |
quindi la funzione è monotona per α > −1, e la riparametrizzazione è ammissibile in quel
range.
Ha senso quindi applicarla:
![]() |
![]() |
e richiedere che siano verificate:
![]() | (2.1) |
La forma standard si può ottenere solo nel caso in cui la condizione β0 = 1 sia già verificata inizialmente.
Le sezioni coniche sono rappresentabili utilizzando curve di Bézier di secondo grado.
Un punto p che giace nella convex hull di altri tre (b0,b1,b2)† †ogniuno ha componenti xi,yi che delimitano un triangolo è identificabile univocamente con un sistema di coordinate baricentriche (u0,u1,u2) a riferimenti b0,b1,b2:
![]() |
Il sistema di coordinate sopra descritto è univocamente determinato, si dimostra che in:
![]() |
la matrice A è nonsingolare e quindi il sistema ammette soluzione unica. Il determinante di A è legato all’area del triangolo b0b1b2; fissando una base per esso si ha:
![]() |
Applicando il metodo ci Cramer:
![]() |
![]() |
![]() |
e quindi:
![]() |
dove Δi = det Ai(x,y) e Δ = det A. Il determinante di A è non nullo quindi le ui sono tutte definite. Il sistema perde però l’unicità nel caso in cui tutti e tre i punti siano allineati.
In generale una curva conica è rappresentabile come:
![]() |
o in forma matriciale, dato il punto p = :
![]() |
Il determinante della matrice determina il carattere della conica:
![]() |
Si ricordano alcune definizioni:
![]() ![]() | = R, fuochi allineati sull’asse x e centro nell’origine | ||
![]() |
![]() |
Siviluppando la formula di una curva di Bézier razionale in forma standard di secondo grado e etichettandone in modo opportuno i termini:
![]() |
i punti della curva possono essere espressi in maniera semplice come:
![]() |
Dalle proprietà dei polinomi di Bernstein segue direttamente che ∑
vi(t) = 1 ovvero ogni punto della
curva è una combinazione baricentrica dei tre punti di controllo, leggibile anche come coordinate
baricentriche rispetto agli stessi.
Calcolando il quadrato della componente v1 si ottiene:
![]() |
sostituendo ai vi la relativa notazione risultante dal teorema di Cramer vista nella sezione precedente (vi = Δi(x,y)∕Δ), si ha che punti della curva rispettano:
![]() |
che un’equazione di secondo grado, ovvero una curva conica che cambia comportamento in base al valore di β1:
![]() |
Uno dei possibili modi per migliorare la controllabilità e località di una curva di Bézier è quello di considerare sottointervalli della curva come curve separate, preoccupandosi di gestire i raccordi. Dato un intervallo di definizione della curva [a,b] ed una sua partizione in m sottointervalli τ : a ≡ u1 < u2 < ... < um < um+1 ≡ b disgiunti ed adiacenti, si definisce la curva polinomiale a tratti:
![]() |
in cui:
![]() |
e bk,i è il k-esimo punto di controllo della curva i-esima. I punti della curva X(ui) sono detti nodi (knot) o punti di giunzione. La condizione di continuità si ottiene imponendo:
![]() |
grazie alla proprietà di end-point interpolation; ad esempio date due curve disconnesse si può aggiungere un punto a tutte e due che stia spazialmente tra l’ultimo della prima e il primo della seconda.
Per aumentare la regolarità della curva si può voler imporre la continuità delle derivate; ad esempio per ottenere una curva in C1 si impone:
![]() |
Si ha che:
![]() ![]() | |||
![]() ![]() ![]() ![]() ![]() | |||
![]() ![]() |
![]() |
Analogamente per avere continuità C2 si impone anche:
![]() |
da cui:
![]() |
ovvero:
![]() |
Quanto appena descritto è un metodo per ottenere una curva di Bézier definita a tratti
parametrizzata in modo tale che rispetto al parametro u la velocità di percorrenza della curva sia
proporzionale alla dimensione dei diversi intervalli assegnati ad ogni curva. In pratica è
comodo considerare l’intervallo [a,b] suddiviso equamente tra i vari tratti di curva (curva
polinomiale a tratti uniformi); in questo caso la funzione di riparametrizzazione è la stessa per
tutte (a meno dell’intervallo) e non c’è bisogno di riparametrizzarle, perchè si può dare per
scontato che ogni curva sarà valutata in [0, 1] quando u è nell’intervallo corrispondente. Si ha
che:
Le derivate delle due curve sono facili da derivare:
![]() | = ![]() | ||
n∑ k=0n−1Δb k,iBkn(t) | = m∑ k=0m−1Δb k,i+1Bkn(u) |
n∑ k=0n−1Δb k,iBkn−1(1) | = m∑ k=0m−1Δb k,i+1Bkn−1(0) | ||
nΔbn−1,i | = mΔb0,i+1 |
![]() |
Analogamente per avere C2
n(n − 1) ∑ k=0n−2Δ2b k,iBkn−2(1) | = m(m − 1) ∑ k=0m−2Δ2b k,i+1Bkn−2(0) | ||
n(n − 1)Δ2b n−2,i | = m(m − 1)Δ2b 0,i+1 |
![]() |
Due curve si raccordano con continuità geometrica Gs nel punto p se esiste una riparametrizzazione
ammissibile per cui le curve hanno continuità Cs in p.
Per avere continuità G1, date due curve X(u),Y (t) e la funzione u(t) : [t
0,t1] → [u0,u1]:
![]() ![]() | |||
ω1![]() ![]() ![]() |
![]() |
Il caso G2 è analogo:
![]() ![]() | |||
![]() ![]() ![]() | |||
![]() ![]() ![]() ![]() ![]() |
![]() |
Come prima, nel caso pratico considerando equiparametrizzate le curve si ottiene, per le continuità G1 e G2:
nΔbn−1,i = ω1mΔb0,i+1 → b1,i+1 = ![]() | |||
n(n − 1)Δ2b n−2,i = m(m − 1)Δ2b 0,i+1 → b2,i+1 = | |||
![]() |
Vedi appendice A.1.
In generale, una curva SPLINE monovariata è una funzione S : [a,b] →ℝd polinomiale a tratti. In particolare, definita una partizione τ dell’intervallo [a,b]:
![]() |
Ii ∩ Ij = ∅ con i≠j, Ii ∪ Ii+1 ≡ [ti,ti+2) la funzione S è rappresentabile come:
![]() |
Si indica con Sm,τ una generica funzione SPLINE sulla partizione τ e composta di polinomi tutti di grado m. Considerando l’intervallo [a,b] suddiviso in n sottointervalli, si è definito uno spazio di dimensione:
![]() |
in quanto ogni polinomio di grado m è identificato da m+1 coefficienti. In pratica, volendo rappresentare una curva, si vuole che S sia continua (ovvero lim t→ti+1Pi(t) = Pi+1(ti+1)) e che anche le derivate si raccordino (S ∈Cm−1)† ; questo lascia uno spazio di dimensione:
![]() |
infatti ci sono n − 1 punti di raccordo per ogniuno dei quali si impogono m condizioni di di raccordo (una di continuità e le derivate).
Si definiscono:
![]() |
Definizione 3.1 (Base delle potenze troncate). Sulla partizione τ : a ≡ τ1 < ... < τl ≡ b si definisce base delle potenze troncate l’insieme di polinomi:
![]() |
Teorema 3.1. L’insieme delle potenze troncate è una baste per lo spazio delle spline Sm,τ.
Dimostrazione. Si deve dimostrare che i polinomi della base sono l + m linearmente indipendenti, ovvero che:
![]() |
Se x ∈ I1 ≡ [τ1,τ2] si ha:
![]() |
ovvero la tesi è dimostrata in quanto la base è quella canonica. Per x ∈ I2 si ha:
![]() |
ma la proprità vale per gli ai, il che implica che debba valere anche b1. Procedendo allo stesso modo si dimostra la tesi per tutti i bi __
La base delle potenze troncate presenta problemi di malcondizionamento; questi possono essere risolti
definendo, sullo stesso concetto, una base a supporto compatto.
Si definisce una partizione di [a,b]† †vettore dei nodi
più rilassata della precedente:
![]() |
e, data la base:
![]() |
si definisce ricorsivamente:
![]() |
Nota (Abuso di notazione). Per comodità, se uno dei denominatori di un termine in Ni,k(x) si annulla, questo viene considerato nullo.
(a) k=2
(b) k=3
(c) k=5
(d) k=10
Ni,k(x) è a supporto compatto, infatti Ni,k = 0 se t[ti,ti+k].
Ni,k(x) ≥ 0∀t ∈ [ti,ti+k], in quanto somma di soli termini positivi in quell’intervallo.
![]() |
Per induzione, la tesi è vera banalmente per Ni,1(t) e t ∈ [t0,tn+1]; supponendola vera per Ni,k−1(t) , t ∈ [νk−2,νn+1] per Ni,k(t) e t ∈ [νk−1,νn+1] vale:
∑ i=0nN i,k(t) | = ∑
i=0n![]() | ||
= ![]() ![]() ![]() | |||
+ ![]() ![]() | |||
= 0 + ∑
i=1nN
i,k−1(t) + 0 + ![]() | |||
= ∑ i=0nN i,k−1(t) |
La derivata della base delle B-SPLINE è definita come segue:
![]() |
![]() |
si verifica banalmente, ∀t ∈ [a,b]. Analogamente, se k = 2:
![]() |
infatti nei nodi (x = νj) solo Nk−1,2(νj)≠0 e aj deve essere diverso da zero, per ogni j. Per dimostrare la proprietà per k > 2 occorre procedere per induzione, utilizzando i precedenti come casi base. Tenendo conto che vale:
![]() |
espandendo e risommando i termini della sommatoria nella derivata si ottiene:
![]() |
da cui si deve avere ai = ai+1 ovvero tutti i coefficienti coincidenti. Riportando questo risultato alla sommatoria di partenza:
![]() |
in quanto gli Ni,k(x) sono una combinazione baricentrica.
La definizione di SPLINE data nella sezione precedente richiede che la curva abbia lo stesso tipo di
continuità su tutti i nodi. Questo vincolo nella pratica può essere troppo stringente, e talvolta conviele
usare uno spazio delle spline allargato.
Data la partizione:
![]() |
ed un vettore:
![]() |
Questo vettore sta ad indicare il tipo di raccordo che si vuole nei punti τ2,..,τn, se mi = 0 non si chiede neanche la continuità, se mi = s si chiede la continuità delle derivate dalla zeresima alla s. Si definisce:
Sm,τ,M =![]() | ∃ p 1(t),...,pn(t) ∈ Πm,f(t)|Ii = pi(t), e | ||
pi−1(s)(τ i) = pi(s)(τ i),s = {0,...,mi − 1} se mi > 0, | |||
nessuna condizione imposta in τi se mi = 0![]() |
![]() |
Per comodità, usualmente il vettore M non si riferisce direttamente al grado di derivabilità nei nodi, ma indica direttamente la molteplicità del nodo i-esimo nel vettore dei nodi, e prende il nome di vettore delle molteplicità. In una curva di grado k la molteplicità del nodo (m) e il grado di derivabilità della curva (d) sono legate dalla relazione:
![]() | (3.1) |
ovvero per ottenere una curva a derivabilità massima (che coincide con le B-SPLINE classiche) la molteplicità dei nodi deve essere minima (1) e viceversa, per ottenere la derivabilità minima (nel caso pratico si richiede sempre la continuità C0) la molteplicità è massima (k).
Definizione 3.2 (Vettore dei nodi esteso). A partire dall’insieme M e dal vettore dei nodi ν (che ha n intervalli) si definisce il vettore dei nodi esteso† :
![]() |
in cui:
![]() |
Come prima, si definisce ricorsivamente la base per le spline:
Ni,1(t) | = ![]() | ||
Ni,k(t) | = ![]() |
Osservazione 3.2 (Caso particolare: polinomi di Bernstein).
Ponendo [τ0,τ1] = [0, 1], il vettore dei nodi estesi per una spline di grado k diventa:
t : τ0 = t0 = ... = tk−1 < tk = ... = t2k−1 = τ1.
Dalla definizione di Ni,k, per i < k segue:
![]() |
quindi, ricorsivamente:
![]() |
Si può scrivere la formula generica:
![]() |
ma t0 = ... = tk−1 e tk = ... = t2k−1 da cui:
![]() |
analogamente, per i ≥ k:
![]() |
Da qui, sostituendo τ0 = 0 e τ1 = 1 si ottiene:
![]() |
In generale si può dimostrare che:
![]() |
La definizione di derivata è l’estensione diretta di quella della base B data in precedenza:
![]() |
La proprietà di somma unitaria della B-base estesa in [tk−1,tn+1] permette di utilizzarla in modo analogo ai polinomi di Bernstein per definire una curva:
![]() |
in cui di sono punti in Ed.
Invarianza alle trasformazioni affini
![]() |
Controllo locale Se t ∈ [tr,tr+1]:
![]() |
in quanto tutte le altre Ni,k(t) sono nulle, ne consegue che la modifica di di ha effetti sulla curva solo nel corrispondente intervallo ti,ti+k.
Strong ConvexHull Come nel caso dei polinomi di Bernstein, la somma ∑ i=0nd iNi,k(t), t ∈ [tk−1,tn+1] è una combinazione baricentrica dei di, quindi la curva giace nella convex hull di questi; in più la proprietà di località garantisce che la curva, per t ∈ [tr,tr+1] sta anche nella convex hull dei punti [ti,ti+k], ovvero si ha la convex hull forte.
Linear precision (come conseguenza della strong convex hull) Se si hanno (k − 1) punti di controllo allineati dj+i = dj + αiv,r = 0,..,k − 1 l’equazione della curva diventa:
![]() |
ovvero se almeno k − 1 punti sono allineati la curva tocca il segmento su cui giacciono i punti di controllo, e se almeno k lo sono la curva si schiaccia sul segmento stesso.
(a) k=4, 3 nodi allineati
(b) k=4, 4 nodi allineati
![]() | = (k − 1) ∑
i=0nd
i![]() | ||
= (k − 1) ∑
i=1n![]() |
![]() |
End point interpolation
In generale la proprietà di end point interpolation non vale per le B-SPLINE, ma la si può
forzare.
Dato il vettore ausiliario t : t0,...,ti,...,ti+k−2,...,tk+μ+k, se i k-1 nodi ti,...,ti+k−2 coincidono si ha
che X(ti) = di−1. Quindi, forzando t0 = ... = tk−1 = τ0 e tk+μ+2 = ... = tk+μ+k = τn,
N0,k(t) = B0k−1 con t ∈ [τ0,τ1] e Nn,k(t) = Bk−1k−1
con t ∈ [τn−1,τn],
ovvero la proprietà è verificata.
Derivata agli estrimi: raccordo Per disegnare una curva chiusa a derivate continue si deve imporre:
![]() |
ovvero, per ogni r:
![]() |
Per le proprietà degli Ni,k:
![]() |
da cui derivano direttamente le condizioni da imporre, ovvero:
![]() |
sempre per i = 0,...,k − 2
L’algoritmo di de Boor calcola i punti della curva in maniera analoga a quello di de Casteljau per le
curve di Bézier.
Considerando t ∈ [tk−1,tn+1]
X(t) | = ∑ i=0nd i(0)N i,k(t) | ||
= ∑
i=0nd
i(0)![]() | |||
= ∑
i=1n ![]() | |||
X(t) | = ∑ i=jnd i(j)(t)N i,k−j(t) | ||
= ∑ i=k−1nd i(k−1)(t)N i,1(t) |
Per t ∈ [tr,tr+1] si possono escludere dalla sommatoria iniziale i termini nulli:
![]() |
ed è possibile ottimizzare l’algoritmo.
Si vuole inserire un nodo t∗T tale che t∗ ∈ [t
r,tr+1] per creare il vettore T∗ = T ∪{t∗}, e definire
una curva su T∗ che sia identica a quella precedentemente definita su T. In particolare si definisce la
curva:
![]() |
in cui:
T∗ : t i∗ | = ![]() |
αL,i | = ![]() | ||
αR,i | = ![]() |
Ni,k∗(t) = ![]() |
X(t) | = ∑ i=0nd iNi,k(t) = ∑ i=0n+1d i∗N i,k∗(t) | ||
= ∑ i=0r−kd i∗N i,k(t) + ∑ i=r−k+1rd i∗(α L,iNi,k(t) + αR,i+1Ni+1,k(t)) + ∑ i=r+1n+1d i∗N i+1,k(t) | |||
= ∑ i=0r−k+1d iNi,k(t) + ∑ i=r−k+2r(d iαL,i + di−1αR,i)Ni,k(t) + ∑ i=r+1n+1d i−1Ni,k(t) |
![]() |
Le curve NURBS (Non Uniform Rational B-SPLINEs) sono un’estensione delle B-SPLINEs analoga
alla razionalizzazione delle curve di Bézier.
La curva NURBS è definita come:
![]() |
Per comodità si indica con w(t) = ∑
i=0nβ
iNi,k(t) e di conseguenza con Ri,k(t) = ; così
l’espressione della curva diventa:
![]() |
Le proprietà delle curve NURBS derivano direttamente da quelle delle B-SPLINEs, se βi > 0 ∀ i.
Per studiare l’influenza dei coefficienti si può calcolare cosa succede quando uno di questi cambia. Si definisce:
![]() |
e di conseguenza:
![]() |
La nuova curva differisce dalla nuova di:
![]() |
ovvero l’effetto è limitato dalla proprietà di località di Nj,k(t), ha verso (dj − X(t)) (cioè è in direzione del nodo interessato dal cambio di peso) e ha ampiezza Δβj.
![]() |
tali che† xi ∈ℝk e f i ∈Ed, il problema dell’interpolazione consiste nel trovare una curva f(t) (tipicamente una funzione polinomiale: f(t) ∈ Πn(t)) ed una parametrizzazione t = g(xi) per cui la funzione interpoli i dati forniti, ovvero:
![]() |
e scelte in modo che siano compatibili:
![]() |
Supponendo di vole usare la base di Lagrange† †Li,n(x) = ∏
n
per definire un polinomio interpolante ai dati, si avrebbe un’espressione del tipo:
![]() | (4.1) |
Da qui, per passare dal polinomio (4.1), strettamente legato agli xi, a una curva parametrica in t su un intervallo [a,b] arbitrario che sia interpolante gli stessi punti, si definisce:
![]() |
per la quale i punti di controllo Pi coincidono con i punti da interpolare fi, e i parametri ti
corrispondenti dipendono dalla parametrizzazione utilizzata.
Alcuni schemi di parametrizzazione sono:
![]() |
![]() |
![]() |
In generale questi stessi schemi di parametrizzazione si possono applicare nel dominio delle curve SPLINEs per segmentare il dominio della curva nei suoi sottodomini.
Si supponga di avere a disposizione i dati da interpolare in forma di triple:
![]() |
in cui fi rappresenta il valora da interpolare e fi′ la tangente alla curva nel punto di interpolazione; si cerca una funzione spline f(t) ∈ Πn che interpoli i dati in questo modo:
![]() |
Ricapitolando, dati:
![]() |
si può costruire una curva spline di terzo grado con continuità C1 interpolante a partire dalla base di Bernstein. In particolare, si cerca una curva:
X(u) | = Xi(u), u ∈ [ui,ui+1] | ||
Xi(u) | = ∑
k=03b
k,iBk3![]() |
![]() |
Dalle proprietà dei polinomi di Bernstein segue direttamente che per le condizioni agli estremi si devono imporre:
![]() |
![]() |
![]() |
Se non si hanno a disposizione triplette di dati ma soltanto coppie (ui,fi), si possono definire degli schemi per approssimare i valori fi′ ed utilizzare comunque un approccio alla Hermite per l’interpolazione.
Schema FMILL Scegliendo di approssimare le derivate in questo modo:
wi | = ![]() | ||
w0 | = ![]() ![]() |
Pi+1 | = F(ui+1) = F(ui) + hiF′(ui) + ![]() | ||
Pi−1 | = F(ui−1) = F(ui) + hi−1F′(ui) + ![]() | ||
Pi+1 − Pi−1 | = (hi−1 + hi)F′(ui) + O(h2) | ||
![]() | = F′(ui) + O(h2) |
Tangenti di Bessel
L’idea alla base delle tangenti di Bessel è quella di considerare la derivata di un polinomio di
secondo grado interpolante tre punti consecutivi come terzo valore per il polinomio interpolante di
terzo grado.
Siano qi(u) curve polinomiali a tratti in Π2 tali che:
![]() |
definite in questo modo:
![]() |
definendo t(u) = la precente può essere scritta:
qi(ui) = ∑ k=03b k,iBk2(t ui) | = Pi−1B02(t ui) + b1,1B12(t ui) + Pi+1B22(t ui) | ||
= Pi−1(1 − tui)2 + 2b 1,itui(1 − tui) + Pi+1tui2 = defPi |
![]() |
Mantenendo la notazione hi = ui+1 − ui, si ha che:
![]() |
e si può riscrivere l’equazione precedente in questa forma:
![]() |
Ora che i polinomi qi sono definiti è possibile ricavare i valori wi per i punti di interpolazione in questo modo:
wi = ![]() ![]() ![]() ![]() |
![]() |
Questo schema fornisce un’approssimazione della derivata della curva, infatti:
Pi | = F(ui) | ||
Pi−1 | = Pi − F′(ui)hi−1 + ![]() | ||
Pi+1 | = Pi + F′(ui)hi + ![]() | ||
![]() | = F′(ui) + ![]() | ||
![]() | = F′(ui) −![]() | ||
![]() |
Dati:
![]() |
si vuole definire una spline C2 composta dalle curve:
![]() |
†per brevità si pone ui+1 − ui = hi per le quali valgono le condizioni:
Xi(ui) | = Xi−1(ui) = Pi | ||
![]() | = ![]() | ||
![]() | = ![]() | ||
b0,i | = Pi | ||
b1,i | = Pi + ![]() | ||
b2,i | = Pi+1 −![]() | ||
b3,i | = Pi+1 | ||
Dalle condizioni di continuità della derivata seconda =
, segue che:
![]() |
ovvero:
![]() ![]() ![]() ![]() | ||
![]() ![]() | |||
= ![]() ![]() |
![]() |
I Tn sono tutti termini noti, e si ha un sistema di n−1† †considerando n intervalli equazioni in n + 1‡ ‡tutti i wi incognite, che può essere scritto nella forma:
![]() | (4.2) |
in cui:
![]() |
ed A è una matrice in M(n−1)×(n−1) ad elementi:
![]() |
Rimangono da fissare i valori delle derivate agli estrimi w0 e wn. Alcune tra le scelte più comuni sono le seguenti:
![]() |
si ha, per i = 0:
![]() |
da cui:
![]() |
Per la derivata all’ultimo punto il ragionamento è analogo e si ha:
![]() |
La matrice A ed il vettore T dell’equazione (4.2) possono essere allargati per comprendere i valori agli estremi:
![]() |
![]() |
![]() ![]() | →![]() ![]() ![]() ![]() | ||
![]() ![]() | →![]() ![]() ![]() ![]() |
Svolgendo (la prima equazione, la seconda è analoga) si ottiene:
![]() | = ![]() | ||
![]() | = ![]() | ||
h12w 0 + (h12 − h 02)w 1 − h02w 2 | = ![]() ![]() |
β | = ![]() ![]() | ||
γ | = ![]() ![]() |
![]() |
![]() |
![]() |
da cui:
![]() ![]() | |||
= ![]() ![]() |
h0wn−1 + 2(h0 + hn−1)w0 + hn−1w1 = 3![]() |
![]() |
la matrice A e i vettori T,w dell’equazione (4.2) diventano:
![]() |
![]() |
![]() |
in cui la condizione w0 = wn è imposta implicitamente nella prima e ultima riga della matrice.
Sia s(u) una spline cubica C2 tale che:
![]() |
e y(u) una funzione qualsiasi C2 a sua volta tale che:
![]() |
La quantità:
![]() |
è una possibile misura del grado di oscillazione della curva.
Si dimostra che vale la relazione:
![]() |
Infatti:
ý(u) | = (ý(u) −![]() ![]() | ||
ý2(u) | = ![]() ![]() ![]() ![]() | ||
∫ u0un ý2(u)du | = ∫
u0un
![]() ![]() ![]() ![]() |
![]() |
in cui α = 0 ed in quanto ... s(u) è costante a tratti, β può essere trasformato nella somma:
![]() |
che a sua volta è nulla perchè valgono le condizioni y(ui) = s(ui).
Un’altra misura della stessa quantità può essere ottenuta dalla curvatura, considerando come
parametro la lunghezza dell’arco:
![]() |
Rappresentando la funzione vettorialmente:
![]() |
la curvatura assume espressione:
![]() |
da cui:
![]() |
Data una spline in forma di Bézier:
X(u) = Xi(u), u ∈ [ui,ui+1] | ||
Xi(t) = ∑
i=03b
k,iBk3(t), t = ![]() |
![]() |
Imponendo le condizioni di raccordo, considerando ω1,i = 1 si ottiene:
![]() |
Le condizioni di raccordo permettono di scrivere infine le equazioni:
![]() ![]() | |||
![]() ![]() |
![]() |
ovvero si ottiene un sistema analogo a quello delle spline C2 con un termine in più sulla diagonale:
![]() |
in cui d0,dn sono assegnati e di = hi−1hi.
Per ottenre una spline chiusa, supponendo di avere il primo punto uguale al primo (P0 = Pn) si ha
invece un sistema in n incognite in cui le prime e le ultime equazioni di A sono analoghe a quelle per
la spline periodica precedentemente ricavate, ovvero del tipo:
![]() |
e inoltre
![]() |
È interessante osservare cosa succede per νmin →∞. Innanzitutto serve calcolare:
(A + D)w | = T | ||
(AD−1 + I)(Dw) | = T | ||
(I + E)![]() | = T, E = AD, ![]() |
![]() |
si ha che:
![]() |
ovvero se D →∞, w → 0.
Una superficie, in maniera analoga ad una curva, può essere rappresentata in modo parametrico come l’immagine di una funzione continua e iniettiva di due variabili reali X : (A ∈ℝ2) →E3 tale che:
![]() |
Definizione 5.1 (Superficie parametrica regolare).
La superficie parametrica si dice regolare se valgono le condizioni:
Definizione 5.2 (Vettori associati alla superficie: tangenti e normale). Per comodità nello studio delle proprietà della superficie si definiscono i vettori:
Xu = ![]() ![]() | ||
![]() |
Osservazione 5.1 (Caratteristiche dei vettori Xu,Xv,N(u,v)). Se la superficie è regolare si ha che i vettori Xu e Xv sono linearmente indipendenti e non paralleli, ovvero Xu ∧ Xv≠0; di conseguenza anche N(u,v)≠0 ∀(u,v) ∈ A.
Sfera La sfera† †centrata nell’origine degli assi è definibile come il luogo geometrico dei punti equidistanti dall’origine:
![]() |
Una possibile parametrizzazione per i punti della superficie sferica si può dare a partire dai parametri
u ∈ [−,
] e v ∈ [0, 2π]:
![]() |
I vettori tangenti alla superficie sono quindi:
![]() |
Cono Un cono è lo spazio geometrico dei punti che soddisfano l’equazione:
![]() |
Una parametrizzazione in due parametri u ∈ [−L,L], v ∈ [0, 2π] è:
![]() |
I vettori tangenti sono, di conseguenza:
![]() |
Si definiscono due nuovi parametri in funzione di quelli vecchi:
![]() |
Data la matrice:
![]() |
la riparametrizzazione si definisce ammissibile se det J(u,v)≠0. In particolare si ha che:
Xu ∧ Xv = ![]() ![]() ![]() ![]() |
Una superficie di rivoluzione è una superficie ottenuta ruotando una curva (chiamata curva generatrice
o profilo) intorno ad un asse (detto asse di rotazione). La circonferenza ottenuta interesecando
un piano perpendicolare all’asse di rotazione con la superficie è detta parallelo, la curva
ottenuta intersecando la superficie con un piano passate per l’asse di rotazione è detta
meridiano.
In generale una superficie di rotazione è rappresentabile in modo parametrico. Sia una curva C
definita parametricamente come:
![]() |
La curva C può essere fatta ruotare intorno all’asse z definendo la superficie:
![]() |
Una superficie rigata è una superficie ottenuta da un’unione di rette.
Definizione 5.3 (Superficie rigata). Una superficie S si dice rigata se esiste una famiglia di
rette rα tale che S è l’unione delle rette di tale famiglia: S = ∪αrα.† †Una definizione equivalente è che S è rigata se per ogni punto di S passa una retta rs che sia tutta
contenuta in essa.
Date due curve C0(u),C1(u) e due parametri u ∈ [a,b],v ∈ [0, 1] una superficie rigata può essere difinita parametricamente come:
![]() |
ovvero si sfrutta l’esistenza di una corrispondenza univoca tra i punti di C0 e quelli di C1.
Se C0 e C1 sono segmenti, ovvero sono parametrizzabili come:
![]() |
la superficie rigata S può essere scritta come:
![]() |
Definizione 5.4 (Tensor product). Date due funzioni monovariate S1,S2 tali che:
S1 =< f0,...,fn >, | f0,...,fn funzioni monovariate in u ∈ [a,b] | ||
S2 =< g0,...,gm >, | g0,...,gm funzioni monovariate in v ∈ [c,d] |
![]() |
S1 ⊗ S2 è pertanto una funzione bivariata, e vale:
![]() |
Il tensor product può quindi essere utilizzato per definire superfici, considerando funzioni del tipo:
![]() |
La patch di Bézier è definita a partire dalla base omonima nel modo seguente:
![]() |
Curve di contorno La superficie è delimitata da quattro curve di contorno† †boundary :
![]() |
Posizione negli angoli Negli angoli la supericie è parallela al piano individuato dai punti di controllo. Infatti, considerando le derivate prime parziali della superficie lungo le due direzioni negli angoli, si ha:
Ẋu(0, 0) | = nΔ(1,0)b 0,0 = n(b1,0 − b0,0) | ||
Ẋu(1, 0) | = n∑ i=0n−1Δ(1,0)b i,0Bin−1(1) = nΔ(1,0)b n−1,0 = n(bn,0 − bn−1,0) | ||
Ẋv(0, 0) | = nΔ(0,1)b 0,0 = m(b0,1 − b0,0) | ||
Ẋv(0, 1) | = m∑ j=0m−1Δ(0,1)b 0,jBjm−1(1) = mΔ(0,1)b 0,m−1 = m(b0,m − b0,m−1) |
Altre proprietà In quanto somme di polinomi di Bernstein valgono le seguenti proprietà, dimostrabili in modo analogo a quanto già mostrato in modo esplicito per le curve di Bézier:
Forma compatta La superficie X(u,v) può essere espressa in forma compatta come:
![]() |
L’algoritmo di de Casteljau per le superfici funziona in maniera del tutto analoga a quello descritto
precedentemente per le curve.
Dati bij00 = b ij come punti iniziali per l’algoritmo (i = 0,..,n; j = 0,...,m), si definisce il passo dell’algoritmo unidirezionale (nelle due direzioni, rispettivamente) in questo modo:
bijk0(u) | = (1 − u)b ijk−1,0 + ub i+1,jk−1,0, i = 0,...,n − k | ||
bij0k(v) | = (1 − v)b ij0,k−1 + vb i,j+10,k−1, j = 0,...,m − k |
Svolgendo contemporaneamente nelle due direzioni si ha:
bijkl(u,v) | = (1 − v)b ijk,l−1 + vb i,j+1k,l−1 | ||
= (1 − v)![]() ![]() |
bijkl(u,v) = ![]() ![]() ![]() ![]() |
L’algoritmo di degree elevation consente di elevare il grado della patch di Bézier lungo una delle due direzioni aggiungendo una riga di punti di controllo e modificando quelli esistenti in modo opportuno. In particolare, data la superficie:
![]() |
si vuole aumentarne il grado lungo una direzione, ovvero ottenere:
Xn+1,m(u,v) | = ∑ i=0n+1 ∑ j=0mc ijBin+1(u)B jm(v) | ||
oppure | |||
Xn,m+1(u,v) | = ∑ i=0n ∑ j=0m+1d ijBin(u)B jm+1(v) | ||
Xn,m(u,v) | = ∑ i=0n ∑ j=0mb ijBin(u)B jm(v) | ||
= Xn+1,m(u,v) = ∑
i=0n+1 ∑
j=0mc
ijBin+1(u)B
jm(v) = ∑
j=0m![]() |
![]() |
che implica:
![]() |
I nuovi punti di controllo sono pertanto:
![]() |
Gli stessi ragionamenti si applicano in modo perfettamente analogo anche all’altro caso.
In generale si preferisce aumentare il grado contemporaneamente in entrambe le direzioni. Applicando lo stesso ragionamento anche nell’altra direzione si ottiene:
![]() |
da cui, come prima:
![]() |
che implica:
![]() |
Esplicitando i cij si ottiene:
dij | = ![]() ![]() ![]() ![]() | ||
= ![]() ![]() ![]() |
L’algoritmo di subdivision lungo una delle due direzioni è analogo a quello per le curve. Data la superficie:
![]() |
la si vuole suddividere in due superfici lungo una delle due direzioni:
![]() |
oppure lungo l’altra:
![]() |
In entrambi i casi, in modo analogo al caso bidimensionale i coefficienti si ottengono a partire da quelli dell’algoritmo di de Casteljau:
![]() |
per la direzione u e:
![]() |
lungo v.
Una superficie tensor-product di Bézier, come definita in precedenza, è una funzione del tipo:
![]() |
In questo caso, definiti:
![]() |
si ha che si sta lavorando su uno spazio di dimensione:
![]() |
Il problema dell’interpolazione di superfici quindi è completamente determinanto se si hanno a disposizione N campionamenti della superficie da interpolare; i dati del problema sono rappresentabili come:
![]() |
Se si hanno a disposizione campionamenti sparsi della superficie che si vuole interpolare:
![]() |
si va a risolvere il sistema:
![]() |
il quale può essere scritto nella forma:
![]() |
Se i campionamenti sono distribuiti su una griglia rettangolare:
![]() |
si vuole risolvere, come prima, il sistema:
![]() |
Per ogni coppia di punti si ha:
![]() |
Definita la matrice dei punti noti:
![]() |
e le matrici:
![]() |
il problema può essere rappresentato in forma matriciale come
![]() |
L’idea alla base delle patch triangolari è quella di usare una combinazioni baricentrica di coordinate
come parametri per muoversi su una superficie. In particolare in questo caso si considera come
dominio un triangolo non degenere T,di vertici ; i punti dell’area sono rappresentabili come
combinazione baricentrica dei vertici:
![]() |
e la superficie come una funzione:
![]() |
Le coordinate baricentriche descritte sopra sono in relazione biunivoca con quelle cartesiane. Si ha:
![]() |
Affinchè la relazione sia biunivoca (ovvero il sistema ha soluzione unica) se e solo se la matrice T è
non singolare, ovvero il triangolo non è degenere.
I polinomi di Bernstein possono essere generalizzati alle coordinate baricentriche. Per comodità si utilizza la seguente notazione:
Definizione 5.5 (polinomio di Bernstein generalizzato). Si definisce polinomio di Bernstein generalizzato il polinomio:
![]() |
Tale polinomio è bivariato e di grado n, infatti μI = uivjwk e i + j + k = n.
Fissare |I| = n riduce il numero di indici distinti a (n + 1)(n + 2)∕2.
Non negatività Tutti i fattori sono positivi o nulli, e la proprità è banalmente soddisfatta.
Partizione dell’unità Vale che:
![]() |
Dimostrazione. si ha infatti che:
1 = 1n | = (u + v + w)n = (u + (v + w))n | ||
= ∑
i=0n![]() | |||
= ∑
i=0n![]() ![]() ![]() | |||
= ∑
i=0n ∑
j=0n−i![]() ![]() | |||
= ∑
i=0n ∑
j=0n−i![]() | |||
= ∑
|I|=n![]() | |||
= BIn(μ) |
Linear Precision Si può dimostrare che vale:
![]() |
la dimostrazione è componente per componente e si riconduce direttamente alla proprietà analoga già dimostrata nel caso monovariato.
Ora è possibile dare una definizione più rigorosa delle patch triangolari di Bézier.
Definizione 5.6 (Patch triangolare di Bézier). Dato un dominio triangolare T, una patch triangolare di Bézeire di grado n è una funzione X : T →E3 del tipo:
![]() |
in cui bI ∈E3 sono chiamati punti di controllo.
Comportamento ai bordi Lungo uno dei bordi (ovvero quando uno dei tre parametri in μ è nullo si ha:
X![]() | = ∑
![]() ![]() | ||
= ∑
i=0nb
(i,n−i,0)![]() | |||
= ∑
i=0nb
(i,n−i,0) ![]() |
Controllo pseudolocale Spostando un punto di controllo:
![]() |
si ha:
![]() |
ovvero come nel caso delle curve di Bézier la modifica di un punto di controllo ha effetti su tutta la curva, in maniera proporzionale al valore del polinomio di Bernstein corrispondente.
Ai vertici del triangolo si ha:
X![]() | = ∑
![]() ![]() ![]() ![]() | ||
= ∑
i=nnb
(i,0,0)B(i,0,0)n![]() | |||
= b(n,0,0)![]() |
I polinomi di Bérnstein generalizzati posso essere espressi in forma ricorsiva:
![]() | (5.1) |
†in cui con e1,e2,e3 si indicano i versori unitari lungo le direzioni u,v,w Infatti:
BI−e1n−1(μ) | = ![]() | ||
BI−e2n−1(μ) | = ![]() | ||
BI−e3n−1(μ) | = ![]() |
![]() |
Come nel caso delle patch quadrate di Bézeir, l’algoritmo di de Casteljau si definisce a partire dalla
definizione ricorsiva del polinomi di Bernstein.
Si definiscono i punti di controllo al passo zeresimo:
![]() |
La superficie è definita dai punti:
X(μ) | = ∑ |I|=nbI0B In(μ) | ||
= ∑
|I|=nbI0![]() | |||
= ∑ |J|=n−1(ubJ+e10 + vb J+e20 + wb J+e30)B Jn−1(μ) |
e definendo:
![]() |
in generale la superficie può essere rappresentata come:
![]() |
i cui singoli punti sono quindi in:
![]() |
Data la superficie:
![]() |
la si vuole rappresentare con una patch di bezier di grado più elevato:
![]() |
In quanto u + v + w = 1 si può scrivere:
X(μ) | = ∑ |I|=nbIBIn(μ) = (u + v + w) ∑ |I|=nbIBIn(μ) | ||
= ∑
|I|=nbI![]() ![]() ![]() | |||
= †∑
|I|=nbI![]() ![]() ![]() ![]() ![]() ![]() | |||
= ‡∑
|J|=n+1![]() | |||
= ∑ |J|=n+1cIBJn+1(μ)asd |
†Chiamando uivjwk = UI
‡Considerato che UI+e1 = BI+e
1n+1 e così via
ovvero i coefficienti cI possono essere ricavati direttamente:
![]() |
All’inizio di ogni script di esempio, tutti denominati esempi˙*.sci, c’è una lista di selettori per selezionare quali figure si vogliono prodotte.