編集:質問に答えるには、使用している近似を使用することが適切です。これはオイラーの一次微分方程式を解く方法であり、あなたを判断するために横たわっている角速度の絶対値がありません。時間間隔を短くすると正確になりますが、それは重要ではありません。
これを行うには、以下の手順を実行することができます(下記参照)。しかし、これは私には分かりやすいようです。
なぜこの長いソリューションに気をつけますか?これはと計算されているため、eDisplay
が不定期に発生した場合でも動作します。
のは、自分自身のタイムイベントを与えてみましょう:
eTime :: Event t Int
eTime = bTime <@ eDisplay
DELTATを取得するには、我々は時間間隔経過を追跡する必要があります
type TimeInterval = (Int,Int) -- (previous time, current time)
ので、我々はデルタにそれらを変換することができます:
delta :: TimeInterval -> Int
delta (t0,t1) = t1 - t0
新しい時間間隔を更新するにはどうすればよいですかt2
?
tick :: Int -> TimeInterval -> TimeInterval
tick t2 (t0,t1) = (t1,t2)
それでは、部分的に私たちに間隔アップデータを与えるために、時間にそれを適用してみましょう:
eTicker :: Event t (TimeInterval->TimeInterval)
eTicker = tick <$> eTime
し、我々はaccumE
最初の時間間隔にその機能を-accumulateことができます。
eTimeInterval :: Event t TimeInterval
eTimeInterval = accumE (0,0) eTicker
eTimeはレンダリングの開始から測定されるため、(0,0)
の初期値が適切です。
最後に、(fmap
ping)delta
を時間間隔で適用するだけで、DeltaTイベントを実行できます。
eDeltaT :: Event t Int
eDeltaT = delta <$> eTimeInterval
これで、同様の考え方で角度を更新する必要があります。
私はちょうど乗数にbAngularVelocity
を回すことにより、角度のアップデータを作ってあげる:
bAngleMultiplier :: Behaviour t (Double->Double)
bAngleMultiplier = (*) <$> bAngularVelocity
その後、我々はeDeltaAngle
を作るためにそれを使用することができます(編集:(+)
に変更し、Double
に変換)
eDeltaAngle :: Event t (Double -> Double)
eDeltaAngle = (+) <$> (bAngleMultiplier <@> ((fromInteger.toInteger) <$> eDeltaT)
と角度を得るために蓄積:
eAngle :: Event t Double
eAngle = accumE 0.0 eDeltaAngle
あなたはワンライナーを好きなら、あなたは
eDeltaT = delta <$> (accumE (0,0) $ tick <$> (bTime <@ eDisplay)) where
delta (t0,t1) = t1 - t0
tick t2 (t0,t1) = (t1,t2)
eAngle = accumE 0.0 $ (+) <$> ((*) <$> bAngularVelocity <@> eDeltaT) =
を書くことができますが、私はそれがひどく照明だとは思わない、と正直に言うと、私は私がしました右以来、私は私のfixitiesを持っているかわかりませんこれはghciでテストされていません。
もちろん
、私はeAngle
の代わりbAngle
を作っているので、あなたの代わりにあなたの元
reactimate $ (draw gears) <$> (bAngle <@ eDisp)
好きな場合は、ステロイド – AndrewC
@AndrewC、私は[この](https://github.com/HeinrichApfelmus/reactive-banana/blob/master/reactive-banana -wx/src/Asteroids.hs)は、あなたが望むリンクですか? – huon
はい。短所:低速でジャーキー、高速でグラフィックスエンジンに過負荷、醜い。私は私の提案を取り戻す:角速度を使用してはるかにエレガント。 –
AndrewC