首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插值已知缺失时间间隔之间的三维坐标

插值已知缺失时间间隔之间的三维坐标
EN

Stack Overflow用户
提问于 2017-07-06 18:12:50
回答 1查看 2.4K关注 0票数 1

数据是太空中的一条路径。我有三维定位数据(x,y,z)和定位点被记录的时间。

X,y,z坐标是在三维空间中移动的物体的点位置。时间值是记录每个点的时间(从0开始)。

代码语言:javascript
复制
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),数据流将在不同的时间间隔内继续进行:

代码语言:javascript
复制
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将大大简化方程):

代码语言:javascript
复制
p(-2) = p0
p(-1) = p1
p( 0) = p2
p( 1) = p3

现在假设我们想要插值区间t=<0,1>上的所有点,所以p2p3之间的所有点。我们想要连续的分段曲线,所以在连接点上的第一个导子应该匹配。我们在左边还有一个控制点,所以第二个派生也可以在那里匹配:

代码语言:javascript
复制
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)在哪里?

代码语言:javascript
复制
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) = p2p(1) = p3有任何关系吗?它们能是你选择的吗?

它可以重新写成p'(0) = 0.5*((p(3)-p(0)) + (p(0)-p(-1)),对吗?我不清楚为什么要这样做。也不知道为什么能做到

2b)类似的问题

代码语言:javascript
复制
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的模糊性,因为我不知道这两种方程是从何而来的。

下面是非常直截了当的,然后就是方程组

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-07 05:47:34

由于您的数据很可能只是一些光滑的曲线取样点,所以我将使用三次插值多项式,如下所示:

曲线特性使得它通过所有控制点(t={-1,0,+1,+2}),内部控制点处的方向(第一次推导)是展位边的平均连接(类似于Bezier立方体)。

阿尔戈是这样的:

  1. 在缺失点前取2分,后取2个点 让我们称它们为p0,p1,p2,p3,它们应该是理想的时间等距的.并按时间排序。
  2. 计算每个轴的4个系数 d1=0.5*(p2.x-p0.x);d2=0.5*(p3.x-p1.x);ax0=p1.x;ax1=d1;ax2=(3.0*(p2.x-p1.x))-(2.0*d1)-d2;ax3=d1+d2+(2.0*(-p2.x+p1.x));d1=0.5*(p2.y-p0.y);d2=0.5*(p3.y-p1.y);ay0=p1.y;ay1=d1;Ay2=(p2.y-p1.y)-(2.0*D1)-d2;ay3=d1+d2+(2.0*(-p2.y+p1.y));d1=0.5*(p2.z-p0.z);d2=0.5*(p3.z-p1.z);az0=p1.z;az1=d1;az2=(3.0*(p2.z-p1.z))-(2.0*d1)-d2;az3=d1+d2+(2.0*(-p2.z+p1.z));
  3. t=<0,1> 将参数设置为与缺失时间对应的值 因此,如果选择点p0,p1,p2,p3和时间t0,t1,t2,t3,那么缺少的时间tm对应于参数: T= (tm-t1)/(t2-t1);
  4. 计算缺失点. x=ax0+ax1*t+ax2*t*t+ax3*t*t*t y=ay0+ay1*t+ay2*t*t+ay3*t*t*t z=az0+az1*t+az2*t*t+az3*t*t*t

你可以使用高阶多项式,如果这是不够的,通过推导类似的方程或拟合。还请看一下以下内容:

Edit1构造自己的多项式

您的评论的答案是在edit2 of 三次样条和catmull样条对图像的影响中,该链接在前面的链接中也有链接。要以类似的方式进行4次插值多项式,您将有5点(p0,p1,p2,p3,p4)和方程:

代码语言:javascript
复制
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将大大简化方程):

代码语言:javascript
复制
p(-2) = p0
p(-1) = p1
p( 0) = p2
p( 1) = p3
p( 2) = p4

现在假设我们想要插值区间t=<0,1>上的所有点,所以p2p3之间的所有点。我们想要连续的分段曲线,所以在连接点上的第一个导子应该匹配。我们在左边还有一个控制点,所以第二个派生也可以在那里匹配:

代码语言:javascript
复制
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=+1t=-1,这样你就可以得到线性方程组了。例如:

代码语言:javascript
复制
p( 0) = p2 = a0 + a1*0 + a2*0*0 + a3*0*0*0 + a4*0*0*0*0
        p2 = a0

如您所见,a0的计算非常简单,同样也可以用于派生:

代码语言:javascript
复制
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=+1t=-1并计算a3,a4。您可以设置连接点派生以满足您的特定需求(不仅是从左和右派生的平均值),而且形成像您这样的连续曲线是最好的(根据我的经验)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44956168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档