三次b样条插值函数
原文地址:用matlab實現B樣條曲線作者:云夢之殤
三次b樣條插值函數是
spline = spapi(knots,x,y)
spapi(k,x,y)
spapi({knork1,…,knorkm},{x1,…,xm},y)
spapi(…,‘noderiv’)
% B樣條曲線生成程序
% 說明:給定8個控制頂點{(3 5),(2 4),(3 2),(6 1),(5 8),(10 6),(8 1),(6 0)}
%load c;x=800:25:1800;
%a(1,:)=x;a(2,:)=c;
a=[10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90;
20 16 26 26 26 26 24 24 24 22 22 16 28 26 26 26 24]; % 控制頂點數組;
%a=[4 3 2 3 6 5 10 8 6 4;6 5 4 2 1 8 6 1 0 -1];%增加兩個控制頂點(4 6)(4 -1)從而使曲線通過原來的首末點;
plot(a(1,:),a(2,:),’:’); % 繪制控制多邊形;
hold on; % 默認為hold off,此命令用來保留控制多邊形的圖形;
for i=1:38; % 由于4個頂點可以確定一條B樣條,共有8個控制頂點,可確定5條B樣條曲線;
%for i=1:7;
for u=0:0.001:1; % 參數u;
b0=1.0./6.(1-u).^3; % 基函數b0;
b1=1.0./6.(3.u.3-6.*u.2+4); % 基函數b1;
b2=1.0./6.(-3.*u.3+3.*u.2+3.*u+1); % 基函數b2;
b3=1.0./6.*u.^3; % 基函數b3;
x=b0.*a(1,i)+b1.*a(1,i+1)+b2.*a(1,i+2)+b3.*a(1,i+3); % 確定曲線的橫坐標x;
y=b0.*a(2,i)+b1.*a(2,i+1)+b2.*a(2,i+2)+b3.*a(2,i+3); % 確定曲線的縱坐標y;
line(x,y); % 繪制曲線坐標點;
end
end
hold off;
轉自:http://hi.baidu.com/liyaosong707/blog/item/a248da24183fcf34c99559ff.html
%==均勻三次B樣條曲線插值=
%
%see also http://www.matlabsky.com
%
%定義變量:
%X:原始資料,d:控制頂點
%n:數據條數,k:B樣條的次數
%
X=load(‘data.txt’);
n=length(X); %得數據維數;
%A:方程系數-----------------------------
A=zeros(n+2);
A(1,1)=1;A(1,2)=-2;A(1,3)=1;
A(n+2,n)=1;A(n+2,n+1)=-2;A(n+2,n+2)=1;
for i=2:(n+1)
A(i,i-1)=1;
A(i,i)=4;
A(i,i+1)=1;
end
%e:方程右邊.得到的控制點首尾與插值數據相同.且與控制首末連線相切
e=[0,0];
e(n+2,:)=[0,0];
轉自:http://www.matlabsky.com/thread-669-1-1.html
Matlab樣條工具箱(Spline ToolBox)與曲線擬合
MATLAB 樣條工具箱可以通過節點獲得樣本函數值,但不能根據x求y或z,也不能求得樣本曲線方程。例如:
ctrlpoints=[
0 -1.2 -1.6 -1.4 -1 -0.5 -0.35 -0.6 -1.6-0.2 -0.5 -1 -1.5 -2.2 -2.7 -3.2 -3.7 -4.2];
knots=[0 0 0 0 1 2 3 4 5 6 6 6 6];
x0=ctrlpoints(1,:);
y0=ctrlpoints(2,:);
plot(x0,y0,‘ro’);%畫所有控制點
hold on;
sp = spmak(knots,ctrlpoints);%生成B樣條函數
fnplt(sp,[knots(1),knots(13)]);%根據所有節點,畫樣條曲線圖
%fnplt(sp,‘b*’);
%hold on;
dt=knots(1):1:knots(13);
p = fnval(sp,dt);%計算在給定點處的樣條函數值
plot(p(1,:),p(2,:),’*g’);
dp1 = fnder(sp);%求樣條函數的微分(即求導數)
dp = fnval(dp1,dt);
len = size(dt,2);
for i = 1:len
dir = dp(:,i);
scale = 1/sqrt(dir(1)2+dir(2)2);
dir = dir*scale;
plot([p(1,i),p(1,i)+dir(2)],[p(2,i),p(2,i)-dir(1)],‘r’);
end
axis equal
另外:
Matlab 樣條工具箱(Spline ToolBox)
Matlab樣條工具箱中的函數提供了樣條的建立,操作,繪制等功能;
一. 樣條函數的建立
第一步是建立一個樣條函數,曲線或者曲面。這里的樣條函數,根據前綴,分為4類:
cs* 三次樣條
pp* 分段多項式樣條,系數為t^n的系數
sp* B樣條, 系數為基函數B_n^i(t)的系數
rp* 有理B樣條
二. 樣條操作
樣條操作包括:函數操作:求值,算術運算,求導求積分等等
節點操作:主要是節點重數的調節,設定,修改等等
三. 簡單示例
% step1: load ctrlpoints and knots
load data_example
% step 2: create the spline
sp = spmak(knots,ctrlpoints’);
fnplt(sp,[knots(5),knots(42)]);
% step 3: get points on the curve
dt = knots(5):3:knots(42);
p = fnval(sp,dt);
plot(p(1,:),p(2,:),’.g’)
% step 4: get dir draw normals
dp1 = fnder(sp);
dp = fnval(dp1,dt);
len = size(dt,2);
for i = 1:len
dir = dp(:,i);
scale = 1/sqrt(dir(1)2+dir(2)2);
dir = dir*scale;
plot([p(1,i),p(1,i)+dir(2)],[p(2,i),p(2,i)-dir(1)],‘r’);
end
附:樣條工具箱函數
三次樣條函數
csapi 插值生成三次樣條函數
csape 生成給定約束條件下的三次樣條函數
csaps 平滑生成三次樣條函數
cscvn 生成一條內插參數的三次樣條曲線
getcurve 動態生成三次樣條曲線
分段多項式樣條函數
ppmak 生成分段多項式樣條函數
ppual 計算在給定點處的分段多項式樣條函數值
B樣條函數
spmak 生成B樣條函數
spcrv 生成均勻劃分的B樣條函數
spapi 插值生成B樣條函數
spap2 用最小二乘法擬合生成B樣條函數
spaps 對生成的B樣條曲線進行光滑處理
spcol 生成B樣條函數的配置矩陣
有理樣條函數
rpmak 生成有理樣條函數
rsmak 生成有理樣條函數
樣條操作函數
fnval 計算在給定點處的樣條函數值
fmbrk 返回樣條函數的某一部分(如斷點或系數等)
fncmb 對樣條函數進行算術運算
fn2fm 把一種形式的樣條函數轉化成另一種形式的樣條函數
fnder 求樣條函數的微分(即求導數)
fndir 求樣條函數的方向導數
fnint 求樣條函數的積分
fnjmp 在間斷點處求函數值
fnplt 畫樣條曲線圖
fnrfn 在樣條曲線中插入斷點。
fntlr 生成tarylor系數或taylor多項式
樣條曲線端點和節點處理函數
augknt 在已知節點數組中添加一個或多個節點
aveknt 求出節點數組元素的平均值
brk2knt 增加節點數組中節點的重次
knt2brk 從節點數組中求得節點及其重次
knt2mlt 從節點數組中求得節點及其重次
sorted 求出節點數組的元素在另一節點數組中屬于第幾個分量
aptknt 求出用于生成樣條曲線的節點數組
newknt 對分段多項式樣條函數進行重分布
optknt 求出用于內插的最優節點數組
chbpnt 求出用于生成樣條曲線的合適節點數組
轉自:http://blog.csdn.net/wuzoujing/article/details/4943251
基于Matlab的雙三次有理B樣條曲面
xc=[1,1,2,1;4,4,4,4;7,6,7,8;10,9,10,9;];
yc=[1,3,6,9;0,3,6,10;0,3,6,9;1,4,7,10;];
zc=[3,5,5,2;4,6,7,4;4,7,6,5;2,4,5,4];%給出控制點坐標
%下面計算基函數
i=0; %i表示點的標號
for u=0:0.01:1
for v=0:0.01:1
i=i+1;
a1=1/6*(1-3u+3u.u-u.u.u);
a2=1/6(4-6u.u+3u.u.u);
a3=1/6(1+3u+3u.u-3u.u.u);
a4=1/6u.u.u;
b1=1/6(1-3v+3v.v-v.v.v);
b2=1/6(4-6v.v+3v.v.v);
b3=1/6(1+3v+3v.v-3v.*v.v);
b4=1/6v.*v.*v;
xq(i)=[a1 a2 a3 a4]xc[b1;b2;b3;b4];%曲面上點的坐標賦值
yq(i)=[a1 a2 a3 a4]yc[b1;b2;b3;b4];
zq(i)=[a1 a2 a3 a4]zc[b1;b2;b3;b4];
end
end
mesh(xc,yc,zc);%控制點的網格
hidden;
hold on;
plot3(xq,yq,zq);%生成曲面
[轉載]用matlab實現B樣條曲線
b1=[2,2];b2=[3,5];b3=[5,6];b4=[7,3];%四個型值點的橫縱坐標值 可以自定
plot([b1(1),b2(1),b3(1),b4(1)],[b1(2),b2(2),b3(2),b4(2)],‘o’);%畫出型值點
hold on;
N=[5 1 0 0;1 4 1 0;0 1 4 1;0 0 1 5];
P=N(6*([b1;b2;b3;b4]));%P是二維數組 存放控制點 求出P
xc1=P(1); %對應6個控制點
xc2=P(2);
xc3=P(3);
xc4=P(4);
yc1=P(5);
yc2=P(6);
yc3=P(7);
yc4=P(8);
plot([xc1,xc2,xc3,xc4],[yc1,yc2,yc3,yc4],’’)%畫出控制點
hold on;
plot([xc1,xc2,xc3,xc4],[yc1,yc2,yc3,yc4])%連接控制點
hold on;
u=0:0.01:1;
N1=1/6(1-3u+3u.u-u.u.u);%基函數
N2=1/6(4-6u.u+3u.u.u);
N3=1/6(1+3u+3u.u-3u.*u.u);
N4=1/6u.*u.*u;
xp=xc1.*N1+xc1.*N2+xc2.*N3+xc3.*N4;
yp=yc1.*N1+yc1.*N2+yc2.*N3+yc3.*N4;
plot(xp,yp);%正算第一段B樣條
hold on;
xp=xc1.*N1+xc2.*N2+xc3.*N3+xc4.*N4;
yp=yc1.*N1+yc2.*N2+yc3.*N3+yc4.*N4;
plot(xp,yp);%正算第二段B樣條
hold on;
xp=xc2.*N1+xc3.*N2+xc4.*N3+xc4.*N4;
yp=yc2.*N1+yc3.*N2+yc4.*N3+yc4.*N4;
plot(xp,yp);%正算第三段B樣條
hold on;
http://hi.baidu.com/aillieo/blog/item/e001793ff61172e154e72349.html
總結
- 上一篇: IPFS应用丨Cloudflare的IP
- 下一篇: Uva129 Krypton Facto