B-Splines
>function N0 (x,k,t) := x>=t[k] && x<t[k+1]

>function map N (x,k,n;t) ...
if n<=0 then return N0(x,k,t); endif;
if x<=t[k] then return 0;
else if x<t[k+n+1] then
sum=0;
if t[k]<t[k+n] then
sum=sum+N(x,k,n-1,t)*(x-t[k])/(t[k+n]-t[k]);
endif;
if t[k+1]<t[k+n+1] then
sum=sum+N(x,k+1,n-1,t)*(t[k+n+1]-x)/(t[k+n+1]-t[k+1]);
endif;
return sum;
endif;
return 0;
endfunction
>plot2d("N";1,2,[1,2,3,4],a=1,b=4); insimg;

>plot2d("N";1,2,[1,1,1,4],a=1,b=4); insimg;

>function plotall (t,n) ...
plot2d(none,a=min(t)+epsilon,b=max(t)-epsilon,c=0,d=1); .. set plot window
loop 1 to cols(t)-n
plot2d("N";#,n,t,add=1); .. plot #-th B-spline
end
return plot();
endfunction
>plotall([1,1,1,2,3,4,4,4],2); insimg;

>x=0:0.01:5; t=[1,1,1,2,3.1,4,4,4]; k=1:5; y=sum(Nmap(x',k;2,t))';
>plot2d(x,y,thickness=2); insimg;

>function BSplineCurve (x,t,K) ...
n=cols(t)-cols(K)-1;
y=zeros(rows(K),cols(x));
loop 1 to rows(K)
y[#]=sum(K[#]*Nmap(x',1:cols(K[#]);n,t))';
end
return y;
endfunction
>function plotPolygon (K,add=1) ...
plot2d(K[1],K[2],thickness=2,add=add);
return plot2d(K[1],K[2],points=1,style="[]",add=1);
endfunction
>t=[1,1,1,2,3,3,3]; K=[0,1,1,-1;1,1,-1,-1]; ...
>x=linspace(1.001,2.999,300); ...
>y=BSplineCurve(x,t,K); ...
>plot2d(y[1],y[2],a=-1.1,b=1.1,c=-1.1,d=1.1); ...
>plotPolygon(K); insimg;

>function NurbsCurve (x,t,K,w) ...
Kw=w*K_w;
y=BSplineCurve(x,t,Kw);
y=y/y[3];
return y[1:2];
endfunction
>w=[1,3,1/2,1]; y=NurbsCurve(x,t,K,w);
>plot2d(y[1],y[2],add=1,color=4); insimg;

>y=BSplineCurve(x,t,K*w_w,[1,3,1/2,1]); ...
>h=y/y[3]; ...
>plot3d(y[1]_h[1],y[2]_h[2],y[3]_h[3],>lines,angle=-15°,>anaglyph); insimg;

Examples Homepage