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)