参考
deboor 算法 原论文,没有图解
上文
参数化线性插值
参数 u1 > u0
![](https://img-blog.csdnimg.cn/direct/303508270ea8452d8d05cd700c03f547.png)
分段线性插值
![](https://img-blog.csdnimg.cn/direct/3fba0d975bb740bd9d08fc3f83109bf4.png)
![](https://img-blog.csdnimg.cn/direct/0d0fc8807b2d422db1e6adf90ec4a663.png)
分段参数 控制了两两不同点 Px 之间的插值效果
根据公式可以知道,两点间的插值点 由插值起点
和插值终点
以及分段参数[
,
]确定,参数 t 从
移动到
生成相应的插值点
。
连续性
曲线函数的导数描述了曲线的连续性
表示线段断开连接
表示线段在节点处连接
表示线段在节点处一阶导数连续
表示线段在节点处二阶导数连续
表示线段在节点处 n 阶导数连续
de Boor 算法
B 样条曲线定义
密歇根大学对 B 样条曲线定义为控制点和基函数的线性组合:
t 表示节点插值位置, 是样条曲线;
表示第 i 个控制点;k 表示基函数阶数,n 表示有 n 个 k 阶基函数,
表示第 i 个 k 阶基函数。
公式可以理解为 B 样条曲线由基函数对控制点的权重分配得来。
在 de Casteljau 算法中,插值权重 t 只跟当前插值点与附近控制点距离相关。
在 de Boor 算法中将插值权重交给基函数来控制。
基函数
定义
一维离散空间 ,t 称作节点(knot),T 称为节点向量(knot vector)。一般将
= 0,
= 1。当连续有 m 个节点相同,称该节点是重复度 m 的多重节点。节点之间的距离称为节点区间,插值权重就是由这些节点决定。
1 阶基函数
多阶基函数
基函数性质
-
。
-
在节点区间
和
,基函数
。
-
在节点区间 [t_0, t_m],
,k 阶基函数的和为 1。
-
递归性。
-
基函数在
在节点处有
连续,p 是节点重复度。
由于相邻节点是可以相等的,当公式 (3) 中出现分母为 0 的时候,此时将该项设置为 0!
3 阶基函数例子
下面举个 3 阶基函数例子观察下基函数
定义节点向量(蓝色圆点) ,它们落在 x 轴上(一维空间)。红色圆点 t 表示当前插值点位置。
![](https://img-blog.csdnimg.cn/direct/aa090df02fd64cdf8c15ac442f7bd0e8.png)
1 阶基函数
根据 1 阶基函数公式,当 t 落在节点区间 [t2, t3) 时候,有
![](https://img-blog.csdnimg.cn/direct/5e6de75edc494a35bdd438c543f5c411.png)
如图 fig.19 所示,第 2 个 1 阶基函数 是个阶梯函数,在 [t2, t3) 区间为 1,其他区间为 0。
把所有 1 阶基函数显示出来如图 fig.20。
![](https://img-blog.csdnimg.cn/direct/0176b9e5b4204a51bd400abc4959a07a.png)
2 阶基函数
![](https://img-blog.csdnimg.cn/direct/0fd9b49b121d45db949433df1f9342d3.png)
第 0 个 2 阶基函数 N_{0,2} 如图 fig.21 ,根据多阶基函数公式,由基函数 和
计算得来。其他所有的 2 阶基函数如图 fig.22 所示
![](https://img-blog.csdnimg.cn/direct/13aa7ae522924b75ad962d422a443a4e.png)
细心的同学会发现,根据多阶基函数性质 3,对于任意插值点位置 t,都有当前 k 阶基函数和为 1 成立。可是图 fig.22 中,在区间 [t0, t1) 和 [t7, t8) ,只有 的 [t0, t1) 和
的 [t7, t8) 部分数据有效,该性质 3 并不成立。
其实性质 3 成立是有前提的,需要 k 阶基函数的边界是重复度为 k 的多重节点。
我们把节点 t1 拉到 t0, t7 拉到 t8
图 fig.23 中对于所有 2 阶基函数就都满足性质 3 了。
![](https://img-blog.csdnimg.cn/direct/5a96ce6b45114aa19c0f610652713e69.png)
3 阶基函数
![](https://img-blog.csdnimg.cn/direct/c603807598a840a08eea70cb9dc47442.png)
第 0 个 3 阶基函数 如图 fig.24 ,根据多阶基函数公式,它由基函数
,
计算得到。
用金字塔表示法描述这种递归计算,如图 fig.25。
![](https://img-blog.csdnimg.cn/direct/2e205bb62ebb45bcab0fd7b717056954.png)
从下往上画金字塔,可以清楚地看到当前 受到节点区间
的影响。
相反,从上往下画倒金字塔,可以看到节点 可以影响到 k 阶基函数
到
。
其他所有的 3 阶基函数如图 fig.26 所示
![](https://img-blog.csdnimg.cn/direct/6d1d23922dea4123bc8c23fac8a7a8e4.png)
同样,为了满足性质 3,需要把边界设置为重复度是 3 的多重节点,把 t1 t2 拉到 t0 位置,把 t6 t7 拉到 t8 位置。结果如图 fig.27 所示。
![](https://img-blog.csdnimg.cn/direct/e85cbd0b5230412eaa8a535f6a6e7529.png)
节点与控制点
b 样条曲线由控制点分权得到,权重由基函数给出。针对上面 6 个 3 阶基函数的例子,提供 6 个控制点。插值节点 t 从节点向量空间从 t0 向 t8 移动。根据公式 (3),递归计算得到 3 阶基函数,根据公式 (1) 计算得到插值点 P。图 fig.28 显示 b 样条曲线的插值过程。
![](https://img-blog.csdnimg.cn/direct/d07ff25f4ea44f909754689b59e424d3.gif)
由于 deboor 算法把控制点权重与控制点分离,所以影响曲线的方法有两种,一种是移动控制点位置,一种是移动节点位置。
节点向量区间不移动(基函数不变),控制点移动的情况如图 fig.29 所示。
![](https://img-blog.csdnimg.cn/direct/7c6f52dd7fb24a8796c743fb6af03ff5.gif)
节点向量区间移动(基函数变),控制点不移动的情况如图 fig.30 所示。
![](https://img-blog.csdnimg.cn/direct/83b12bf19ddf463d876292f780c3b73a.gif)
将节点 t0,t1,...,t7,t8 代入公式,得到对应的插值点 T0,T1,...,T7,T8。其中 T0,T1,T2 重叠,T6,T7,T8 重叠。
![](https://img-blog.csdnimg.cn/direct/eaa7c0d49e9e4fee82b6b9bb9a3d4ef7.png)
B 样条曲线性质
-
几何不变形:对 b 样条曲线的单位性质进行分割,保证了 b 样条曲线在平移和旋转作用下形状的不变性
-
结束点几何特性:
-
增加节点的多重性,会降低节点对应的插值点位置的曲线连续性。节点重复度 p(p <= k),节点插值点的连续性为
。当节点插值点的连续性为
,意味着节点插值点与控制点重合。
在图 fig.32 中,3 阶 b 样条节点 t3 其插值点 T3 位置为
连续。
fig.32 曲线中 t3 节点位置曲线 C1 连续 在图 fig.33 中,将 t4 节点拉到 t3 位置重叠,t3 节点为重复度 p=2 的多重节点。3 阶 b 样条节点 t3 其插值点 T3 位置
连续。可以明显看出曲线在 T3 前后并不平滑。
fig.33 曲线中 t3 节点位置曲线 C0 连续 在图 fig.34 中,将 t5 t4 节点拉到 t3 位置重叠,t3 节点为重复度 p=3 的多重节点。3 阶 b 样条节点 t3 其插值点 T3 位置为
连续。也就是说曲线在 T3 位置断开。
fig.34 曲线中 t3 节点位置曲线 C-1 连续 -
b 样条曲线在结束点位置与控制点相切。曲线一阶导数公式如下:
-
- 凸包性质:k 阶曲线的片段形成在其连续 k 个控制点围成的凸包中。
-
局部作用特性:对于 k 阶曲线,一段局部曲线(a span of curve)仅由 k 个连续控制点控制。同时,一个控制点会影响 k 段曲线。具体地说控制点
能够影响节点区间
对应的插值点,曲线
也就是所说的“一段曲线”。
图 fig.35 显示了控制点 P3 影响曲线的局部线段 [T3,T6)。
fig.35 控制点 P3 的局部作用特性 -
变差减少性(Variation diminishing property):曲线与控制点形成的多边形的交点数量小于等于控制点数量。
-
贝塞尔是 b 样条的特例:
贝塞尔可以看做是节点向量如下的 b 样条曲线
B 样条插值
b 样条插值是在节点向量上选择合适的节点位置,计算对应的插值点。