计算机中绘制曲线,通过贝塞尔曲线已经满足了我们大部分需求,但是其存在某些缺点,比如移动某一个控制点会导致整个曲线发生变化,即无法局部控制曲线的走向。所以 B 样条曲线(B-Spline)为了解决贝塞尔曲线的缺陷应运而生。
不了解贝塞尔曲线的同学,可以去看我以前写的另外一篇文章《深入理解贝塞尔曲线》,后面的内容会假设你已经了解并掌握贝塞尔曲线的相关内容。
什么是 B 样条曲线?
解释 B 样条曲线之前,首先要解释一下什么是样条。样条是通过一组指定点集而生成平滑曲线的柔性带。 简单地说,B 样条曲线就是通过控制点局部控制形状的曲线。不太理解的同学可以通过本文底部的 demo 查看 B 样条曲线中,控制点对曲线绘制的影响。
B 样条曲线比贝塞尔曲线的设计要复杂许多,我们先通过他们的公式大致比较一下贝塞尔曲线与 B 样条曲线的区别:
贝塞尔曲线:
B 样条曲线:
先简单介绍一下上述公式的组成:
表示曲线上的点坐标向量。
为控制点
数量。
为控制点坐标(
从 0 开始)。
为控制点坐标影响权重的多项式系数(式中
代表坐标的索引,
代表多项式最高的幂数)。
影响 B 样条曲线的次数:
就是曲线的次数。
是绘制曲线时的取值。
仔细观察这两个公式,我们可以看到以下的相同点:
都是求和公式。
都有一个
的多项式系数(式中贝塞尔曲线 x=n,B 样条曲线 x=d)。
可以看出有以下几个不同点:
贝塞尔曲线的多项式幂数与控制点数量一致,而 B 样条曲线的多项式幂数更自由。
贝塞尔曲线
的取值为固定的
,而 B 样条曲线是在最大和最小节点值之间。
计算多项式
公式中其他值其实都比较清晰,问题的关键是需要搞清楚那个多项式
是什么!
计算这个多项式,我们使用到了Cox-deBoor 递归公式,公式内容如下(需要注意一点,如果遇到分母为 0的情况时,需要特殊处理为整体值为 0):
从这个公式可以看出,递归公式的差异主要体现在
和