数据是空间中的路径。我有 3D 位置数据 (x,y,z) 和记录位置点的时间。
x、y 和 z 坐标是物体在 3D 空间中移动的点位置。时间值是记录每个点的时间(从 0 开始)。
x y z time(s)
0.1 2.2 3.3 0
2.4 2.4 4.2 0.3
4.5 2.5 1.8 0.6
我最终会错过一些录音活动。 (这是已知的并被接受为正确的)并且数据流将以不同的时间间隔继续:
x y z time(s)
0.1 2.2 3.3 0
2.4 2.4 4.2 0.3
//missing x,y,z data point at time 0.6
//missing x,y,z data point at time 0.9
4.5 2.5 1.8 1.2
...
...
请注意,数据已简化。我的目标是在已知的缺失时间插入缺失的 3D 点。我研究了各种插值技术,但我不完全确定哪种插值方法适合我的问题。
1)有人能简洁地解释一下这是什么问题吗?我的数学非常生疏,我不知道如何正确描述它,这导致我研究可能不合适的插值技术。
2) Update 1由于我没有在 3D 空间中使用网格,因此三次三次插值不应适用于此。我正在研究轨迹。我找到了一个三三次插值实现 https://commons.apache.org/proper/commons-math/javadocs/api-3.4.1/org/apache/commons/math3/analysis/interpolation/TricubicInterpolator.html在 Apache math3 commons 中,但是我不确定这是否是我所需要的。如果你看一下它所采用的参数,它需要一个我不确定的 double[][][] fval 矩阵。
3) 如果不是最适合 Java,那么插值此数据的最佳工具是什么?
更新 2 - 有关 Spectre 解决方案的问题
在您的编辑中,您提供了有关“匹配关节点的一阶导数”的以下提示:
让我们定义我们的t=<-2,+2>
并像这样对控制点进行采样(实际上并不重要,它如何影响系数幅度并包括-1,0,1
将大大简化方程):
p(-2) = p0
p(-1) = p1
p( 0) = p2
p( 1) = p3
现在假设我们要对区间上的所有点进行插值t=<0,1>
所以之间的所有点p2
and p3
。我们想要连续的分段曲线,因此关节点的一阶导数应该匹配。我们在左侧多了一个控制点,因此二阶导数也可以在那里匹配:
p'(0) = 0.5*((p3-p2)+(p2-p1)) = 0.5*(p3-p1)
p'(1) = 0.5*((p4-p3)+(p3-p2)) = 0.5*(p4-p2)
p''(0)= 0.5*(((p2-p1)-(p1-p0))+((p4-p3)-(p3-p2)))
= 0.5*((p2-2*p1+p0)+(p4-2*p3+p2))
= 0.5*(p0+p4)-p1+p2-p3
希望我在第二次推导中没有犯任何愚蠢的错误。现在只需替换p(t)
已知控制点并形成方程组并计算a0,a1,a2,a3,a4
代数地从p0,p1,p2,p3,p4
.
1)你的意思是joint points
?
2)去哪里
p'(0) = 0.5*((p3-p2)+(p2-p1)) = 0.5*(p3-p1)
p'(1) = 0.5*((p4-p3)+(p3-p2)) = 0.5*(p4-p2)
来自?它们有什么关系吗p(0) = p2
and p(1) = p3
?它们可以是您选择的任何东西吗?
它可以重写为p'(0) = 0.5*((p(3)-p(0)) + (p(0)-p(-1))
正确的?我不清楚为什么要这样做。甚至为什么会这样can be done
2b)类似的问题
p''(0)= 0.5*(((p2-p1)-(p1-p0))+((p4-p3)-(p3-p2)))
= 0.5*((p2-2*p1+p0)+(p4-2*p3+p2))
= 0.5*(p0+p4)-p1+p2-p3
但我假设澄清问题 2) 将减轻我对 2b) 的歧义,因为我也不知道方程来自哪里。
接下来的内容非常简单,那就是方程组