插值

来源:互联网 发布:串口通信数据协议rs232 编辑:程序博客网 时间:2024/04/29 21:42

我看了不少插值的方法,有的方法讲得莫名其妙,一个程序,一些系数,为什么这个系数是1,而不是0.5从来不讲,让人很怀疑其可用性。

后来做刀光的时候,采集的刀光的点不够圆滑,需要用到插值——想想自己的高数还没有完全忘光,干脆自己推导一个得了。

首先我们要明白什么叫做光滑的曲线,可以这么认为,这个曲线是一个运动物体,在时间[0,1]内运动的轨迹。而要求的光滑的曲线,就是要求物体运动过程中没有速度的突变。且要求不同的曲线段之间,速度也不能有突变。据此,我们可以大约知道插值一段曲线,需要指导曲线其实点的位置和速度,结束点的位置和速度。由于有四个已知变量,显然,用一个四次方程来描述这个曲线是再合适不过了。

方程如下:

f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d               [0 <= t <= 1]

对f(t)求导,得到速度方程:

f'(t) = 3 * a * t ^ 2 + 2 * b * t + c              [0 <= t <= 1]

所以
f(0) = d = x0(起始点位置)
f(1) = a + b + c + d = x1(结束点位置)
f'(0) = c = y0(起始点速度)
f'(1) = 3 * a + 2 * b + c = y1(结束点速度)

联合上面四个式子可解得

a = 2 * x0 - 2 * x1 + y0 + y1
b = 3 * x1 - 3 * x0 - y1 - 2 * y0
c = y0
d = x0

再利用

f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d               [0 <= t <= 1]

就可以插值这断曲线了

当然,事情还没有完,通常情况下,我们得到的数据只有各个采样点的位置,没有速度。这个时候,速度怎么办?我的解决办法是,在有3个采样点的时候(p0,p1,p2),计算出p1采样点的速度,另外,再假设采样时间间隔是均匀的,因此:

v1 = (p2 - p0) * 0.5

在有N个采样的时候,特殊处理起始点和结束点的速度

v0 = p1 - p0;

vn = pn - p(n-1)

这样得到的曲线完全满足平滑的要求,缺点是,曲线开始插值的时候要延迟一个采样点的时间,有的时候,v0 速度很快,因此,会出现一条有缝隙刀光。针对当前项目,我在第一次采样的时候,将时间稍微往后加了0.001秒,按照当前的运动趋势多采样了一次,从而消除了这个缝隙。因为预测的运动时间很短,即使预测错误,也不影响刀光的外观。

原创粉丝点击