После прочтения комментариев я хотел бы изменить свой ответ: умножьте скорость на k <1, например, k = 0,955, чтобы она экспоненциально затухала. </p>
Объяснение (с графиками:и настраиваемое уравнение!) следует за ...
Я интерпретирую график в вашем исходном вопросе как показывающий, что скорость остается около начального значения, а затем быстро уменьшается.Но если вы представите, что книга скользит по столу, она быстро уходит от вас, затем замедляется, а затем останавливается.Я согласен с @Chris Farmer
, что подходящая модель - это сила сопротивления, пропорциональная скорости.Я собираюсь взять эту модель и получить ответ, который я предложил выше.Я заранее прошу прощения за длину этого.Я уверен, что кто-то лучше в математике может значительно упростить это. Кроме того, я вставляю ссылки на графики напрямую, в ссылках есть некоторые символы, которые парсеру SO не нравятся. Исправлены URL-адреса.
IЯ собираюсь использовать следующие определения:
x -> time
a(x) -> acceleration as a function of time
v(x) -> velocity as a function of time
y(x) -> position as a function of time
u -> constant coefficient of drag
colon : denotes proportionality
Мы знаем, что сила из-за сопротивления пропорциональна скорости.Мы также знаем, что сила пропорциональна ускорению.
a(x) : -u v(x) (Eqn. 1)
Знак минус гарантирует, что ускорение противоположно текущему направлению движения.
Мы знаем, что скорость - это интегрированное ускорение.
v(x) : integral( -u v(x) dx ) (Eqn. 2)
Это означает, что скорость пропорциональна ее собственному интегралу.Мы знаем, что e^x
удовлетворяет этому условию.Таким образом, мы предполагаем, что
v(x) : e^(-u x) (Eqn. 3)
Коэффициент сопротивления в экспоненте таков, что когда мы решаем интеграл в уравнении.2 u
отменяется, чтобы вернуться к уравнению.3.
Теперь нам нужно вычислить значение u
.Как указывалось @BlueRaja
, e^x
никогда не равно нулю независимо от x.Но он приближается к нулю для достаточно отрицательного х.Давайте рассмотрим 1% нашей первоначальной скорости как «остановленный» (ваше представление о пороге) , и, скажем, мы хотим остановиться в течение x = 2 секунд (вы можете настроить это позже).Затем нам нужно решить
e^(-2u) = 0.01 (Eqn. 4)
, что приводит нас к вычислению
u = -ln(0.01)/2 ~= 2.3 (Eqn. 5)
Давайте построим график v(x)
.
Похоже, это экспоненциальнозатухает до небольшого значения за 2 секунды.Пока все хорошо.
Нам не обязательно вычислять экспоненты в нашем графическом интерфейсе.Мы знаем, что можем легко конвертировать экспоненциальные базы,
e^(-u x) = (e^-u)^x (Eqn. 6)
Мы также не хотим отслеживать время в секундах.Мы знаем, что у нас частота обновления 20 мс, поэтому давайте определим временной интервал n
с частотой тиков 50 тиков / с.
n = 50 x (Eqn. 7)
Подставляя значение u из уравнения.5 в уравнение6, в сочетании с уравнением.7, и подставляя в уравнение.3, мы получим
v(n) : k^n, k = e^(ln(0.01)/2/50) ~= 0.955 (Eqn. 8)
Давайте построим это с нашей новой осью X в временных метках.
Опять же, наша функция скорости пропорциональна чему-то, что уменьшается до 1% в желаемом количестве итераций и следует модели «выбегания под воздействием трения».Теперь мы можем умножить нашу начальную скорость v0
на уравнение.8 для получения фактической скорости в любой момент времени n:
v(n) = v0 k^n (Eqn. 9)
Обратите внимание, что при реализации нет необходимости отслеживать v0!Мы можем преобразовать закрытую форму v0 * k^n
в рекурсию, чтобы получить окончательный ответ
v(n+1) = v(n)*k (Eqn. 10)
Этот ответ удовлетворяет вашему ограничению, не заботясь о том, что является начальной скоростью - следующая скорость можетвсегда рассчитывается с использованием только текущей скорости.
Стоит проверить, чтобы убедиться, что поведение позиции имеет смысл.Положение, следующее за такой скоростной моделью, равно
y(n) = y0 + sum(0..n)(v(n)) (Eqn. 11)
. Сумма в уравнении.11 легко решается с помощью формы (9 ).Используя индексную переменную p:
sum(p = 0..n-1)(v0 k^p) = v0 (1-k^n)/(1-k) (Eqn. 12)
Итак, у нас есть
y(n) = y0 + v0 (1-k^n)/(1-k) (Eqn. 13)
Давайте построим это с y0 = 0
и v0 = 1
.
Итак, мы видим быстрое движение от начала координат, следуя по грациозному берегу до остановки.Я считаю, что этот график является более точным изображением скольжения, чем ваш исходный график.
В общем, вы можете настроить k
с помощью уравнения
k = e^(ln(Threshold)/Time/Tickrate) (Eqn. 14)
where:
Threshold is the fraction of starting velocity at which static friction kicks in
Time is the time in seconds at which the speed should drop to Threshold
Tickrate is your discrete sampling interval
(СПАСИБО @poke
за демонстрацию использования Wolfram Alpha для сюжетов - это очень мило.)
СТАРЫЙ ОТВЕТ
Умножьте скорость на k <1, например, k = 0,98, чтобы она экспоненциально затухала. </p>