packages feed

brillo-examples-2.0.0: picture/Flake/Main.hs

{-# LANGUAGE OverloadedStrings #-}

{-| Snowflake Fractal.
     Based on ANUPlot code by Clem Baker-Finch.
-}
module Main where

import Brillo


main :: IO ()
main =
  display
    (InWindow "Snowflake" (500, 500) (20, 20))
    black
    (picture 3)


-- Fix a starting edge length of 360
edge :: Float
edge = 360


-- Move the fractal into the center of the window and colour it nicely
picture :: Int -> Picture
picture degree =
  Color aquamarine $
    Translate (-edge / 2) (-edge * sqrt 3 / 6) $
      snowflake degree


-- The fractal function
side :: Int -> Picture
side 0 = Line [(0, 0), (edge, 0)]
side n =
  let newSide =
        Scale (1 / 3) (1 / 3) $
          side (n - 1)
  in  Pictures
        [ newSide
        , Translate (edge / 3) 0 $ Rotate 60 newSide
        , Translate (edge / 2) (-(edge * sqrt 3) / 6) $ Rotate (-60) newSide
        , Translate (2 * edge / 3) 0 $ newSide
        ]


-- Put 3 together to form the snowflake
snowflake :: Int -> Picture
snowflake n =
  let oneSide = side n
  in  Pictures
        [ oneSide
        , Translate edge 0 $ Rotate (-120) $ oneSide
        , Translate (edge / 2) (edge * sqrt 3 / 2) $ Rotate 120 $ oneSide
        ]