Вы можете просто создать дифференциальную схему, то есть скорость модели и координату исходной точки в дискретные моменты времени.Допустим, вы исправили, например, dt = 0.1 sec
, начальная скорость обозначена синим вектором как v0
.Мы начинаем с x0
.Скажем y[j]
- это точки черного пути.
Пусть x1 = x0 + v1 * dt
, где v1 = v0 + (y[k(x0)+1] - x0) * f(abs(y[k(x0)+1] - x_0))
.Где
k(x0)
- это индекс ближайшей к x0
точке среди y[j]
,
f(x)
- это функция, характеризующая «силу», которая тянет вашу траекторию к указанной траектории.Он определен только для неотрицательных значений x
es.
Эта модель переносит вашу траекторию к следующей точке определенного пути к ближайшей к текущей моделируемой позиции на траектории.
Хороший примерf(x)
может быть моделью, моделирующей гравитационную силу: f(x) = K/(x * x)
, где K
должен быть экспериментально скорректирован, чтобы дать естественные желаемые результаты.
Затем x2 = x1 + v2 * dt
, где v2 = v1 + (y[k(x1) + 1] - x1) * f(abs(y[k(x1) + 1] - x_1))
и так далее:
x[n+1] = x[n] + v[n+1] * dt
, где v[n+1] = v[n] + (y[k(x[n]) + 1] - x[n]) * f(abs(y[k(x[n])+1] - x[n]))
...
Здесь вам нужно настроить dt
и K
.dt
должно быть достаточно маленьким, чтобы траектория была гладкой.Большая K
делает траекторию более близкой к определенной, более мелкая K
делает ее более расслабленной.
Редактировать Теперь, когда я немного подумал, я понимаю, что выбор силыФункция f
была плохой, так как гравитационная сила позволяет космическим скоростям, т.е. способности вашей траектории бесконечно отклоняться от желаемой, если начальная скорость слишком велика.Таким образом, вы должны создать другую функцию, возможно, просто что-то вроде f(x) = K x
или f(x) = K x ^ alpha
, где alpha > 0
.Видите ли, эта схема довольно общая, поэтому вы должны поэкспериментировать.