Я починаю вивчати, як робити самостійно фізику, і у мене виникає питання щодо інтеграції на самому базовому рівні (тобто це не питання Ейлера проти RK4).
Майже в кожному прикладі, який я зустрічаю, є деяка integrate()
функція, яка отримує часовий крок з моменту останнього оновлення та оновлює прискорення (та / або швидкість та / або положення) з моменту останнього оновлення.
У найпростішій формі: position += velocity * deltaTime
Однак я не розумію, чому він накопичується так, коли його можна так само легко отримати, змінивши функцію . Наприклад: getPosition = makeNewFunction()
що може повернути те, що має підпис Time -> Position
, а внутрішня робота цієї функції формується за допомогою відповідної математичної формули.
Таким чином, немає накопичення ... щоразу, коли потрібно отримати позицію, вона викликає цю функцію з поточним часом.
Моя новачка розуміє, що це також дозволить уникнути помилок, що виникають через накопичення ... так чому це не працює, чого я пропускаю?
(FWIW я зробив зібрати основні докази концепції цього idea- , хоча це також тестування кілька інших речей , в той же час , так що це не найчистіший приклад: https://github.com/dakom/ball-bounce-frp )
EDIT 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
}
}