本文已参与「新人创作礼」活动,一起开启掘金创作之路。
B样条
什么是样条?
样条是通过一组指定点集而生成平滑曲线的柔性带。
什么是B样条?
B样条就相当于一个函数,这个函数在系数不同时就可以变化成各种曲线的形状。
B样条曲线
Bezier曲线的不足
全局性:牵一发而动全身,不利于设计
原因:基函数是全局的
样条曲线
- 分段的多项式曲线(Bezier曲线)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mg5lZ0zo-1633780575856)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211007181628645.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f5a83a94ec6e46398b35acee84fbd384~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
样条曲线的统一表达:
B样条的产生
启发:
-
Bernstein基函数的递推公式:
Bin(t)=(1−t)Bi(n−1)(t)+tBi−1(n−1)(t),其中**B00(t)=1,Bin(t)=0若i∈/{0,...,n}**
-
思路:
- 局部处处类似定义,由一个基函数平移得到
- 高阶的基函数由2个低阶的基函数"升阶"得到
关键思想:
- 以三次为例
- 我们定义一个基函数b(t)
- 特性:
- b(t)是C2连续
- b(t)是分段多项式,3次
- b(t)具有局部支持特性
- 重复平移b(t+i)形成一个统一的分区
- b(t)≥0,对于所有的t
B样条曲线的每个控制节点都有一个节点参数:节点向量
k阶均匀B样条基函数被定义为:
Ni0(t)={1,i≤t<i+10,其他

B样条的优势
- 保留了Bezier曲线的优势
- 可局部修改,调整某一控制点的时候,不会影响到整条曲线。
- 控制多边形与曲线的逼近程度较好
- 曲线拼接时比Bezier方便
B样条曲线
一般表达:
有n+1个控制点Pi(i=0,1,...,n)和一个节点向量T={t0,t1,...,tm},依次连接这些控制点可以构成一个特征多边形,k+1阶(k次)B样条的表达式如下所示,而且2≤k≤n+1,必须满足m=n+k+1,一般情况下t0=0,tm=1。所以定义域是闭区间[0,1]
P(t)=i=0∑nPiFik(t) t∈[tk−1,tn+1]
其中Fik(t)是k次B样条基函数,k表示基函数的次数,公认的是deBoor−Cox递推定义。其内容简单来说是由0次构造1次,由1次构造2次,由2次构造3次,以此类推。
递推定义:
⎩⎨⎧Fi0(t)={1,ti≤t≤ti+10,其他Fik(t)=ti+k−tit−tiFik−1(t)+ti+k+1−ti+1ti+k+1−tFi+1k−1(t)约定00=0
零次B样条
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FeGPOB1C-1633780575865)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211008163007092.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b051ab3bd502456994ff257b19f98fa7~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
一次B样条
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cX9xBsq9-1633780575867)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211008163417265.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6579c13ace244d3da387f04d0d038989~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
二次B样条

