三次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

附:样条工具箱函数

  1. 三次样条函数
    csapi 插值生成三次样条函数
    csape 生成给定约束条件下的三次样条函数
    csaps 平滑生成三次样条函数
    cscvn 生成一条内插参数的三次样条曲线
    getcurve 动态生成三次样条曲线

  2. 分段多项式样条函数
    ppmak 生成分段多项式样条函数
    ppual 计算在给定点处的分段多项式样条函数值

  3. B样条函数
    spmak 生成B样条函数
    spcrv 生成均匀划分的B样条函数
    spapi 插值生成B样条函数
    spap2 用最小二乘法拟合生成B样条函数
    spaps 对生成的B样条曲线进行光滑处理
    spcol 生成B样条函数的配置矩阵

  4. 有理样条函数
    rpmak 生成有理样条函数
    rsmak 生成有理样条函数

  5. 样条操作函数
    fnval 计算在给定点处的样条函数值
    fmbrk 返回样条函数的某一部分(如断点或系数等)
    fncmb 对样条函数进行算术运算
    fn2fm 把一种形式的样条函数转化成另一种形式的样条函数
    fnder 求样条函数的微分(即求导数)
    fndir 求样条函数的方向导数
    fnint 求样条函数的积分
    fnjmp 在间断点处求函数值
    fnplt 画样条曲线图
    fnrfn 在样条曲线中插入断点。
    fntlr 生成tarylor系数或taylor多项式

  6. 样条曲线端点和节点处理函数
    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-6
u.u+3u.u.u);
a3=1/6
(1+3
u+3
u.u-3u.u.u);
a4=1/6
u.u.u;
b1=1/6
(1-3
v+3
v.v-v.v.v);
b2=1/6
(4-6
v.v+3v.v.v);
b3=1/6
(1+3
v+3
v.v-3v.*v.v);
b4=1/6
v.*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-6
u.u+3u.u.u);
N3=1/6
(1+3
u+3
u.u-3u.*u.u);
N4=1/6
u.*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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值