Załącznik 2
Kod w MATLABie obliczający i rysujący funkcje bazowe B-spline na podstawie zadanego wektora węzłów
(zob. rozdział Implementacja w MATLABie generacji funkcji bazowych na podstawie wektora węzłów )
function spline()
knot_vector=[1,1,1,2,3,3,4,5,6,7,7,7]
precision = 0.0001
compute_nr_basis_functions = @(knot_vector,p) size(knot_vector, 2) - p - 1
mesh = @(a,c) [a:precision*(c-a):c]
p = compute_p(knot_vector)
t = check_sanity(knot_vector,p)
nr = compute_nr_basis_functions(knot_vector,p)
x_begin = knot_vector(1)
x_end = knot_vector(size(knot_vector,2))
x=mesh(x_begin,x_end);
y=compute_spline(knot_vector,p,1,x);
plot(x,y)
hold on
for i=2:nr
y=compute_spline(knot_vector,p,i,x);
plot(x,y)
endfor
hold off
function p=compute_p(knot_vector)
initial = knot_vector(1)
kvsize = size(knot_vector,2)
i=1
while (i+1 < kvsize) && (initial == knot_vector(i+1))
i=i+1
endwhile
p = i-1
return
endfunction
function y=compute_spline(knot_vector,p,nr,x)
fC= @(x,a,b) (x)/(b-a)-a/(b-a);
fD= @(x,c,d) (1-x)/(d-c)+(d-1)/(d-c);
a = knot_vector(nr);
b = knot_vector(nr+p);
c = knot_vector(nr+1);
d = knot_vector(nr+p+1);
if (p==0)
y = 0 .* (x < a) + 1 .* (a <= x & x <= d) .+ 0 .* (x > d);
return
endif
lp = compute_spline(knot_vector,p-1,nr,x);
rp = compute_spline(knot_vector,p-1,nr+1,x);
if (a==b)
y1 = 0 .* (x < a) + 1 .* (a <= x & x <= b) + 0 .* (x > b);
else
y1 = 0 .* (x < a) + fC(x,a,b) .* (a <= x & x <= b) + 0 .* (x > b);
endif
if (c==d)
y2 = 0 .* (x < c) + 1 .* (c < x & x <= d) + 0 .* (d < x);
else
y2 = 0 .* (x < c) + fD(x,c,d) .* (c < x & x <= d) + 0 .* (d < x);
endif
y = lp .* y1 .+ rp .* y2;
return
endfunction
function t=check_sanity(knot_vector,p)
initial = knot_vector(1)
kvsize = size(knot_vector,2)
t = true
counter = 1
for i=1:p+1
if (initial != knot_vector(i))
t = false
return
endif
endfor
for i=p+2:kvsize-p-1
if (initial == knot_vector(i))
counter = counter + 1
if (counter > p)
t = false
return
endif
else
initial = knot_vector(i)
counter = 1
endif
endfor
initial = knot_vector(kvsize)
for i=kvsize-p:kvsize
if (initial != knot_vector(i))
t = false
return
endif
endfor
for i=1:kvsize-1
if (knot_vector(i)>knot_vector(i+1))
t = false
endif
endfor
return
endfunction
endfunction
Listing 1 (Pobierz): MATLAB code generating and plotting B-spline basis functions using the knot vector.
Autorzy kodów w MATLABie: Marcin Łoś i Maciej Woźniak.