我正在以每秒60次的速度从移动的车辆(游戏中的赛车)接收数据。我想(尽可能准确地)确定车辆穿过某个扇区的时间(沿着轨道的某个指定目标距离)。由于更新率有限,我将始终在扇区之前收到一个样本,并在扇区之后收到一个样本,因此我需要在这两个点之间进行插值以找到跨越扇区的时间(介于两者之间)。
我收到的每个更新的数据都包含:
t
p
(百分比0-1)v
我能够仅使用时间和距离进行简单的线性插值,但不够准确。例如,如果交叉前的样本有时间t0
和位置p0
,则交叉后的样本有t1
和p1
,且交叉位置为{{ 1}},那么线性插值的交叉时间p
应为:
t
这相对简单 - 假设
的速度恒定t = t0 + (p - p0) / (p1 - p0) * (t1 - t0)
并使用它来确定从v = (p1 - p0) / (t1 - t0)
到p0
所需的时间。
但是,我不想假设恒定速度,我 两个样本的速度>>它不相等。
如何考虑使插值更准确的速度?我假设我需要使用某种二次插值而不是线性,其中我假设速度在两个样本之间线性变化(因此时间以二次方式变化),但我没有看到我应该如何做到这一点。
答案 0 :(得分:0)
这一切都取决于你对你的系统有什么假设,你说你不想假设恒定速度,你能不能加速?至少在时间范围内,如果两者都没有,你可以认为它像样条曲线。
基本上你所拥有的是两点,它的衍生物,你可以从它得到的最多是一个三次插值而不做任何假设
来自Wikipedia Spline Interpolation公式。
F(t0) = p0
F(t1) = p1
dF(t0)/dt = v0
dF(t1)/dt = v1
F(t) = (1-k)*p0 + k*p1 + k*(1-k)*(a*(1-k) + b*k)
where
k = (t-t0) / (t1-t0)
a = v0*(t1-t0) - (p1-p0)
b = -v1*(t1-t0) + (p1-p0)
请注意,这会给你一个三次函数F(t)=p
,你必须解决它才能获得你想要的函数T(p)=t
,因为我们没有做任何事情,所以不能保证是积极的并且一直在增加,你可以获得非常高的加速度或负速度。