{-# LANGUAGE OverloadedStrings #-}
{-| Tree Fractal.
Based on ANUPlot code by Clem Baker-Finch.
-}
module Main where
import Brillo (
Color,
Display (InWindow),
Picture (Color, Pictures, Polygon, Rotate, Scale, Translate),
animate,
black,
dim,
green,
makeColorI,
mixColors,
)
main :: IO ()
main =
animate
(InWindow "Tree" (500, 650) (20, 20))
black
(picture 4)
-- The picture is a tree fractal, graded from brown to green
picture :: Int -> Float -> Picture
picture degree time =
Translate 0 (-300) $
tree degree time (dim $ dim brown)
-- Basic stump shape
stump :: Color -> Picture
stump colr =
Color colr $
Polygon [(30, 0), (15, 300), (-15, 300), (-30, 0)]
-- Make a tree fractal.
tree ::
Int -> -- Fractal degree
Float -> -- time
Color -> -- Color for the stump
Picture
tree 0 _time colr = stump colr
tree n time colr =
let smallTree =
Rotate (sin time) $
Scale 0.5 0.5 $
tree (n - 1) (-time) (greener colr)
in Pictures
[ stump colr
, Translate 0 300 smallTree
, Translate 0 240 $ Rotate 20 smallTree
, Translate 0 180 $ Rotate (-20) smallTree
, Translate 0 120 $ Rotate 40 smallTree
, Translate 0 60 $ Rotate (-40) smallTree
]
-- | Starting color for the stump
brown :: Color
brown = makeColorI 139 100 35 255
-- | Make the color a little greener
greener :: Color -> Color
greener =
mixColors 1 10 green