module TreeLSystem ( TreeModule (..), treeLSystem, treeInterpretation, ) where import LSystem import Turtle data TreeModule = TreeA | TreeF Double | TreeEx Double | TreeLineWidth Double | -- Turn-, Roll und Pitch-Befehle TreeRR Double | TreePU Double | TreePD Double treeLSystem :: LSystem TreeModule treeLSystem = LSystem (map LPrim [TreePU 90, TreeEx 1, TreeF 200, TreeRR 45, TreeA]) rules where d1 = 112.50 -- divergence angle 1 d2 = 157.50 -- divergence angle 2 a = 32.50 -- branching angle lr = 1.14 -- elongation rate vr = 1.732 -- width increase rate rules TreeA = [ LPrim $ TreeEx vr, LPrim $ TreeF 50, LStack [LPrim $ TreePD a, LPrim $ TreeF 50, LPrim TreeA], LPrim $ TreeRR d1, LStack [LPrim $ TreePD a, LPrim $ TreeF 50, LPrim TreeA], LPrim $ TreeRR d2, LStack [LPrim $ TreePD a, LPrim $ TreeF 50, LPrim TreeA] ] rules (TreeF len) = [LPrim $ TreeF (len*lr)] rules (TreeEx wid) = [LPrim $ TreeEx (wid*vr)] rules m = [LPrim m] treeInterpretation :: TreeModule -> [LPrim TurtleModule] treeInterpretation m = case m of TreeF len -> [LPrim $ TDraw len] TreePU a -> [LPrim $ TPitchUp a] TreePD a -> [LPrim $ TPitchDown a] TreeRR a -> [LPrim $ TRollRight a] TreeEx wid -> [LPrim $ TSetLineWidth wid] _ -> []