前两篇中讲解了贝塞尔曲线和B样条基础。

本文讲一下B样条的进阶

clamped B样条

由于我们常用的B样条是clamped B样条,我们就直接以其为例。

一个由n + 1 控制点和一个节点向量U = { u0, u1, ...., um } 定义的 p次B-样条曲线C(u),其中前p+1个和最后 p+1个节点是 "clamped" (即,u0 = u1 = ... = up um-p = um-p+1 = ... = um).

比如 3次clampedB样条,节点向量可以为[0 0 0 0 0.3 0.6 0.9 1 1 1 1].

在下图中,其中n = 10, m = 14 和p = 3, 头四个节点和最后四个节点是clamped而中间7个节点上均匀分布的。有8个节点区间,每个对应于一个曲线段。在下面左图,这些节点点以三角形标示。

节点区间[0 0 0 0 1/8 2/8 3/8 4/8 5/8 6/8 7/8 1 1 1 1].

方形为控制点,三角形为节点
为同样控制点的贝塞尔曲线,与上图对比

分别为7次5次3次B样条曲线

以上几组中, 体现了clamped B样条的关键两个特性,1 曲线的端点经过头尾的控制点 2 曲线的首位切线方向和分别与第一第二,倒数第一第二的控制点组成的直线方向相同。

那么为什么clamped B样条会会有这种特性呢?

如果你不能回答这个问题, 那么实际上就没有理解B样条的性质.

这 要回到B样条基函数计算的的本身

假设仅仅有7个节点

假设我们仅仅有7个节点, 如果 u0=u1=0, u2不为0, 那么区间[u0 u1)就是[0 0 ), 这个区间是不存在的, 所以基函数N0,0就是为0.

这个在上图中的意思, 当有6个控制点的时候, B样条是0阶曲线, 那么N0,0是0, 所以控制点P0根本就没有用上, 因为系数一直是0.

假设u0=u1=u2=0, u3不为0. 那么对于0阶b样条来说, N0,0 N1,0,都为0, 控制点P0 P1都没有用上. 对于1阶B样条, N0,1为0, 所以第一个控制点P0也是没有用上.对于2阶B样条, N0,2,不为0了, 因为是N2,0不为0. 所以N0,2 仅仅由N1,1决定, N1,1仅仅由N2,0决定.

再回头看B样条的基函数公式, u趋近于0的时候N0,2的系数是趋近于1的, 因此必然经过P0点.

因此也可以清楚,如果我认为B样条的局部是具有贝塞尔的性质,那么最大的区别就是基函数的作用范围,贝塞尔的所有基函数都是作用在整个区间,但是B样条有着明确的作用范围,这个性质导致了B样条没有必然通过控制点端点的性质。

B样条的导数:

先讲clamped B样条

既然B样条是贝塞尔曲线的扩展,那么必然要继承贝塞尔曲线一些优良的性质。贝塞尔曲线的导数还是贝塞尔, B样条的导数还是B样条。

接下来看推导公式:

B样条公式
基函数求导
基函数求导为低一阶的基函数求导
最终的基函数求导

因此,可知,B样条的导数还是B样条, 依然保留B样条的优良特性。

控制点减1,阶数减1,那么节点数目必然是减2. 对于clamped B样条,只要是去除第一个和最后一个节点就ok了,因此clamped B样条的求导还是clamped B样条,这个性质使其方便计算,应用广泛。

移动控制点

强凸包性质,如果u位于 [ui,ui+1),那么 C(u) 位于由控制点Pi, Pi-1, ..., Pi-p+1, Pi-p定义的凸包内。

可以理解为B样条为分区间的贝塞尔曲线,因此必然满足贝塞尔的凸包性质。

如果在 [ui,ui+1)区间,Pi, Pi-1, ..., Pi-p+1, Pi-p都在同一直线上,那么这一段B样条必然也在这个直线上。

ok,如果你已经掌握了这些知识,那么恭喜你,已经入门了。

专栏里每一篇都是我一个字一个字打的,都是我认为的原创干货。
欢迎指正讨论,转载请注明,认同请点赞。
这个系列的文章很容易出错,希望大佬们多多指正补充。
仅仅收藏是学不会的,还得点赞喜欢加转发啊。

本文的主要参考资料:

搜索结果提示 - 博客园找找看
CS3621 Introduction to Computing with Geometry Course Notes
B-样条曲线教程(B-spline Curves Notes)目录