【发布时间】:2013-08-22 12:12:49
【问题描述】:
正如问题标题所说,我正在尝试创建一条产生位置的线(在每一步中以一定的速度移动位置),“反弹”其他物体。我能想到的最简单的例子是在一个盒子内移动,就像在某些屏幕保护程序中一样。
我编写这个函数是为了尝试做到这一点(仅适用于一个轴):
import Control.Wire
bouncyWire :: Double -> Double -> Double -> Double -> Wire () IO a Double
bouncyWire startPosition startVelocity lowerBound upperBound = proc _ -> do
rec
v <- delay startVelocity -< if p < lowerBound || p > upperBound
then -v else v
p <- integral_ startPosition -< v
returnA -< p
(我实际上将它与不同的 monad 一起使用,但这段代码实际上并没有使用它,它会使这里的问题过于复杂)。
用counterSession $ 1/60 踩它但是,我遇到了一个问题 - 它不是从墙上“弹起”,而是卡在那里。我认为发生的事情是它不断翻转速度v,但我不确定为什么。我想我可能使用延迟错误或其他东西。
【问题讨论】: