赞
踩
贝塞尔方法是计算机图形学中的经典概念,用于设计光滑的曲线和曲面。1959年由保尔·德·卡斯特里奥初步探索。1962年,法国雷诺汽车公司工程师皮埃尔·贝塞尔(Pierre Bézier)为汽车的主体进行外形设计时归纳提出。贝塞尔构造了一种以逼近为基础的,参数曲线和曲面的设计方法,并用这种方法完成了一种称为Unisurf的曲线和曲面设计系统。
他的想法是,在设计时,先用折线段勾画出汽车的外形大致轮廓,再用光滑的参数曲线去逼近这个折线多边形。这个折线多边形,被称为特征多边形,控制多边形或贝塞尔多边形。这些点称为控制顶点,简称控制点。逼近该特征多边形的曲线即为贝塞尔曲线。
贝塞尔曲线
贝塞尔曲线由控制点位置决定其形状,控制点个数决定其次数,n+1个控制点(按顺序分别为P0、P1...Pn)对应着n阶的贝塞尔曲线(即阶次是控制点个数减1)。
首先设置一个变量t,这个变量在初学的时候可以理解为贝塞尔曲线上动点滑动的时间,定义范围为[0,1]。在此基础上,设计一套与n相关的基函数Bi,n(t)。则曲线上的动点在每个时刻,都是这些基函数的线性组合,系数则是控制点的坐标,称为矢量系数。矢量系数是各个控制点按顺序首尾相接的一系列矢量。 在给定空间上n+1个点Pi,贝塞尔曲线的参数方程表示如下:
其中Pi是控制多边形的n+1个顶点之一。Bi,n(t)称为伯恩斯坦基函数。
当初贝塞尔本人设计了一套基函数,称为原始贝塞尔基函数,如下:
这个公式十分复杂,不便于理解和计算。后来被Forrest证明,其完全等同于伯恩斯坦基(Bernstein)基函数,如下:
后来普遍使用了上式,所以你也可以把它直接认为是贝塞尔基函数。
Bi,n(t)正好是二项式定理中,二项式(t+(1-t))n 的展开公式的一项。显然因此所有的伯恩斯坦基函数之和等于1,这个特性称为权性。
伯恩斯坦基函数还有以下性质:
(1)全局支撑性:伯恩斯坦基函数在其定义[0,1]上,除端点外,均非0。
(2)在t=i/n处取最大值。
(3)积分等于1/(n+1)
(4)权性:前面说了,每个维度上,所有的伯恩斯坦基函数之和等于1。
有了基函数,按照定义就可以求出任意时刻t时,曲线上的点。
但为了好理解,先从最简单的低阶情况开始看:
1阶:
1阶贝塞尔曲线只有两个控制点(两个端点),是一条直线,随时间t的变大,由一点滑到另一点。
2阶:
2阶贝塞尔曲线有3个控制点,是一条抛物线,同样随时间t的变大,由一点滑到另一点。
二阶贝塞尔曲线的矩阵形式
一般来说,可以:
(1)根据贝塞尔曲线的定义及基函数的定义直接生成(如同前面1阶和2阶)
高中水平的二项式递归公式,看似很基础,但在高阶时,二项式系数的计算其实计算量较大
(2)de Casteljau递推算法
根据定义的方法计算量过大,而de Casteljau提出的递推算法大大减少了计算量。
我们发现,贝塞尔曲线上的任一点P(t),都是其它相邻线段的同等比例(t)点处的连线,再取同等比列(t)点处的点再连线,一直取到最后一条线段的同等比例(t)点处,最后的这个点就是点P(t)。即由n+1个控制点Pi定义的n次贝塞尔曲线P0,n,可以被定义为分别由前、后n个控制点定义的两条n-1次贝塞尔曲线P0,n-1和P1,n-1的线性组合:
最终得到de Casteljau递推算法的地推公式如下
de Casteljau递推算法稳定可靠,直观简便,在编程上十分有优势,是计算曲线的标准算法。
(1)全局性:最重要的性质,贝塞尔方法无法对曲线形状进行局部控制,改变任一控制点位置时,整个曲线均受到影响。
(2)端点性:曲线只经过两个端点的控制点(起点和终点),其它所有点只是逼近,一般不经过。
(3)起点和终点处的切线方向和特征多边形的第一条边及最后一条边相一致。
(4)几何不变形:曲线的几何特性不随坐标变换而变化,形状仅与控制多边形各顶点的相对位置有关,而与坐标系的选择无关。
(5)贝塞尔曲线的导数还是贝塞尔曲线。
(6)凸包性:凸包就是包含所有顶点的最小凸多边形。凸多边形的任一边延长,其它边都在它的一侧。贝塞尔曲线始终会在包含了所有控制点的最小凸多边形中, 不是按照控制点的顺序围成的最小多边形。通过控制点的凸包来限制规划曲线的范围。
(7)变差缩减性:当特征多边形为平面图形时,平面内任意直线与曲线的交点个数不多于此直线与其特征多边形的交点个数。此性质反映了贝塞尔曲线波动性小于其特征多边形,即比多边形折线更顺滑。
(https://www.jasondavies.com/animated-bezier/进入这个界面,可以拖动点改变贝塞尔曲线)
贝塞尔方法有很多优点,但也有几个不足之处:
(1)一旦确定了特征多边形的顶点数,就决定了曲线的阶数。当数据点的数量太多时,计算量急剧增加。
(2)由于光滑性很高,反而导致拼接比较复杂。
(3)无法做局部修改,这是一个很大的局限性,牵一发而动全身。
1972年,在贝塞尔提出他的方法十年后,Gordon和Riesenfeld等人又提出了B样条方法,在保留了贝塞尔方法的全部优点的同时,克服了以上三大缺点。
所谓样条,未来的文章会有详细介绍,简单说来,样条就是分段连续多项式,而且在全曲线上有限阶可导/连续。
B样条的整条曲线有一个完整的表达形式,在有限阶内都十分平滑,完全可以符合人的直观审美,但内在的量却是分段的。如此一来,既克服了波动现象,曲线又是低次的,既有统一的表达式,又有统一的算法。
B样条能够分段的根本,在于其基函数的局部性。
我们先来看一下伯恩斯坦基函数的样子:三次贝塞尔曲线的四个基函数如下图,每个都在[0,1]上非0,即全局支撑性。
再看如下图所画的一些基函数,他们在0到1上只具有局部支撑性。每个函数只在[0,1]的一部分非零。比如N1,2这条线,只在[0,0.5]上非零。
基函数的特点被确定后,如何做到分段但又连续呢?如果现在有n+1个点,顺序相邻的每两点之间构造一条多项式,则n+1个点有n个小区间。每个小区间都构造一条多项式,就变成了n段多项式拼接在一起,且段与段之间可以达到有限阶可导(几何连续)。
B样条的表达式为
其中Pi为各个控制顶点。B样条表达式与贝塞尔曲线十分相似,最大的区别就是基函数的不同。下标由伯恩斯坦基函数的n变为B样条基函数的k,表示B样条的多项式的次数和控制顶点的数目是没有关系的,而是由使用者自定义的。注意这里u的取值是uk-1到un+1。
其中Bi,k(u)称为k阶(k-1次)B样条基函数。k用以刻画阶次,可以是2到n+1之间的任意整数。对于贝塞尔曲线来说,阶数和次数是一样的,都是n。但对于B样条,阶数(k)就是次数(k-1)加1,和n无关。B样条基函数是一个称为节点矢量的非递减参数u的序列所决定的k阶分段多项式,这个序列就称为节点向量。
节点向量,一个有n+k+1个
因此B样条基函数实际上就是一个多项式。那么如何得到这个B样条基函数?B样条基函数可以有各种各样的定义方式,但公认的最容易理解的,且应用最广泛的是deboor cox递推定义。它的原理是,对于k阶(k-1次)的B样条基函数,构造一种递推的公式:由0次构造1次,1次构造2次,2次构造3次,以此类推。整个计算过程和金字塔差不多。
deboor cox递推公式
金字塔样式
deboor cox递推公式表明,若确定第i个k阶B样条基函数Bi,k(u),需要用到ui,ui+1...ui+k,共k+1个节点,称为区间[ui,ui+k]为此基函数Bi,k(u)的支撑区间。在此约定0/0=0。
根据公式,u在计算过程中被归一化了,所以基函数仅与各个节点之间的相对距离有关,与u的绝对大小无关。你取u=[0,1,2,3,4,5]和u=[0,0.2,0.4,0.6,0.8,1]效果是相同的。
由于B样条基函数稍微复杂一下,在研究曲线之前,先看一下低阶的一些基函数:
(1)1阶基函数是一个常数组合(0次多项式),而一阶B样条曲线就是把控制点按照顺序连起来得到的曲线,即线性插值。
(2)二阶和三阶B样条基函数多项式
二阶B样条基函数画出来类似于这个样子
可以看出,1次B样条基函数Bi,2(u)可有两个0次B样条基函数Bi,1(u)和Bi+1,1(u)递推得到,是它们的凸线性组合。同理,两个一次基函数Bi,2(u)和Bi+1,2(u)递推可以得到Bi,3(u)。
对于Bi,1(u)(1阶0次基函数)来说,仅仅涉及ui,ui+1一个区间,即一阶多项式涉及1个区间、2个节点。而Bi,2(u)是由Bi,1(u)和Bi+1,1(u)组成的,因此Bi,2(u)涉及2个区间、3个节点;以此类推,Bi,3(u)涉及3个区间、4个节点;
Bi,k(u)涉及k个区间和k+1个节点。
对于整个B样条来说,当然一共是n+k+1个节点,即全部节点向量中的节点数。
再来亿遍,怕你记不清:节点向量,一个有n+k+1个
有个一直比较模糊的事,就是u的定义区间,我们知道u是代替了贝塞尔曲线中的t,而t有明确的区间0到1,而对于u来说,我们只关系将u的定义区间用节点画成了几份。u的定义区间到底是什么?
其实前面说了。u的定义区间本身并不重要的原因是在计算过冲中归一化过,故基函数仅与各个节点之间的相对距离有关,与u的绝对大小无关。你取u=[0,1,2,3,4,5]和u=[0,0.2,0.4,0.6,0.8,1]效果是相同的。为了方便起见,我一般都默认取值区间和t一样,也是定义在0到1。
相比取值区间,更重要的在于,B样条基函数更依赖于节点向量的相对分布情况。根据节点的分布情况的不同,B样条有不同的类型,后面会讲。
(1)局部支撑性:贝塞尔曲线基函数在除端点外整个区间(0到1)非0,而B样条基函数仅在一部分区间(ui,ui+k)上非0。反之,对于每个区间(ui,ui+k),至多有k个基函数在其上非0。
(2)权性:同贝塞尔基函数。
(3)连续性:Bi,k(u)在r重节点处的连续阶不低于k-1-r。
(4)分段低次参数多项式:Bi,k(u)在每个长度非0的区间[ui,ui+1]上,都是次数不高于k次的多项式,在整个参数轴上是分段多项式。
(1)局部性:和贝塞尔曲线相比最重要的区别。B样条基函数的局部支撑性决定了B样条的局部性。k阶曲线上的一点至多与k个控制点有关,与其它控制点无关。故移动曲线上第i个控制顶点Pi,至多影响到定义在此点对应区间上的那部分曲线的形状,对曲线的其余部分不发生影响。
(2)变差缩减性:同贝塞尔曲线。
(3)几何不变性:同贝塞尔曲线。
(4)凸包性:B样条曲线落在Pi构成的凸包之中,其凸包区域小于或等于同一组控制顶点定义的贝塞尔曲线凸包区域。
(5)不同于贝塞尔曲线,B样条曲线不一定经过两个端点。
(1)均匀型B样条
当节点沿参数轴均匀等距分布时,即ui+1-ui=常数时,为均匀b样条函数。均匀型B样条的基函数呈周期性,给定n和k,所有的基函数都有相同的形状。每个后续基函数仅仅是前面基函数在新位置上的重复。有的教材称为其顺序节点方法。
(2)准均匀型B样条
准均匀B样条与均匀型的差别,在于两端节点具有重复度k。不像贝塞尔曲线,均匀B样条曲线无法过两个端点,而准均匀B样条曲线则有效保留了过两个端点的性质。有的教材称其为Clamped方法。
(3)分段贝塞尔曲线
节点矢量中两端节点具有重复度k,所有内节点重复度为k-1,这样的节点矢量定义了分段的伯恩斯坦基。即贝塞尔曲线可以看做B样条曲线的一个特例。此B样条曲线由分段的贝塞尔曲线拼接而成。因此各段就有了相对的独立性,克服了贝塞尔曲线的不足。B样条用分段贝塞尔曲线表示后,各曲线线段就有了相对的独立性,另外,关于贝塞尔曲线一整套简单有效的算法都可以直接应用于此方法。其缺点则是较大地增加了定义曲线的数据,控制顶点及节点数。
贝塞尔曲线是理解B样条的基础。贝塞尔曲线具有全局性和极佳的平滑性。其阶数取决于控制点个数。移动一个控制点,整段曲线都会变化。
B样条在贝塞尔曲线的基础上,延续其优点,弥补其不足。B样条具有局部性和一定程度的平滑性。B样条可以自定义阶次,移动控制点仅仅改变曲线的部分形状。
无论是贝塞尔曲线还是B样条,理解它们的方法是理解其基函数的特点。本文没有重点介绍贝塞尔和B样条的曲面构建方法。其原理与实现方式和曲线方法基本相同,将控制顶点的坐标数由2变为3即可。
脱离开图形学的范畴后,在数据科学的应用中,B样条作为最重要的样条方法之一。在曲线曲面的拟合中,将已知数据点按变量大小或时间顺序排序后,作为控制顶点,即可以拟合出平滑又分段的曲线曲面图形。
文字来描述图形学总是会不太形象,向大家推荐参考资料5和6的课程,结合动画,就十分易于理解。
参考资料:
3.B样条 - 知乎
5.https://www.bilibili.com/video/BV1cW411a7yB?from=search&seid=2336484137510949653
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。