B-spline就是Basis Spline的简称:
术语B-spline一词,是由罗马尼亚裔美国数学家Isaac Jacob Schoenberg创造的(就是下图的这个老爷爷,我在wiki百科上找到了他的照片)。一个n阶的B-spline函数,是一个变量为x的n-1次分段多项式函数f(x)。分段函数之间,段与段之间的断点被称为knots。
B-spline的定义:(虽然我也很不想一上来就给个定义)
B-spline函数(上图中的f(t)),可以看成是一系列控制点(Control points)和权重函数
(Weight function)的线性组合。简而言之,B-spline曲线就是每个控制点乘以与之对应的权重函数的加权和。控制点是我们后期指定的,而权重函数是我们预先定义好的,只跟阶数D有关,不会因为控制点的变化而改变。
(注意:以下只讨论权重函数N(t),暂时还不涉及控制点P)
权重函数的定义:
当阶数D=1时:
函数的定义,可以参考Cox–de Boor的递归公式。对于给定的knots,当D=1时,一阶权重函数
可以定义为:
(公式1)
当阶数D>1时:
有了一阶权重函数以后,其他所有阶数(D)大于1的高阶权重函数都可以按照如下递归表达式来定义的:
(公式2)
公式1和公式2合称为Cox-de Boor recursion formula。
且有如下性质:
1,阶数为D的权重函数的,是关于t的D-1次多项式。
2,Positivity: 当t在此区间内时,函数值一定不为0,即
。
3,Local support: 前面的Positivity定义了高阶权重函数在哪里有值,而这里的local support则是定义了高阶权重函数在哪里没有值。和一阶权重函数一样,对于区间[ ~
]之外的t,
。 4,Partition of Unity: 在区间[
~
]内,所有非0阶权重函数的和为1。(这个性质我自己也没看懂)
5,Recursion: 递归性,这一性质由公式2决定。
例如,当D=2时:
其中和
都是已知的一阶权重函数。
6,一个D阶B-spline函数是由一些D-1阶多项式曲线连起来的(参考性质1)。每段函数之间的断点/连接点(breakpoints),被称为knot,用非递减序列表示,这些knot的合集被称为knot vector list,共m+1个knot。
knot与knot之间的半开半闭区间[,
)被称为knot span或i-th knot span,意思就是两个knot之间的跨度。如果knot vector list中,所有的knot都是等间隔的,即
,则我们说T是uniform的,否则,称之为non-uniform。(本文中讨论的都是uniform B-spline)
7,一但knot vector list确定了以后,对于阶数为D的B-spline函数,每段函数与函数之间在断点knot处保证阶连续。(注:函数的连续性和knot的选择方式有关)
举个例子,简要的说明一下上述性质。对于一阶权重函数而言,阶数D=1,每段函数都是一个D-1=0阶多项式。当i=0时,有一阶权重函数
,对应knot span[0,1)。在[0,1)之间的函数值不为0,在这之外函数值都等于0。
权重函数定义的简化:
为了方便计算,上面定义的权重函数可以做进一步的简化。一般情况下,会把knot vector list也就是函数之间的断点,简化成一组非递减的正整数。简而言之,就是把原来的
变成非递减的正整数0,1,2,...m。
(简化后的公式1)
(简化后的公式2)
为了更好的说明当D>1时的Cox–de Boor递归公式,我这里借鉴了一张别人网站里的插图,为了后续描述方便,我这里暂且称它为Cox–de Boor递归流程图(见参考文献1)。
首先,让我们把目光放在图中三角形的最左上角的一个小三角形,
和
,他所要表达的是,要想求出二阶函数
,我们需要先知道一阶函数
和
。这就是说,要想知道上图中左起第二列的所有二阶函数
,
,。。。
,必须先知道他们所对应的左起第一列的一阶函数
,
。。。
。依此类推,当我们要计算六阶函数
时,首先需要先知道五阶函数
和
,其次我们需要相应的所有四阶函数,三阶函数。。。直到一阶函数。
从公式的角度看也一样,根据简化后的公式,我们发现要想得到阶数为D的第i段函数,需要先知道阶数为D-1的第i段函数
和阶数为D-1的第i+1段函数
。以此类推,要想知道D-1阶的第i段函数
和第i+1段函数
,我们又分别需要
和
,以此类推直到对应的一阶权重函数。
下面我们由低到高,详细探讨一下几个不同阶数的权重函数。我这里再次强调,到目前为止都没有讨论过控制点
,而只讨论权重函数,目的是为了避免混淆对权重函数
和控制点
,这两个B-spline中最重要的概念的理解。因为,所谓的B-spline就是这两个概念的线性组合,只有分别理解他们的各自的作用,才能更好的理解B-spline。
一阶权重函数:
一阶权重函数,D=1,t=[i,i+1),有效区间为i+1。
首先,我们知道权重函数都有一个有效区间,这里我暂且把他称之为t的定义域,毕竟函数在定义域之外是有值的,且值为0。
这里我们统一以7个knots为例,knot vector list T={0,1,2,3,4,5,6},每段函数的knot span为1。对于第0段函数,也就是当i=0时,t的定义域为[0,1),函数的断点knot为0,1。对于最后一段函数,也就是第5段函数,此时,i=5,u=[5,6),函数两端的端点knot为5,6。(注意,此时还没有用到递归函数。)
一阶权重函数的图像:
注意:相对于第i段权重函数的图像而言,第i+1段权重函数只不过是对第i段函数向右移动一位后的结果,以此类推。
Matlab code:
%% B-spline demo for CSDN
% Created: early fall, 2022. (2022/09/02)
% Author: Z.Zhu, J27
% Copy Rights Reserved.
close all
clear all
Data=[6,6,6,6,1,1];
%% 一阶B-spline中的权重函数Ni,1(u),ti为正整数的定义域
%n=6, i=0~6,共7个点, each knot span=order=1,总共可以生成7-1=6段曲线。
%N0,1(u),u=[t0~t1)=[0~1)
freq=0.01;
ti_D1=0:freq:6;
step=1/freq;
%第一段函数
u0=ti_D1(1:step);
N01=ones(1,step);
figure;
subplot(3,1,1);
plot(u0,N01);
xlabel('0
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?