Tôi đang bắt đầu tìm hiểu cách vật lý DIY và tôi có một câu hỏi về việc triển khai tích hợp ở mức cơ bản nhất (nghĩa là đây không phải là câu hỏi Euler so với RK4).
Gần như mọi ví dụ tôi gặp đều có một số integrate()
chức năng lấy dấu thời gian kể từ lần cập nhật trước và cập nhật gia tốc (và / hoặc vận tốc và / hoặc vị trí) kể từ lần cập nhật cuối cùng.
Ở dạng đơn giản nhất: position += velocity * deltaTime
Tuy nhiên, tôi không hiểu tại sao nó lại tích lũy như thế này khi nó có thể dễ dàng nhận được bằng cách thay đổi một chức năng . Ví dụ: getPosition = makeNewFunction()
có thể trả về một cái gì đó có chữ ký Time -> Position
và hoạt động bên trong của hàm đó được tạo thông qua công thức toán học thích hợp.
Theo cách đó, không có sự tích lũy ... bất cứ khi nào vị trí cần được nhận, nó sẽ gọi chức năng đó với thời gian hiện tại.
Người mới hiểu của tôi là điều này cũng sẽ tránh được các lỗi xuất phát từ tích lũy ... vậy tại sao điều này không hoạt động, tôi còn thiếu gì?
(fwiw tôi đã đặt cùng một bằng chứng cơ bản của khái niệm về idea- này mặc dù nó cũng thử nghiệm một vài thứ khác cùng một lúc do đó, nó không phải là ví dụ sạch: https://github.com/dakom/ball-bounce-frp )
EDIT 1: như đã đề cập trong các bình luận, có lẽ điều quan trọng là chỉ ra rằng tôi chưa học về thay đổi gia tốc, hoặc xử lý giật và những thứ khác đòi hỏi tích hợp bậc cao hơn tăng tốc liên tục.
EDIT 2: đây là một số mã mẫu cơ bản của ý tưởng và cú pháp javascript giả - lưu ý getKinematicPosition
được áp dụng một phần để nó trả về một chức năng mới chỉ là Thời gian -> Vị trí:
Tôi đang giữ vị trí ở đây nhưng nó có thể là một cái gì đó khác, như getVelocity
, tôi đoán ...
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
}
}