Я начинаю изучать физику DIY, и у меня есть вопрос о реализации интеграции на самом базовом уровне (т.е. это не вопрос Эйлера против РК4).
Почти каждый пример, с которым я сталкиваюсь, имеет некоторую integrate()
функцию, которая получает временной шаг с момента последнего обновления и обновляет ускорение (и / или скорость и / или положение) с момента последнего обновления.
В простейшем виде: position += velocity * deltaTime
Тем не менее, я не понимаю, почему он накапливается так, когда его можно так же легко получить, изменив функцию . Например: getPosition = makeNewFunction()
который может возвращать то, что имеет сигнатуру Time -> Position
, и внутренняя работа этой функции генерируется с помощью соответствующей математической формулы.
Таким образом, нет накопления ... всякий раз, когда необходимо получить позицию, она вызывает эту функцию с текущим временем.
Мое понимание новичка заключается в том, что это также позволит избежать ошибок, возникающих из-за накопления ... так почему это не работает, что я пропускаю?
(FWIW я сделал собрать основные доказательства концепции этого idea- , хотя это также тестирование несколько других вещей , в то же время , так что это не самый чистый пример: https://github.com/dakom/ball-bounce-frp )
РЕДАКТИРОВАТЬ 1: как упомянуто в комментариях, вероятно, важно отметить, что я еще не узнал об изменении ускорения или о работе с рывками и другими вещами, которые требуют интеграции более высокого порядка, чем постоянное ускорение.
EDIT 2: здесь некоторые основные примеры кода идеи, и псевдо Javascript синтаксис - обратите внимание , что getKinematicPosition
это частично применяется так оно возвращает новую функцию только время -> Положение:
Я придерживаюсь позиции здесь, но это может быть что-то еще, например getVelocity
, я думаю ...
getKinematicPosition = initialVelocity => acceleration => time =>
((.5 *acceleration) * (time * time)) + (initialVelocity * time);
getPosition = getKinematicPosition ([0,0,0]) (GRAVITY);
onTick = totalTime => {
position = getPosition (totalTime);
onCollision = () => {
getPosition = changeTheFunction(totalTime);
//changeTheFunction uses totalTime to base updates from 0
//it could use getKinematicPosition or something else entirely
}
}