三维空间中的曲线拟合点

tra*_*kit 8 .net c# algorithm 3d physics

试图找到有助于我们通过一系列点画3D线的功能.

对于我们知道的每个点:日期和时间,纬度,经度,海拔高度,速度和标题.数据可能每10秒记录一次,我们希望能够猜测两者之间的点数并将粒度增加到1秒.从而在3D空间中创建虚拟飞行路径.

我已经发现了许多曲线拟合算法,这些算法将通过一系列点逼近一条直线,但它们不能保证这些点相交.它们也没有考虑速度和航向来确定物体到达下一个点所采用的最可能路径.

Dr.*_*ius 19

从物理学的角度来看:

您必须假设中间点的加速度才能获得插值.

如果您的物理系统相对较好(如汽车或飞机),而不是例如弹跳球,您可以继续假设加速度随点之间的时间线性变化.

恒定变化加速运动的矢量方程是:

 x''[t] = a t + b
Run Code Online (Sandbox Code Playgroud)

除了t之外的所有大小都是向量.

对于你已经知道的每个段v(t = t0)x(t = t0)tfinal和x(tfinal)v(tfinal)

通过求解微分方程,您得到:

Eq 1:
x[t_] := (3 b t^2 Tf + a t^3 Tf - 3 b t Tf^2 - a t Tf^3 - 6 t X0 + 6 Tf X0 + 6 t Xf)/(6 Tf)  
Run Code Online (Sandbox Code Playgroud)

并强加了您获得的位置和速度的初始和最终约束:

方程2:

 a -> (6 (Tf^2 V0 - 2 T0 Tf Vf + Tf^2 Vf - 2 T0 X0 + 2 Tf X0 + 
        2 T0 Xf - 2 Tf Xf))/(Tf^2 (3 T0^2 - 4 T0 Tf + Tf^2))

 b -> (2 (-2 Tf^3 V0 + 3 T0^2 Tf Vf - Tf^3 Vf + 3 T0^2 X0 - 
        3 Tf^2 X0 - 3 T0^2 Xf + 3 Tf^2 Xf))/(Tf^2 (3 T0^2 - 4 T0 Tf + Tf^2))}}
Run Code Online (Sandbox Code Playgroud)

因此,将方程2的值插入到方程1中,您可以根据初始和最终位置和速度获得点的时间插值.

HTH!

编辑

一些在两个维度上具有突然速度变化的示例(在3D中完全相同).如果初始和最终速度相似,您将获得"更直"的路径.

假设:

X0 = {0, 0}; Xf = {1, 1};
T0 = 0;      Tf = 1;  
Run Code Online (Sandbox Code Playgroud)

如果

V0 = {0, 1}; Vf = {-1, 3};
Run Code Online (Sandbox Code Playgroud)

替代文字

V0 = {0, 1}; Vf = {-1, 5};
Run Code Online (Sandbox Code Playgroud)

替代文字

V0 = {0, 1}; Vf = {1, 3};
Run Code Online (Sandbox Code Playgroud)

替代文字

这是一个动画,您可以看到速度从V0 = {0,1}变为Vf = {1,5}: 替代文字

在这里,您可以看到3D中的加速体,其间位置相等:

替代文字

编辑

一个完整的问题:

为方便起见,我将使用笛卡尔坐标.如果你想从lat/log/alt转换为Cartesian,你可以:

x = rho sin(theta) cos(phi)
y = rho sin(theta) sin(phi)
z = rho cos(theta)
Run Code Online (Sandbox Code Playgroud)

phi是经度,theta是纬度,rho是你的高度加上地球的半径.

所以假设我们开始我们的细分市场:

 t=0 with coordinates (0,0,0) and velocity (1,0,0)
Run Code Online (Sandbox Code Playgroud)

结束于

 t=10 with coordinates (10,10,10) and velocity (0,0,1)  
Run Code Online (Sandbox Code Playgroud)

我清楚地对坐标原点进行了更改,以便在起点处设置原点.这只是为了得到漂亮的圆形数字......

所以我们在a和b的公式中替换这些数字并得到:

a = {-(3/50), -(3/25), -(3/50)}  b = {1/5, 3/5, 2/5}  
Run Code Online (Sandbox Code Playgroud)

用那些我们去eq 1,对象的位置由下式给出:

p[t] = {1/60 (60 t + 6 t^2 - (3 t^3)/5), 
        1/60 (18 t^2 - (6 t^3)/5), 
        1/60 (12 t^2 - (3 t^3)/5)}
Run Code Online (Sandbox Code Playgroud)

就是这样.你得到1到10秒的位置,用上面的等式中的valus代替t.
动画运行:

替代文字

编辑2

如果你不想弄乱垂直加速度(也许是因为你的"速度计"没有读取它),你可以只为z轴分配一个恒定的速度(考虑到它平行于z轴有一个非常小的错误) Rho轴),等于(Zfinal - Zinit)/(Tf-T0),然后解决飞机遗忘海拔的问题.