Funzioni Base delle B-spline: Definizione

Le funzioni base di Bézier vengono usate come pesi. Le funzioni base delle B-spline saranno usate nello stesso modo; comunque, esse sono molto più complesse. Ci sono due interessanti proprietà che non riguardano le funzioni base di Bézier, cioè: (1) il dominio viene suddiviso dai knots, e (2) le funzioni base non sono non-nulle sull'intero intervallo. Infatti, ogni funzione base di una B-spline è non-nulla su alcuni sottointervalli adiacenti e, di conseguenza, le funzioni base di una B-spline sono completamente "locali".

Sia U un insieme di  m + 1 numeri non-decrescenti, u0 <= u1 <= u2 <= u3 <= ... <= um. Gli ui sono chiamati knots, l'insieme U si chiama vettore dei knots, e l'intervallo semi-aperto [ui, ui+1) si chiama i-esimo knot span. Notiamo che poiché alcuni degli ui possono essere uguali, alcuni knot spans possono non esistere. Se un knot ui appare k volte (cioè, ui = ui+1 = ... = ui+k-1), dove k > 1, ui è un knot multiplo di molteplicità k, scritto come ui(k). Altrimenti, se ui appare solo una volta, è un knot semplice. Se tra i knots c'è sempre la stessa distanza (cioè, ui+1 - ui è una costante per 0 <= i <= m - 1), il vettore dei knots (o la sequenza dei knots) è detto uniforme; altrimenti, esso è non-uniforme.

I knots possono essere considerati come punti di divisione che suddividono l'intervallo [u0, um] in knot spans. Si suppone che tutte le funzioni base di una B-spline abbiano il loro dominio su [u0, um]. In questa nota, usiamo spesso u0 = 0 e um = 1 così che il dominio è l'intervallo chiuso [0,1].

Per definire le funzioni base di una B-spline, abbiamo bisogno di un parametro in più,  che è il grado di queste funzioni base, p. L' i-esima funzione base di una B-spline di grado p, scritta come Ni,p(u), è definita ricorsivamente come segue:

Questa di solito è conosciuta come la formula di ricorsione di Cox-de Boor. Questa definizione sembra complicata; ma, non è difficile da capire. Se il grado è zero (cioè, p = 0), queste funzioni base sono tutte step functions e questo è quello che dice la prima espressione. Cioè, la funzione base Ni,0(u) vale 1 se u è nell'i-esimo knot span [ui, ui+1). Per esempio, se abbiamo quattro knots u0 = 0, u1 = 1, u2 = 2 e u3 = 3, i knot spans 0, 1 e 2 sono [0,1), [1,2), [2,3) e le funzioni base di grado 0 sono N0,0(u) = 1 su [0,1) e 0 altrove, N1,0(u) = 1 su [1,2) e 0 altrove, e N2,0(u) = 1 su [2,3) e 0 altrove. Ciò è mostrato di seguito:

Per capire il modo di calcolare Ni,p(u) per p > 0, usiamo lo schema di calcolo triangolare. Tutti i knot spans sono elencati sulla prima colonna a sinistra e tutte le funzioni base di grado zero sulla seconda. Questo schema è mostrato nel seguente diagramma:

Per calcolare Ni,1(u), sono richieste Ni,0(u) e Ni+1,0(u). Quindi, possiamo calcolare N0,1(u), N1,1(u), N2,1(u), N3,1(u) e così via. Tutte le Ni,1(u) sono scritte sulla terza colonna. Una volta che tutte le Ni,1(u) sono state calcolate, possiamo calcolare le Ni,2(u) e metterle sulla quarta colonna. Questo processo continua finché tutte le Ni,p(u) richieste sono state calcolate.

Sopra, abbiamo ottenuto N0,0(u), N1,0(u) e N2,0(u) per il vettore dei knots U = { 0, 1, 2, 3 }. Calcoliamo N0,1(u) e N1,1(u). Per calcolare N0,1(u), poiché i = 0 e p = 1, dalla definizione abbiamo

Poiché u0 = 0, u1 = 1 e u2 = 2, la formula sopra diventa

Poiché N0,0(u) è non-nulla su [0,1) e N1,0(u) è non-nulla su [1,2), se u è in [0,1) (rispettivamente, [1,2) ), solo N0,0(u) (rispettivamente, N1,0(u) ) fornisce un contributo in N0,1(u). Perciò, se u è in [0,1), N0,1(u) vale uN0,0(u) = u, e se u è in [1,2), N0,1(u) vale (2 - u)N1,0(u) = (2 - u). Con un calcolo simile si ottiene N1,1(u) = u - 1 se u è in [1,2), e N1,1(u) = 3 - u se u è in [2,3). Nella seguente figura, le linee nera e rossa sono rispettivamente N0,1(u) e N1,1(u). Notiamo che N0,1(u) (rispettivamente, N1,1(u)) è non-nulla su [0,1) e [1,2) (rispettivamente, [1,2) e [2,3)).

Una volta disponibili N0,1(u) e N1,1(u), possiamo calcolare N0,2(u). La definizione ci porta alla seguente formula:

Inserendo i valori dei knots si ottiene

