С точки зрения физики:
Вы должны предположить что-то относительно ускорения в ваших промежуточных точках, чтобы получить интерполяцию.
Если ваша физическая система относительно хорошо себя ведет (как машина или самолет), в отличие, например, от прыгающего мяча, вы можете пойти дальше, предполагая, что ускорение изменяется линейно со временем между точками.
Векторное уравнение для постоянно меняющегося ускоренного движения:
x''[t] = a t + b
где все величины, кроме 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)
И установив начальные и конечные ограничения для положения и скорости, вы получите:
Уравнения 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))}}
Таким образом, вставляя значения для уравнений 2 в уравнение 1, вы получаете временную интерполяцию для ваших точек на основе начальной и конечной позиции и скоростей.
НТН!
Редактировать
Несколько примеров с резким изменением скорости в двух измерениях (в 3D точно то же самое). Если начальная и конечная скорости одинаковы, вы получите «более прямые» пути.
Предположим:
X0 = {0, 0}; Xf = {1, 1};
T0 = 0; Tf = 1;
Если
V0 = {0, 1}; Vf = {-1, 3};
V0 = {0, 1}; Vf = {-1, 5};
V0 = {0, 1}; Vf = {1, 3};
Вот анимация, где вы можете увидеть изменение скорости от V0 = {0, 1} до Vf = {1, 5}:
Здесь вы можете увидеть ускоряющееся тело в 3D с позициями, взятыми с равными интервалами:
Редактировать
Полная проблема:
Для удобства я буду работать в декартовых координатах. Если вы хотите конвертировать из lat / log / alt в декартову, просто выполните:
x = rho sin(theta) cos(phi)
y = rho sin(theta) sin(phi)
z = rho cos(theta)
Где phi - долгота, theta - широта, а rho - ваша высота плюс радиус Земли.
Итак, предположим, что мы начинаем наш сегмент с:
t=0 with coordinates (0,0,0) and velocity (1,0,0)
и заканчиваются на
t=10 with coordinates (10,10,10) and velocity (0,0,1)
Я четко внес изменение в начало координат, чтобы установить начало координат в моей начальной точке. Это просто для получения хороших круглых чисел ...
Таким образом, мы заменяем эти числа в формулах для a и b и получаем:
a = {-(3/50), -(3/25), -(3/50)} b = {1/5, 3/5, 2/5}
С этими значениями мы переходим к уравнению 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)}
И это все. Вы получаете позицию от 1 до 10 секунд, заменяя t на ее значение в приведенном выше уравнении.
Анимация запускается:
Редактировать 2
Если вы не хотите связываться с вертикальным ускорением (возможно, из-за того, что ваш «спидометр» его не читает), вы можете просто назначить постоянную скорость оси z (есть очень незначительная ошибка, если учесть ее параллельно оси Rho), равным (Zfinal - Zinit) / (Tf-T0), а затем решаем задачу в плоскости, забывая высоту.