...
This commit is contained in:
parent
051504d65b
commit
0457928c3e
295 changed files with 3588 additions and 3 deletions
28
Task/Animate-a-pendulum/Haskell/animate-a-pendulum.hs
Normal file
28
Task/Animate-a-pendulum/Haskell/animate-a-pendulum.hs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
import Graphics.HGL.Draw.Monad (Graphic, )
|
||||
import Graphics.HGL.Draw.Picture
|
||||
import Graphics.HGL.Utils
|
||||
import Graphics.HGL.Window
|
||||
import Graphics.HGL.Run
|
||||
|
||||
import Control.Exception (bracket, )
|
||||
import Control.Arrow
|
||||
|
||||
toInt = fromIntegral.round
|
||||
|
||||
pendulum = runGraphics $
|
||||
bracket
|
||||
(openWindowEx "Pendulum animation task" Nothing (600,400) DoubleBuffered (Just 30))
|
||||
closeWindow
|
||||
(\w -> mapM_ ((\ g -> setGraphic w g >> getWindowTick w).
|
||||
(\ (x, y) -> overGraphic (line (300, 0) (x, y))
|
||||
(ellipse (x - 12, y + 12) (x + 12, y - 12)) )) pts)
|
||||
where
|
||||
dt = 1/30
|
||||
t = - pi/4
|
||||
l = 1
|
||||
g = 9.812
|
||||
nextAVT (a,v,t) = (a', v', t + v' * dt) where
|
||||
a' = - (g / l) * sin t
|
||||
v' = v + a' * dt
|
||||
pts = map (\(_,t,_) -> (toInt.(300+).(300*).cos &&& toInt. (300*).sin) (pi/2+0.6*t) )
|
||||
$ iterate nextAVT (- (g / l) * sin t, t, 0)
|
||||
Loading…
Add table
Add a link
Reference in a new issue