Notiamo che N0,1(u) è non-nulla su [0,1) e [1,2) e N1,1(u) è non-nulla su [1,2) e [2,3). Quindi, dobbiamo considerare tre casi:

  1. u è in [0,1):
    In questo caso, solo N0,1(u) fornisce un contributo al valore di N0,2(u). Poiché N0,1(u) è u, abbiamo

  2. u è in [1,2):
    In questo caso, sia N0,1(u) che N1,1(u) forniscono un contributo in N0,2(u). Poiché N0,1(u) = 2 - u e N1,1(u) = u - 1 su [1,2), abbiamo

  3. u è in [2,3):
    In questo caso, solo N1,1(u) fornisce un contributo in N0,2(u). Poiché N1,1(u) = 3 - u su [2,3), abbiamo

Se disegniamo il segmento di curva per ognuno di questi tre casi, vedremo che due segmenti di curva adiacenti sono uniti attraverso i knots per formare una curva. Più precisamente, i segmenti di curva del primo e secondo caso si uniscono in u = 1, mentre i segmenti di curva del secondo e terzo caso si uniscono in u = 2. Notiamo che la curva composita mostrata qui è regolare. Ma in generale non è sempre così se un vettore dei knots contiene knots multipli.

Due Osservazioni Importanti

Poiché Ni,1(u) è calcolata a partire da Ni,0(u) e Ni+1,0(u) e poiché Ni,0(u) e Ni+1,0(u) sono non-nulle sullo span [ui, ui+1) e [ui+1, ui+2), rispettivamente, Ni,1(u) è non-nulla su questi due spans. In altre parole, Ni,1(u) è non-nulla su [ui, ui+2). Similmente, poiché Ni,2(u) dipende da Ni,1(u) e Ni+1,1(u) e poiché queste due funzioni base sono non-nulle su [ui, ui+2) e [ui+1, ui+3), rispettivamente, Ni,2(u) è non-nulla su [ui, ui+3). In generale, per determinare il dominio non-nullo di una funzione base Ni,p(u), si può condurre il calcolo usando lo schema di calcolo triangolare fino a raggiungere la prima colonna. Gli spans coperti sono il dominio non-nullo di questa funzione base. Per esempio, supponiamo di voler tirare fuori il  dominio non-nullo di N1,3(u). Sulla base della discussione fatta sopra, possiamo condurre il calcolo nelle direzioni nord-ovest e sud-ovest fino a raggiungere la prima colonna come mostrato con la linea blu tratteggiata nel seguente diagramma. Così, N1,3(u) è non-nulla su [u1, u2), [u2, u3), [u3, u4) e [u4, u5). Oppure, equivalentemente, essa è non-nulla su [u1, u5).

Riassumendo, abbiamo le seguenti osservazioni:

In seguito, analizzeremo la direzione opposta. Dato un knot span [ui, ui+1), vogliamo sapere quali funzioni base useranno questo span nel loro calcolo. Possiamo iniziare con questo knot span e disegnare una freccia obbligata verso nord-est e una verso sud-est. Tutte le funzioni base racchiuse in questa forma a spicchio usano Ni,0(u) e quindi sono non nulle su questo span. Perciò, tutte le funzioni base di grado p che sono non-nulle su [ui, ui+1) sono nell'intersezione tra questo spicchio e la colonna che contiene tutte le Ni,p(u). Infatti, questa colonna e le due frecce formano un triangolo equilatero di cui questa colonna è il lato verticale. Contando da Ni,0(u) a Ni,p(u) ci sono p+1 colonne. Perciò, il lato verticale del triangolo equilatero deve avere al più p+1 entrate: Ni,p(u), Ni-1,p(u), Ni-2,p(u), ..., Ni-p+2,p(u), Ni-p+1,p(u) e Ni-p,p(u).

Osserviamo questo diagramma. Per trovare tutte le funzioni base di grado 3 che sono non-nulle su [u4, u5), disegniamo due frecce e tutte le funzioni sui lati verticali sono ciò che vogliamo. In questo caso, esse sono N1,3(u), N2,3(u), N3,3(u), e N4,3(u). Questo è mostrato con il triangolo arancione. Il triangolo blu (rispettivamente, rosso) mostra le funzioni base di grado 3 che sono non-nulle su [u3, u4) (rispettivamente, [u2, u3) ). Notiamo che ci sono solo tre polinomi di base di grado tre che sono non-nulli su [u2, u3).

Riassumendo, abbiamo osservato la seguente proprietà.

Qual è il significato dei coefficienti

Infine cerchiamo di capire il significato dei coefficienti nella definizione di Ni,p(u). As Ni,p(u) is being computed, it uses Ni,p-1(u) and Ni+1,p-1(u). Il primo è diverso da zero nell'intervallo [ui, ui+p). Se u appartiene a quest'intervallo semiaperto, u - ui rappresenta la distanza tra u e l'estremo sinistro dell'intervallo, la lunghezza dell'intervallo è ui+p - ui, e (u - ui) / (ui+p - ui) è il rapporto tra le distanze su menzionate ed è sempre copmpreso tra 0 e 1 (vedere il diagramma sotto). Il secondo termine, Ni,p-1(u), è diverso da zero nell'intervallo [ui+1, ui+p+1). Se u appartiene a tale intervallo, allora ui+p+1 - u rappresenta la distanza tra u e l'estremo destro di qiest'intervallo, ui+p+1 - ui+1 è la lunghezza dell'intervallo e (ui+p+1 - u) / (ui+p+1 - ui+1) è il rapporto tra le due distanze, il cui valore è compreso tra 0 e 1. Pertanto Ni,p(u) è una combinazione lineare di Ni,p-1(u) e Ni+1,p-1(u) con due coefficienti, entrambi lineari rispetto a u, compresi tra 0 e 1.