как рассчитать отрицательное ускорение? - PullRequest
10 голосов
/ 19 февраля 2010

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

y (distance/velocity)
|********
|        ******
|              ****
|                  ***
|                     ***
|                        **
|                          **
|                            *
|                             *
-------------------------------- x (time)

е (х) ->

Предполагается, что пользовательский интерфейс позволяет пользователю перетаскивать и «бросать» представление в любом направлении и удерживать его в течение некоторого времени, даже после того, как он отпустит палец с экрана. Это своего рода импульс, который зависит от того, насколько быстро пользователь перетаскивал, прежде чем убрать палец.

Итак, у меня есть начальная скорость (v0), и каждые 20 мс я прокручиваю на величину, относящуюся к текущей скорости. С каждой итерацией прокрутки я немного понижаю скорость, пока она не падает ниже порогового значения, когда я ее останавливаю. Это просто не выглядит правильно, когда я уменьшаю его на фиксированную величину (линейную), поэтому мне нужно смоделировать отрицательное ускорение, но не могу найти приличную простую формулу, как рассчитать величину, на которую мне нужно снизить скорость в каждой итерации.

Обновление:

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

Предположим, что на определенной улице едет определенная машина, и водитель нажимает на тормоза до максимума, пока машина не останавливается. Водитель делает это с одним и тем же автомобилем на одной и той же улице несколько раз, но начинает тормозить с разными скоростями. Пока машина замедляется, я хочу иметь возможность рассчитать скорость, которую она будет иметь ровно через одну секунду, основываясь только на текущей скорости. Для этого расчета не должно иметь значения, на какой скорости ехал автомобиль, когда водитель начал тормозить, поскольку все факторы окружающей среды остаются неизменными. Конечно, в формуле будут некоторые константы, но когда автомобиль опускается до 30 м / с, он будет проходить то же расстояние в следующую секунду, независимо от того, проезжал ли он 100 или 50 м / с, когда водитель начал тормозить , Таким образом, время, прошедшее с момента появления перерывов, также не будет параметром функции. Замедление при определенной скорости всегда будет одинаковым.

Как вы вычисляете скорость на одну секунду позже в такой ситуации, принимая некоторые произвольные константы для замедления, массы, трения или чего-либо еще и игнорируя такие усложняющие воздействия, как сопротивление воздуха? Я только после кинетической энергии и ее рассеивания из-за трения от поломки машины.

Обновление 2 Теперь я вижу, что ускорение автомобиля будет в течение одного года, и это на самом деле не то, что я искал. Я уберу это и попробую новые предложения завтра. Спасибо за ваш вклад.

Ответы [ 15 ]

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

Я попробовал это, который работает (в Ruby).Не уверен, что математика - это звук, но результат выглядит правильно, а это означает, что по мере движения к центру вы ускоряетесь:

velocity=100;
(100.downto(0)).each { |distance_from_black_hole |  velocity=velocity+9.8/distance_from_black_hole; puts velocity; }
0 голосов
/ 19 февраля 2010

Ускорение является производной первого порядка по скорости и производной второго порядка по расстоянию.Ваш график выглядит как парабола второго порядка, что-то вроде Ck * x ^ 2 для некоторых констант C и k.Если y - действительно расстояние, вам нужно a = -2k, если y - скорость, вам нужно a = -2kx.В любом случае скорость v (x) = V0 + a (x) * x.(Где x на самом деле время. Я следую вашему соглашению и не использую t.)

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

Я бы снизил скорость как что-то вроде v = v * 0,9 Тогда у меня будет скорость, которая считается остановленной скоростью. Таким образом, объект в конце концов остановится и не будет продолжать использовать ресурсы как движущиеся. так что-то вроде для (V = startingVelocity; v <1,0; v * = 0,9) { х + = v; } </p>

0 голосов
/ 19 февраля 2010
acceleration = (force / mass) 
velocity = (acceleration * time)
(force from user's finger) = acceleration / mass = velocity / time
  1. придайте массе представление (настройте его, пока все не покажется разумным, и позвольте пользователю настроить его)
  2. определить новую силу (перетащить)
  3. придайте новой силе (перетаскиванию) величину (настройте до разумного, позвольте пользователю настроить ее)
  4. примените новую силу к объекту и наблюдайте, как она замедляется
0 голосов
/ 19 февраля 2010

Вы можете отслеживать скорость и уменьшать ее на долю скорости каждый раз. Я считаю, что это очень хорошо имитирует трение.

...