一、Spline理解
从简单的Bezier样条曲线开始:
一阶Bezier曲线:线性插值
给定两个点 和
,有:
where, 。
可以想象这是 从点 走向
的过程,就是一条直线上的点。
二阶Bezier曲线:插值的插值
给定三个点 ,
,
,进行两步操作:
1、对两对相邻点做线性插值,有:
2、对插值出来的两个点再做插值,有
可以理解成:在第一步中,我们获得了两条“线上的点”随着时间t变化的轨迹,第二步是让这两个点之间再随着时间变化做插值。
数学公式就是:
三阶Bezier曲线:
一阶贝塞尔曲线是:两点之间的滑动点
二阶贝塞尔曲线是:两个滑动点之间的滑动点
三阶贝塞尔曲线是:两个“两个滑动点之间的滑动点”之间的滑动点
二、Catmull-Rom Spline
是一种分段插值样条(通过其控制点的曲线),由四个控制点控制: ,
,
,
,曲线仅从
到
。
令 表示一个点。对于曲线段
由点
和节点序列
,向心 Catmull–Rom 样条可以通过以下方式生成:
,
,
从节点序列的角度解释一下:曲线C的插值过程可以看作参数 从
到
插值出路径点,构造
因为我们希望参数 t 能反应控制点之间的距离变化,从而在插值时保持曲线的匀速或自然感,所以通过参数,来控制插值参数t。
当 = 0 时,参数间隔均匀,如果两点之间距离很短,那么插值时它会以同样的“时间”穿过,导致曲线抖动,而如果
=0.5之类的与距离相关的参数,就能缓解这种问题。
Barry和Goldman的金字塔公式
总结一下流程
1. 选择 4 个点 ;
2. 构造 knot 序列 ,常用 centripetal:
;
3. 对于任意 ,递推计算一次插值
,再计算二次插值
,最后得到三次插值
;
4. 重复对每段进行插值,可以绘制整条样条曲线。
三、CR 样条和 Bézier 曲线和 B 样条的区别
Catmull-Rom Spline(CR样条) | Bézier 曲线 | B样条 | |
类型 | 一种 插值样条曲线,一定通过控制点 | 一种 逼近型样条曲线,不一定经过控制点(除了首尾点),而是由控制点“牵引”形状。 | 逼近型样条曲线,分段连续多项式构造 |
基函数 | 分段三次样条,每段用 4 个点 | Bernstein 多项式 | De Boor-Cox 公式递归生成 |
曲线构建方式 | 每两点之间生成一段曲线 | 整个曲线由一组控制点决定 | 分段连续多项式,而且在全曲线上有限阶可导/连续 |
性质 | 改一点只影响相邻2段 | 全局性:无法对曲线形状进行局部控制,改变任一控制点位置时,整个曲线均受到影响。 端点性:曲线只经过两个端点的控制点(起点和终点),其它所有点只是逼近,一般不经过。 | 局部性:k阶曲线上的一点至多与k个控制点有关,与其它控制点无关。 不一定经过控制点 整条曲线有一个完整的表达形式,在有限阶内都十分平滑,但内在的量却是分段的 |