packages feed

brillo-examples-1.13.3: picture/Lifespan/Cell.hs

module Cell where

import Brillo


data Cell
  = Cell
      Point -- centre
      Float -- radius
      Int -- remaining lifetime
  deriving (Show)


-- Produce a new cell of a certain relative radius at a certain angle.
-- The factor argument is in the range [0..1] so spawned cells are
-- smaller than their parent.
-- The check whether it fits in the community is elsewhere.
offspring :: Cell -> Float -> Float -> Int -> Cell
offspring (Cell (x, y) r _) alpha factor lifespan =
  Cell
    (x + (childR + r) * cos alpha, y + (childR + r) * sin alpha)
    childR
    lifespan
  where
    childR = factor * r


-- Do two cells overlap?
-- Used to decide if newly spawned cells can join the community.
overlap :: Cell -> Cell -> Bool
overlap (Cell (x1, y1) r1 _) (Cell (x2, y2) r2 _) = centreDist < (r1 + r2) * 0.999
  where
    centreDist = sqrt (xdiff * xdiff + ydiff * ydiff)
    xdiff = x1 - x2
    ydiff = y1 - y2


-- thickness of circle is determined by lifespan
render :: Cell -> Picture
render (Cell (x, y) r life) =
  Color (makeColor 0.6 z 0.6 1.0) $
    Translate x y $
      ThickCircle (r - thickness / 2) thickness
  where
    z = fromIntegral life * 0.12
    thickness = fromIntegral life