【12月学习进度9/31——计算机图形学期末准备06】四阶三次B样条曲线矩阵形式推导及MATLAB实现

B样条曲线的递归定义

B样条曲线与给定的阶数 k k k节点向量都有关

即使选取的阶数 k k k 相同,但节点向量不同,则得到的曲线也不同

一些规律:
递推图示:

k k k 阶B样条 N i , k ( u ) N_{i,k}(u) Ni,k(u) 可由两个 k − 1 k-1 k1 N i , k − 1 ( u ) , N i + 1 , k − 1 ( u ) N_{i,k-1}(u),N_{i+1,k-1}(u) Ni,k1(u),Ni+1,k1(u) 递推得到

系数的含义:

系数分别为
u − u i u i + k − 1 − u i \frac{u-u_i}{u_{i+k-1}-u_i} ui+k1uiuui

u i + k − u i u i + k − u i + 1 \frac{u_{i+k}-u_i}{u_{i+k}-u_{i+1}} ui+kui+1ui+kui
分母分别为两个 k − 1 k-1 k1 阶基函数的支撑区间:

  • N i , k − 1 ( u ) N_{i,k-1}(u) Ni,k1(u) 的支撑区间为 [ u i , u i + k − 1 ) [u_i,u_{i+k-1}) [ui,ui+k1)
  • N i + 1 , k − 1 ( u ) N_{i+1,k-1}(u) Ni+1,k1(u) 的支撑区间为 [ u i + 1 , u i + k ) [u_{i+1},u_{i+k}) [ui+1,ui+k)

分子为参数 u u u N i , k ( u ) N_{i,k}(u) Ni,k(u) 的支撑区间 [ u i , u i + k ) [u_i,u_{i+k}) [ui,ui+k) 划分为两部分

  • u − u i {u-u_i} uui 为参数 u u u 距离左端节点位置
  • u i + k − u {u_{i+k}-u} ui+ku 为参数 u u u 距离右端节点位置

分子(距离)除以分母(区间长度)后,将距离归一化到 ( 0 , 1 ) (0,1) (0,1) 之间
因此, N i , p ( u ) N_{i,p}(u) Ni,p(u) N i , p − 1 ( u ) N_{i,p-1}(u) Ni,p1(u) N i + 1 , p − 1 ( u ) N_{i+1,p-1}(u) Ni+1,p1(u)线性组合,有两个系数,都在 u u u 上是线性的,在0和1之间。

四阶均匀B样条曲线

1.计算四阶B样条基函数 N i , 4 ( u ) N_{i,4}(u) Ni,4(u)

根据递推公式计算:

如上图所示,B样条基函数 N i , 4 ( u ) N_{i,4}(u) Ni,4(u) 由四段三次多项式曲线拼接而成。
四条三次多项式曲线如下图所示:
(分别为实线、虚线、点线、点划线)

其中B样条基函数 N i , 4 ( u ) N_{i,4}(u) Ni,4(u) 曲线为下图中红色曲线:

均匀B样条基函数在曲线定义域内各个节点区间上都有相同图形
(相同公式,其中所有的 u i + 1 − u i u_{i+1}-u_i ui+1ui 都相同)

上图可以分析B样条的局部控制特性

第一个控制点 P i P_i Pi 只与 N i , 4 ( u ) N_{i,4}(u) Ni,4(u) 相乘(由B样条曲线定义式得),所以其影响 N i , 4 ( u ) N_{i,4}(u) Ni,4(u) 的支撑区间 ( u i , u i + 4 ) (u_i,u_{i+4}) (ui,ui+4) 上的曲线的形状

2. 简化函数形式

以其中一个节点区间 [ u i + 3 , u i + 4 ) [u_{i+3},u_{i+4}) [ui+3,ui+4) 为例:

上图中 ( i , j ) (i,j) (i,j) 表示第 i i i 个基函数的第 j j j 段分片

上述公式中很多 u − u i + j u-u_{i+j} uui+j 形式的因子
   ↓
   ↓ 令 t j = u − u i + j t_j = u-u_{i+j} tj=uui+j
   ↓
(仍以区间 [ u i + 3 , u i + 4 ) [u_{i+3},u_{i+4}) [ui+3,ui+4) 为例)
引入
t 3 = u − u i + 3 t_3 = u-u_{i+3} t3=uui+3

u i + j ≤ u < u i + j + 1 < = > 0 ≤ t j < 1 u_{i+j} ≤ u < u_{i+j+1} <=> 0≤t_j<1 ui+ju<ui+j+1<=>0tj<1
(注: ( u i , u i + 1 , . . . , u i + k ) (u_i,u_{i+1},...,u_{i+k}) (ui,ui+1,...,ui+k)间隔为1的节点向量)

上述式子对任意的 i i i 均成立
i = 0 i=0 i=0 , t 3 t_3 t3 u u u 名称替换,得如下:

每4个点一组,确定一段三次曲线

【矩阵形式表示】

同理可得,
二阶一次B样条曲线表达式:

三阶二次B样条曲线表达式:
在这里插入图片描述在这里插入图片描述

四阶三次B样条曲线MATLAB实现

利用四阶三次的矩阵形式实现
依次计算每一段曲线的x,y坐标,并存入2个结果矩阵 x x , y y xx,yy xx,yy
x x xx xx 矩阵每一行为每一段曲线对应的所有 x x x 坐标
y y yy yy 矩阵每一行为每一段曲线对应的所有 y y y 坐标

byang.m函数文件 :

function byang(n)
%输入n个点
axis([0,100,0,100])     %定义画布大小
[px,py] = ginput(n);

plot(px,py,'ro');
hold on;

xx=[];
yy=[];%用来存储B样条的x,y值
for i=1:n-3
    %每一个i对应于一段曲线
    x_temp = [];
    y_temp = [];
    for u = 0:0.01:1
        x_item = (1/6)*[u^3,u^2,u,1]*[-1,3,-3,1;3,-6,3,0;-3,0,3,0;1,4,1,0]*[px(i);px(i+1);px(i+2);px(i+3)];
        y_item = (1/6)*[u^3,u^2,u,1]*[-1,3,-3,1;3,-6,3,0;-3,0,3,0;1,4,1,0]*[py(i);py(i+1);py(i+2);py(i+3)];
        x_temp=[x_temp,x_item];
        y_temp=[y_temp,y_item];%保存当前u对应的x,y值
    end
    %绘制完该条曲线
    %每条曲线对应于xx,yy的一行
    xx = [xx;x_temp];
    yy = [yy;y_temp];
end

[i,j] = size(xx);
for k = 1:i %i为行数
    plot(xx(k,:),yy(k,:));%画出每一段曲线
end

使用ginput函数,获取用户选中的点的坐标:

结果

  • 12
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值