module LSystem.Turtle where
import Graphics.PS.Pt
data Turtle = Turtle {ta :: Double
,tai :: Double
,loc :: Pt
,hdg :: Double
,ll :: Double
,ls :: Double
,stk :: [Turtle]
}
turnRight :: Turtle -> Turtle
turnRight t = t {hdg = hdg t + (ta t)}
turnLeft :: Turtle -> Turtle
turnLeft t = t {hdg = hdg t (ta t)}
turnBack :: Turtle -> Turtle
turnBack t = t {hdg = hdg t + pi}
incrLine :: Turtle -> Turtle
incrLine t = t {ll = ll t * ls t}
decrLine :: Turtle -> Turtle
decrLine t = t {ll = ll t / ls t}
forward :: Turtle -> Turtle
forward t =
let shift (Pt x y) r d = Pt (x + r * cos d) (y + r * sin d)
in t {loc = shift (loc t) (ll t) (hdg t)}
push :: Turtle -> Turtle
push t = t {stk = t : stk t}
pop :: Turtle -> Turtle
pop t = head (stk t)
stepTurtle :: (t -> Pt -> Pt -> b) -> Turtle -> t -> (Turtle,b)
stepTurtle f t i =
let p = loc t
t' = forward t
p' = loc t'
i' = f i p p'
in (t',i')