Catmull-Rom插值算法

Catmull-Rom Spline

一、简要介绍

在这里插入图片描述
Catmull-Rom算法保证两点:

1、点Pi 的一阶导数等于Pi+1 - Pi-1,即点Pi 的切向量和其相邻两点连线的切向量是平行的;

2、穿过所有Pi 点。这是与贝塞尔曲线的最大区别,正因为这样的特性,使得Catmull-Rom算法适于用作轨迹线算法

Pi处的切线记作:τ (Pi+1 − Pi−1)。此算法的转换矩阵如下:

p(u)=

在这里插入图片描述

二、算法推导

首先,此算法工作需要四个点,P0(Pi-2)、P1(Pi-1)、P2(Pi)、P3(Pi+1)
在这里插入图片描述
τ用于影响扭曲程度。
在这里插入图片描述
作为一个立方插值函数,抽象原型如下,我们需要做的就是求出下式中的C0、C1、C2、C3

p(u) =

在这里插入图片描述
根据下图的抽象,我们可以得出四个等式:
在这里插入图片描述
在这里插入图片描述
将参数0、1代入即可得:
在这里插入图片描述
将C0、C1代入其它两式后,可得下式:
在这里插入图片描述
解得:
在这里插入图片描述
最终结果为:
在这里插入图片描述

注意:我们的控制点虽然有4个,但是绘制的曲线却只能够通过中间的两个点。这就带来 如果想曲线同时过这四个点,该怎么处理的问题。其实处理方法十分简单,我们只要人为的构造一个起点和终点来构成四个控制点即可。比如现在有P0,P1,P2,P3,如果用[P0,P1,P2,P3]构造曲线,曲线将只能够通过P1-P2,为了让曲线能够通过P0和P3,我们可以人为的构造出如下的控制点[2P0 - P1,P0,P1,P2],以及[P1, P2, P3, 2P3 - P2]。通过这样的方法,就能够绘制一条经过所有控制点的曲线了。

参考博客:https://blog.csdn.net/i_dovelemon/article/details/47984241 http://www.bubuko.com/infodetail-550349.html