计算机图形学——bazier曲线和B样条曲线

目录

前言

一、bazier曲线

 1.bazier曲线的由来

二、B-spline

1.为何要引入B-spline曲线,Bazier曲线有何不足

2、B-spline曲线方法

前言

写这篇文章是因为最近在阅读无人机路径规划算法ego-planner,其中轨迹优化部分使用到了B样条优化,但是本人对于计算机图形学的知识不够了解,所以从头开始了解计算机图形学的知识,主要包含两种轨迹逼近算法:bazier曲线和B样条曲线

一、bazier曲线

在进入正文之前,先引入两个数值分析上的概念:插值和逼近,区别在于插值需要经过给定的点,学过数值分析的同学一定都知道lagrange插值以及Newton插值,这里不再赘述,有兴趣的同学可以翻下数值分析这本书,而本文介绍的bazier曲线B-spline曲线方法都属于逼近的范畴:

计算机图形学——bazier曲线和B样条曲线_第1张图片

 1.bazier曲线的由来

 在上个世纪工业设计的领域,前期进行设计的时候,画曲线很困难,所以很多设计师期望可以通过绘制样品的轮廓然后使用曲线来进行逼近,从而得到较为平滑的曲线,于是在1962年,法国数学家Pierre Bézier研究了通过给定控制点来绘制曲线的方法,并给出了计算公式,原始的bazier曲线计算公式如下:

计算机图形学——bazier曲线和B样条曲线_第2张图片

 其中p(t)代表贝塞尔曲线,ai是控制点,f_{i,n}(t)是基函数,称为贝塞尔基函数,这也是贝塞尔曲线基函数最原型,可以看出这个基函数十分复杂,并不利于计算,有意思的是Pierre Bézier也没有给出贝塞尔基函数的详细推导,不过后人还是给出了这个基函数的推导。针对贝塞尔基函数繁琐的缺点,在1972年,剑桥大学的博士生Forrest发表了论文《Computer Aided Design》,这篇论文的突出贡献就是证明了贝塞尔基函数可以简化成伯恩斯坦基函数

 那么计算贝塞尔曲线的公式就可以变形为:

计算机图形学——bazier曲线和B样条曲线_第3张图片

 伯恩斯坦基函数在数学上的表示已经比较简明,但是在计算机程序中,阶乘的计算量还是过大,十分影响程序的执行效率,所以de Casteljau提出了Bazier曲线的递推算法:Bazier曲线上的任一个点P(t),都是其它相邻线段的同等比例(t)点处的连线,再取同等比例(t)的点再连线,一直取到最后那条线段的同等比例(t)处,该点就是Beizer曲线上的点P(t)。这个定义听起来十分晦涩难懂,所以直接上图:

计算机图形学——bazier曲线和B样条曲线_第4张图片

 P_{0}P_{1}P_{2}连成的多边形称为特征多边形P_{0}^{1}P_{0}P_{1}这条线段1/3处的点, P_{1}^{1}P_{1}P_{2}这条线段1/3处的点,而P_{0}^{2}是 P_{0}^{1}P_{1}^{1}这条线段1/3处的点,P_{0}^{2}即是贝塞尔曲线上t = 1/3处的点,依此类推即可得到贝塞尔曲线上每一个点,这里所有的线段都是一阶的,不会带来复杂的计算量

计算机图形学——bazier曲线和B样条曲线_第5张图片

 将前两个式子代入第三个式子,即可得到:

  这个式子表达了当t从0到1变化时,由三个控制点定义的贝塞尔曲线,推广到(n+1)个控制点:

 由此就可以得到贝塞尔曲线的递推计算公式:

二、B-spline

1.为何要引入B-spline曲线,Bazier曲线有何不足

先探讨下Bazier曲线的不足之处:

(1)一旦确定了特征多边形的顶点数(n+1)个。也就确定了曲线的阶次(n)

(2)Bazier曲线的拼接比较复杂

(3)Bazier曲线不能作局部修改——牵一发而动全身

所以,1972年。Gordon、Riesenfeld等人提出了B-spline方法,既保留了Bazier曲线方法的全部优点,同时也克服了其缺点。

2、B-spline曲线方法

B-spline 核心思想:整条曲线用完整的表达形式,但内在的量是一段一段的,比如一堆的三次曲线拼接,两两之间满足二次几何连续(在结合处的一阶导成比例并且二阶导也成比例,简称C^{2}连续),如此一来既克服了Bazier曲线拼接产生间断点导致的波动现象,同时也能保证曲线的低阶特性,同时也有统一的表达式。

B-spline曲线的数学表达式:

 可以看出B-spline曲线的数学表达式和Bazier曲线的表达式十分类似,区别有两点,一是基函数的下标,即表示基函数的阶次不同,二是参数u的区间不同。

B_{i,k}(u)称为k阶(k-1)次B-spline基函数,k是刻画次数的。k可以是2到控制点个数(n+1)之间的任意整数。B-spline基函数是一个称为节点矢量的非递减的参数u的序列所决定的k阶分段多项式,这个序列称为节点向量,如下图所示:

计算机图形学——bazier曲线和B样条曲线_第6张图片

 那么B-spline基函数如何得到,这里就要提到最为推崇的de Boor-Cox递推定义,其原理是,对于k阶(k-1)次B-spline基函数,构造一种递推的公式,由0次构造1次,1次构造2次...依次类推。具体的表现形式如下:

计算机图形学——bazier曲线和B样条曲线_第7张图片

  u_{i}是节点值,U = (u_{0}.u_{1},...u_{n+k})构成了k阶(k-1)次B样条函数的节点矢量

你可能感兴趣的:(无人机)