ฉันเริ่มเรียนรู้วิธีการทำฟิสิกส์แบบ DIY และฉันมีคำถามเกี่ยวกับการนำการบูรณาการมาใช้ในระดับพื้นฐานที่สุด (เช่นนี่ไม่ใช่คำถามของออยเลอร์กับ RK4)
เกือบทุกตัวอย่างที่ฉันเจอมีintegrate()
ฟังก์ชั่นบางอย่างที่ได้รับการประทับเวลาตั้งแต่การอัปเดตครั้งล่าสุดและอัปเดตการเร่งความเร็ว (และ / หรือความเร็วและ / หรือตำแหน่ง) ตั้งแต่การอัปเดตครั้งล่าสุด
ในรูปแบบที่ง่ายที่สุด: position += velocity * deltaTime
แต่ผมไม่เข้าใจว่าทำไมมันสะสมเช่นนี้เมื่อมันสามารถได้อย่างง่ายดายเพียงได้รับอากาศโดยเปลี่ยนฟังก์ชั่น ตัวอย่างเช่น: getPosition = makeNewFunction()
ซึ่งสามารถคืนสิ่งที่มีลายเซ็นTime -> Position
และผลงานภายในของฟังก์ชันนั้นถูกสร้างขึ้นผ่านสูตรทางคณิตศาสตร์ที่เหมาะสม
ด้วยวิธีนี้ไม่มีการสะสม ... เมื่อใดก็ตามที่ต้องได้รับตำแหน่งมันจะเรียกฟังก์ชันนั้นตามเวลาปัจจุบัน
การทำความเข้าใจเกี่ยวกับมือใหม่ของฉันคือการที่จะหลีกเลี่ยงข้อผิดพลาดที่เกิดจากการสะสม ... ดังนั้นทำไมมันไม่ทำงานฉันจะพลาดอะไร
(fwiw ฉันได้รวบรวมหลักฐานพื้นฐานของแนวคิดของความคิดนี้ - แม้ว่ามันจะทดสอบสิ่งอื่น ๆ ในเวลาเดียวกันดังนั้นมันจึงไม่ใช่ตัวอย่างที่สะอาดที่สุด: https://github.com/dakom/ball-bounce-frp )
แก้ไข 1:ดังที่กล่าวไว้ในความคิดเห็นอาจเป็นสิ่งสำคัญที่ชี้ให้เห็นว่าฉันยังไม่ได้เรียนรู้เกี่ยวกับการเปลี่ยนการเร่งความเร็วหรือการจัดการกับกระตุกและสิ่งอื่น ๆ ที่ต้องมีการรวมลำดับสูงกว่าเร่งความเร็วคงที่
แก้ไข 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
}
}