Выяснить ускорение для достижения целевой позиции с 0 скоростью? - PullRequest
4 голосов
/ 13 февраля 2010

Я пытаюсь остановить симуляцию на определенной точке. У меня есть моя начальная позиция, конечная позиция, моя текущая скорость и время, которое я хотел бы потратить, чтобы добраться туда. Так как:

d = vt + (at^2)/2

Я думал, что

d = (end - start)
a = 2(d - vt) / t^2

но моя конечная точка далеко, когда я запускаю его. Я попытался использовать два простых обновления, во-первых:

v += a * dt
d += v * dt

и второй:

d += v * dt + a * dt * dt / 2;
v += a * dt;

если это имеет значение. Позиция в этом случае равна 1d, поэтому нет необходимости в сумасшедших векторных вещах. Любая помощь будет принята с благодарностью :) Спасибо!

(Правка: форматирование) (Edit2: исправлено обновление № 2) (Edit3: обновления теперь показывают dt вместо t)

Ответы [ 3 ]

2 голосов
/ 13 февраля 2010

Мы начинаем с x_start (и t = 0) со скоростью v_start, и мы хотим закончить с x_end со скоростью ноль.

Поскольку у нас постоянное ускорение, средняя скорость будет v_start/2, что означает, что мы достигнем x_end при t_end = (x_end - x_start) / (v_start / 2).

Хорошо, тогда мы можем использовать x(t) = x_start + v_start * t + at^2/2. В качестве проверки работоспособности подключите t = 0 и убедитесь, что вы получите x = x_start.

Затем подключите t_end, и вы можете решить для. Я получаю -v^2/(2D), где D x_end - x_start. Отрицательный знак означает, что вы замедляетесь вместо ускорения.

Если вы подключите это к исходной функции, вы получите:

x(t) = x_start + v_start * t - (v^2/4D) * t^2

Если у вас есть счетчик, который сообщает вам значение t (которое будет варьироваться от 0 до t_end), вы можете просто перемещать объект в правильную позицию в каждый момент.

Или (и это может иметь больше смысла, в зависимости от языка, окружения и т. Д.), Вы можете рассчитать мгновенную скорость на каждый временной шаг, а затем мгновенную позицию, следуя ответу CoderTao.

0 голосов
/ 13 февраля 2010

Почему вы меняете физическую формулу? Просто измените ускорение, чтобы объект остановился там, где вы хотите.

Требуемое ускорение - это то, что вы дали:

a = 2(d - vt) / t^2

Просто присвойте a в своем коде, когда вы хотите начать его останавливать.

0 голосов
/ 13 февраля 2010

Одна возможная проблема; из того, что вы уже написали, непонятно, что уравнения:

v+=a*t
d+=v*t
...
d+=v*t + a*t*t/2
v+=a*t

Должно быть:

v+=a*dt
d+=v*dt
...
d+=v*dt + a*dt*dt/2
v+=a*dt

Где dt - разница во времени с момента последнего обновления. Было бы полезно иметь немного больше информации - окружающий код, пример ввода / вывода и т. Д.

...