三次B样条
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBN9IIcG-1633780575868)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211008163745791.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3adee34fee7c4992abc50bd1c4e6cf07~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
B样条的曲线递推图像
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6hrszDj-1633780575870)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211008165914167.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/efad22d4b7ec4a7c98f8d3f75948e3d8~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
B样条的定义
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYm6ML13-1633780575871)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211009121336520.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4a44ec5145144d738c240aeb6b07d4a6~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
为了理解p>0时计算Ni,p(u)的方法(p为次数),我们使用三角计算格式。所有节点区间在左边第一列,所有零次基函数在第二列。见下图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYM6Le7o-1633780575872)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211009121501453.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fd7207987a4c46bf9a63701b42c2ae8f~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
为了计算Ni,1,需要Ni,0(u)和Ni+1,0(u)。因此,我们可以计算N0,1(u),N1,1(u),N2,1(u)等等。所有这些Ni,1(u)写在第三列。一旦所有Ni,1(u)计算完毕,我们可以计算Ni,2(u)并将其放在第四列。继续这个过程直到所有需要的Ni,p(u)计算完毕。
因为Ni,1(u)是从Ni,0(u)和Ni+1,0(u)计算的,因此可以得出Ni,1(u)在[ui,ui+2)上是非零的。
由上图得出结论:基函数Ni,p(u)在[ui,ui+p+1)上非零
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zlPNngqQ-1633780575873)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211009190404837.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1a22f1c38028490bb22df77f93a8728f~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
由上图可得出:在任何一个节点区间[ui,ui+1),最多有p+1个p次基函数非零,即Ni−p,p(u),Ni−p+1,p(u),Ni−p+2,p(u),...,Ni−1,p(u)和Ni,p(u)
B样条基函数的主要性质
1. 局部支撑性:
Bi,k(u)={≥0 u∈[ui,ui+k+1]=0 otherwise
而Bezier在整个区间非0。反过来,对每一个区间(ui,ui+k+1)上最多有k+1个基函数在其上非零
2. 权性:
i=0∑nBi,k(u)=1 u∈[uk,un+1]
3. 连续性:
Bi,k(u)在r重节点处的连续阶不低于k−1−r
4. 分段参数多项式:
Bi,k(u)在每个长度非零的区间[ui.ui+1)上都是次数不高于k−1的多项式,它在整个参数轴上是分段多项式
B样条函数的主要性质
1.局部性:
k阶B样条曲线上的一点至多与k个控制顶点有关,与其它控制顶点无关
移动曲线的第i个控制顶点Pi,至多影响到定义在区间上那部分曲线的形状,对曲线其余部分不发生影响
2.变差缩减性:
平面内n+1个控制顶点构成B样条曲线P(t)的特征多边形。在该平面内的任意一条直线与P(t)的交点个数不多于该直线和特征多边形的交点个数
3. 几何不变性:
B样条曲线的形状和位置与坐标系的选择无关
4.凸包性:
B样条曲线落在Pi构成的凸包之中。其凸包区域小于或等于同一组控制顶点定义的Bezier曲线凸包区域
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JifqAoT7-1636171565307)(B样条.assets/image-20211102210715876.png)]](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a4cb5bbcbd484e01a50c618e2ecc6b54~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp)
凸包就是包含上边这6个顶点的最小凸多边形。凸多边形是把多边形的每条边延长,其它边都在它的同一侧
该性质导致顺序k+1个顶点重合时,由这些顶点定义的k次B样条曲线段退化到这一个重合点;顺序k+1个顶点共线时,由这些顶点定义的k次B样条曲线为一直线段
B样条曲线类型的划分
1. 均匀B样条曲线
当节点沿参数轴均匀等距分布,即ui+1−ui=常数>0时,表示均匀B样条函数
如:{0,1,2,3,4,5,6}
均匀B样条的基函数呈周期性。即给定n和k,所有的基函数有相同形状。每个后续基函数仅仅是前面基函数在新位置上的重复:
Bi,k(u)=Bi+1,k(u+Δu)=Bi+2,k(u+2Δu)
其中,Δu为相邻节点值的间距
均匀B样条曲线没有保留Bezier曲线端点的几何性质,即不过控制点中的起点和终点,采用准均匀的B样条曲线则能够通过。
2. 准均匀B样条曲线
与均匀B样条曲线的差别在于两端节点具有重复度k,这样的节点矢量定义了准均匀的B样条函数
均匀:u={0,1,2,3,4,5,6}
准均匀:{0,0,0,1,2,3,4,5,5,5}
3. 分段Beizer曲线
节点矢量中两端节点具有重复度k,所有内节点重复度为k-1,这样的节点矢量定义了分段的Bernstein基
B样条曲线用分段Bezier曲线表示后,各曲线段就具有了相对的独立性
4. 非均匀B样条曲线
当节点沿参数轴的分布不等距,即ui+1−ui=常数时,表示非均匀B样条函数
B样条曲面
B样条曲面方程为:
p(u,v)=i=0∑mj=0∑ndijNi,k(u)Nj,l(v)
其中uk≤u≤um+1,vi≤v≤vn+1,B样条基函数Ni,k(u)(i=0,1,...,m)与Nj,l(v)(j=0,1,...,n)分别由节点矢量U和V按deBoor−cox递推公式计算,di,j构成一张控制网格,称为B样条曲面的特征网格
最终实现的结果为:
其中节点向量通过哈特利-贾德方法获得。
困惑点:使用Hartley-Judd(哈特利-贾德)方法获得节点向量没有看明白