gpt4 book ai didi

haskell - Haskell中的简单弹跳球不断弹跳更高

转载 作者:行者123 更新时间:2023-12-02 01:07:01 24 4
gpt4 key购买 nike

所以,我做了一个弹跳球的简单模拟来学习 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)

最佳答案

这是您用来积分运动微分方程的算法的一个众所周知的产物。

“真正的物理”是(我只会讨论y分量)

y/∂t = v(t)
v/∂t = g

您可以通过高度和速度的离散序列对此进行建模

yi = yi − 1 + vi − 1 ⋅ Δt
vi = vi − 1 + g ⋅ Δt

这确实类似于微分方程,只是写成差商 - 但它不是同一件事(除了极限 Δt → 0):实际上,速度本身在时间过程中发生变化步,因此仅根据该时间步之前的常数 v 值来改变位置并不完全正确。简单地忽略该复杂性是一个称为 Euler's method 的近似值。 ,而且众所周知,它的性能相当糟糕。

更准确的标准替代方案是四阶 Runge-Kutta method ,尝试一下。

n.m. 关于弹跳的观点也是有效的,尽管要真正正确地做到这一点,您应该计算准确的撞击时间,既不要忽略太多的加速度,也不要得到太多实际上从未发生过的加速度.

关于haskell - Haskell中的简单弹跳球不断弹跳更高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24480826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com