数据是太空中的一条路径。我有三维定位数据(x,y,z)和定位点被记录的时间。
X,y,z坐标是在三维空间中移动的物体的点位置。时间值是记录每个点的时间(从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我最终会错过一些录音活动。(这已知并被接受为true),数据流将在不同的时间间隔内继续进行:
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) 更新1三次插值不适用于这里,因为我没有在三维空间中使用网格。我在研究一个轨迹。我已经在Apache math3公域中找到了一个math3,但是我不确定这是否是我所需要的。如果你看一下它需要的参数,它需要一个double[] fval矩阵,我不确定。
3)如果不是最适合Java的话,什么是最好的工具来插值这些数据?
更新2-关于谱的解决方案的问题
在您的编辑中,您将提供以下关于“匹配连接点的第一个派生”的技巧:
让我们定义我们的t=<-2,+2>并像这样对控制点进行采样(这真的不重要,它将如何影响系数大小,包括-1,0,1将大大简化方程):
p(-2) = p0
p(-1) = p1
p( 0) = p2
p( 1) = p3现在假设我们想要插值区间t=<0,1>上的所有点,所以p2和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),形成方程组,从p0,p1,p2,p3,p4代数地计算a0,a1,a2,a3,a4。
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和p(1) = p3有任何关系吗?它们能是你选择的吗?
它可以重新写成p'(0) = 0.5*((p(3)-p(0)) + (p(0)-p(-1)),对吗?我不清楚为什么要这样做。也不知道为什么能做到
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的模糊性,因为我不知道这两种方程是从何而来的。
下面是非常直截了当的,然后就是方程组
发布于 2017-07-07 05:47:34
由于您的数据很可能只是一些光滑的曲线取样点,所以我将使用三次插值多项式,如下所示:
曲线特性使得它通过所有控制点(t={-1,0,+1,+2}),内部控制点处的方向(第一次推导)是展位边的平均连接(类似于Bezier立方体)。
阿尔戈是这样的:
p0,p1,p2,p3,它们应该是理想的时间等距的.并按时间排序。t=<0,1> 将参数设置为与缺失时间对应的值
因此,如果选择点p0,p1,p2,p3和时间t0,t1,t2,t3,那么缺少的时间tm对应于参数:
T= (tm-t1)/(t2-t1);你可以使用高阶多项式,如果这是不够的,通过推导类似的方程或拟合。还请看一下以下内容:
Edit1构造自己的多项式
您的评论的答案是在edit2 of 三次样条和catmull样条对图像的影响中,该链接在前面的链接中也有链接。要以类似的方式进行4次插值多项式,您将有5点(p0,p1,p2,p3,p4)和方程:
p(t)= a0 + a1*t + a2*t*t + a3*t*t*t + a4*t*t*t*t
p'(t) = a1 + 2*a2*t + 3*a3*t*t + 4*a4*t*t*t
p''(t) = 2*a2 + 6*a3*t +12*a4*t*t让我们定义我们的t=<-2,+2>并像这样对控制点进行采样(这真的不重要,它将如何影响系数大小,包括-1,0,1将大大简化方程):
p(-2) = p0
p(-1) = p1
p( 0) = p2
p( 1) = p3
p( 2) = p4现在假设我们想要插值区间t=<0,1>上的所有点,所以p2和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),形成方程组,从p0,p1,p2,p3,p4代数地计算a0,a1,a2,a3,a4。提示使用t=0,t=+1和t=-1,这样你就可以得到线性方程组了。例如:
p( 0) = p2 = a0 + a1*0 + a2*0*0 + a3*0*0*0 + a4*0*0*0*0
p2 = a0如您所见,a0的计算非常简单,同样也可以用于派生:
p'(0) = 0.5*(p3-p1) = a1 + 2*a2*0 + 3*a3*0*0 + 4*a4*0*0*0
p''(0)= 0.5*(p0+p4)-p1+p2-p3 = 2*a2 + 6*a3*0 +12*a4*0*0
-------------------------------------------------------------------
0.5*(p3-p1) = a1
0.5*(p0+p4)-p1+p2-p3 = 2*a2
-------------------------------------------------------------------
0.5*(p3-p1) = a1
0.25*(p0+p4)-0.5*(p1+p2-p3) = a2
-------------------------------------------------------------------现在使用t=+1和t=-1并计算a3,a4。您可以设置连接点派生以满足您的特定需求(不仅是从左和右派生的平均值),而且形成像您这样的连续曲线是最好的(根据我的经验)。
https://stackoverflow.com/questions/44956168
复制相似问题