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