820d85972b6a871545b3636829db11609fed1218
[L-seed.git] / src / Lseed / StipeInfo.hs
1 module Lseed.StipeInfo where
2
3 import Lseed.Data
4 import Lseed.Data.Functions
5 import Lseed.Geometry
6
7 annotateGarden :: Angle -> GrowingGarden -> AnnotatedGarden
8 annotateGarden angle  = map (mapPlanted annotatePlant) . lightenGarden angle
9
10 annotatePlant :: Plant (GrowthState, Double) -> AnnotatedPlant
11 annotatePlant = go 0
12   where go d (Plant (gs, light) len ang ut ps) = Plant (StipeInfo
13                 { siLength    = len
14                 , siSubLength = len + sum (map (siSubLength . pData) ps')
15                 , siLight     = light
16                 , siSubLight  = light + sum (map (siSubLight . pData) ps')
17                 , siAngle     = ang
18                 , siDirection = normAngle d'
19                 , siGrowth    = gs
20                 }) len ang ut ps'
21           where ps' = map (go d') ps
22                 d' = (d+ang)
23
24 normAngle a = a - fromIntegral (truncate ((a+pi) / (2*pi))) * 2*pi