module Graphics.X11.Turtle ( Turtle, openField, newTurtle, shape, shapesize, forward, backward, circle, undo, left, right, clear, home, pendown, penup, isdown, distance ) where import Graphics.X11.CharAndBG import Control.Monad forward, backward, forwardNotSetUndo :: Turtle -> Double -> IO () forward t dist = do setUndoN t 1 forwardNotSetUndo t dist forwardNotSetUndo t dist = do dir <- direction t (x0, y0) <- position t let xd = dist * cos (dir * pi / 180) yd = dist * sin (dir * pi / 180) goto t (x0 + xd) (y0 + yd) backward t = forward t . negate left, right :: Turtle -> Double -> IO () left t dd = do dir <- direction t rotate t (dir + dd) right t = left t . negate circle :: Turtle -> Double -> IO () circle t r = do setUndoN t 73 forwardNotSetUndo t (r * pi / 36) left t 10 replicateM_ 35 $ forwardNotSetUndo t (2 * r * pi / 36) >> left t 10 forwardNotSetUndo t (r * pi / 36) home :: Turtle -> IO () home t = do goto t 0 0 rotate t 0 distance :: Turtle -> Double -> Double -> IO Double distance t x0 y0 = do (x, y) <- position t return $ ((x - x0) ** 2 + (y - y0) ** 2) ** (1 / 2)