packages feed

context-free-art-0.3.0.1: examples/Sierpinski/Carpet.hs

module Sierpinski.Carpet ( sierpinskiCarpet ) where

import Art.ContextFree.Definite
import Data.List.NonEmpty

third :: Float
third = 1.0 / 3

square :: Symbol
square = Poly [(0, 1), (1, 0), (0, -1)]

layer :: Int -> Symbol
layer 0 = Branch $ square
          :| [Mod [Move (third, third), Scale third, Color "#fff"] square]
layer n
  = let a = layer (n - 1)
        row = Branch $ a :| [Mod [Move (1, 0)] a, Mod [Move (2, 0)] a]
    in  Mod [Scale third] $ Branch $ row :|
      [ Mod [Move (0, 2)] row
      , Mod [Move (0, 1)] a
      , Mod [Move (2, 1)] a
      ]

sierpinskiCarpet :: Symbol
sierpinskiCarpet = layer 3