【发布时间】:2014-06-29 22:25:21
【问题描述】:
所以,我做了一个简单的弹跳球模拟来学习haskell。球应该会在图像边界上反弹并通过重力向下加速。
问题在于随着时间的推移,球“神奇地”弹得更高。我希望它保持相同的最大高度。
我怀疑bounce 和move 有问题,因为bounce 将球“传送”回框架内,这在物理上并不准确。我尝试了不同的方法来模拟正确的行为,但找不到任何正确的方法。
这样做的正确方法是什么?
这是代码,在CodeWorld上运行:
main = simulationOf initial step draw
data World = Ball Point Vector
radius = 40
border = 250 - radius
g = -500
initial (x:y:vx:vy:_) = Ball (400*x - 200, 400*y - 200)
(400*vx - 200, 400*vy - 200)
step t world = bounce (move t world)
move t (Ball (x,y) (vx,vy)) = Ball (x + vx*t, y + vy*t) (vx, vy + g*t)
bounce (Ball (x,y) (vx,vy)) = Ball (nx,ny) (nvx, nvy)
where nx = fence (-border) border x
ny = fence (-border) border y
nvx = if nx /= x then -vx else vx
nvy = if ny /= y then -vy else vy
fence lo hi x = max lo (min hi x)
draw (Ball (x,y) _) = translate x y (solidCircle radius)
【问题讨论】:
标签: haskell simulation physics