packages feed

3d-graphics-examples-0.0.0.0: src/l-systems/ConiferLSystem.hs

module ConiferLSystem (
  ConiferModule (..),
  coniferLSystem,
  coniferInterpretation,
  ) where

import LSystem
import Turtle


data ConiferModule =
  ConiferX Double | ConiferY Double | ConiferF Double |
  ConiferLineWidth Double |
  ConiferTL Double | ConiferTR Double |  -- Turn-Befehle
  ConiferRL Double | ConiferRR Double |  -- Roll-Befehle
  ConiferPU Double | ConiferPD Double    -- Pitch-Befehle


coniferLSystem :: LSystem ConiferModule
coniferLSystem =
  LSystem (map LPrim [ConiferLineWidth 10, ConiferPU 90, ConiferX 20]) rules
  where
    rules (ConiferX a)
      | a > 6     = [ LPrim $ ConiferF 5,
        LStack [ LPrim $ ConiferPD 80, LPrim $ ConiferY (a/2) ],
        LPrim $ ConiferRR 137, LPrim $ ConiferX (a-1) ]
      | otherwise = [ LPrim $ ConiferF 6 ]
    rules (ConiferY a)
      | a >= 3    = [ LPrim $ ConiferF 3,
        LStack [ LPrim $ ConiferTL 50, LPrim $ ConiferF a ],
        LPrim $ ConiferRR 180, LPrim $ ConiferY (a-1) ]
      | otherwise = [ LPrim $ ConiferF 3 ]
    rules m = [LPrim m]


coniferInterpretation :: ConiferModule -> [LPrim TurtleModule]
coniferInterpretation m = case m of
  ConiferF len         -> [LPrim $ TDraw (10*len)]
  ConiferTL a          -> [LPrim $ TTurnLeft a]
  ConiferTR a          -> [LPrim $ TTurnRight a]
  ConiferPU a          -> [LPrim $ TPitchUp a]
  ConiferPD a          -> [LPrim $ TPitchDown a]
  ConiferRL a          -> [LPrim $ TRollLeft a]
  ConiferRR a          -> [LPrim $ TRollRight a]
  ConiferLineWidth wid -> [LPrim $ TSetLineWidth wid]
  _ -> []