Estou começando a aprender a física de bricolage e tenho uma pergunta sobre a implementação da integração no nível mais básico (isto é, não é uma pergunta de Euler vs. RK4).
Quase todos os exemplos que encontrei têm alguma integrate()
função que obtém o timestep desde a última atualização e atualiza a aceleração (e / ou velocidade e / ou posição) desde a última atualização.
Na forma mais simples: position += velocity * deltaTime
No entanto, eu não entendo por que ele é acumulado dessa forma quando pode ser obtido facilmente com a alteração de uma função . Por exemplo: o getPosition = makeNewFunction()
que poderia retornar algo que possui a assinatura de Time -> Position
, e o funcionamento interno dessa função é gerado por meio da fórmula matemática apropriada.
Dessa forma, não há acumulação ... sempre que a posição precisa ser obtida, ela chama essa função com a hora atual.
Meu entendimento para iniciantes é que isso também evitaria os erros resultantes da acumulação ... então, por que isso não funciona, o que estou perdendo?
(fwiw eu fiz reunir uma prova básica do conceito desta idéia-embora também está testando algumas outras coisas ao mesmo tempo, por isso não é o exemplo mais limpa: https://github.com/dakom/ball-bounce-frp )
EDIT 1: como mencionado nos comentários, provavelmente é importante salientar que eu tenho não aprendi sobre a alteração da aceleração ou sobre como lidar com o idiota e outras coisas que exigem integração de ordem superior à aceleração constante.
EDIT 2: aqui está um código de exemplo básico da ideia e sintaxe de pseudo-javascript - observe que getKinematicPosition
é parcialmente aplicado e, portanto, está retornando uma nova função apenas de Time -> Position:
Estou mantendo a posição aqui, mas poderia ser outra coisa, tipo getVelocity
, eu acho ...
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
}
}