B樣條是對貝塞爾曲線的一種擴展,包含兩個貝塞爾曲線不具有的優點:
1. B樣條的多項式次數可以獨立於控制點數目,而貝塞爾曲線次數和控制點是緊密相關的。
2. B樣條允許局部控制曲線或曲面生成。
B樣條曲線生成的關鍵是構造出基函數,下面提供了二次、三次和四次三種基函數來進行B樣條曲線生成。
matlab代碼如下:
clear all; close all; clc; p =ginput(); %至少點五個點,因為下面有四次樣條 plot(p(:,1),p(:,2),'k-o'); %二次均勻b樣條 re2=[]; for i=1:length(p)-2 for t=0:0.01:1 b0 = 1/2*(1-t)^2; b1 = 1/2*(-2*t^2+2*t+1); b2 = 1/2*t^2; x=b0*p(i,1)+b1*p(i+1,1)+b2*p(i+2,1); y=b0*p(i,2)+b1*p(i+1,2)+b2*p(i+2,2); re2=[re2;x y]; end end %三次均勻b樣條 re3=[]; for i=1:length(p)-3 for t=0:0.01:1 b0=1/6*(1-t)^3; b1=1/6*(3.*t^3-6*t^2+4); b2=1/6*(-3*t^3+3*t^2+3*t+1); b3=1/6*t^3; x=b0*p(i,1)+b1*p(i+1,1)+b2*p(i+2,1)+b3*p(i+3,1); y=b0*p(i,2)+b1*p(i+1,2)+b2*p(i+2,2)+b3*p(i+3,2); re3=[re3;x y]; end end %四次均勻b樣條 re4=[]; for i=1:length(p)-4 for t=0:0.01:1 b0=1/24*(t^4-4*t^3+6*t^2-4*t+1); b1=1/24*(-4*t^4+12*t^3-6*t^2-12*t+11); b2=1/24*(6*t^4-12*t^3-6*t^2+12*t+11); b3=1/24*(-4*t^4+4*t^3+6*t^2+4*t+1); b4=1/24*t^4; x=b0*p(i,1)+b1*p(i+1,1)+b2*p(i+2,1)+b3*p(i+3,1)+b4*p(i+4,1); y=b0*p(i,2)+b1*p(i+1,2)+b2*p(i+2,2)+b3*p(i+3,2)+b4*p(i+4,2); re4=[re4;x y]; end end hold on; plot(re2(:,1),re2(:,2),'r'); plot(re3(:,1),re3(:,2),'g'); plot(re4(:,1),re4(:,2),'b');
結果如下:

其中黑色為控制點,紅色為二次樣條,綠色為三次樣條,藍色為四次樣條。
