packages feed

gloss-examples-1.9.3.1: picture/Zen/Main.hs

-- A nifty animated fractal of a tree, superimposed on a background 
--      of three red rectangles.
import Graphics.Gloss

main :: IO ()
main 
 =      animate (InWindow "Zen" (800, 600) (5, 5))
                (greyN 0.2)
                frame   


-- Produce one frame of the animation.
frame :: Float -> Picture
frame timeS
 = Pictures     
        -- the red rectangles
        [ Translate 0 150       backRec
        , Translate 0 0         backRec
        , Translate 0 (-150)    backRec

        -- the tree
        , Translate 0 (-150) $  treeFrac 7 timeS
        ]


-- One of the red backing rectangles, with a white outline.
backRec :: Picture
backRec 
 = Pictures
        [ Color red     (rectangleSolid 400 100)
        , Color white   (rectangleWire  400 100) ]


-- The color for the outline of the tree's branches.
treeOutline :: Color
treeOutline     = makeColor 0.3 0.3 1.0 1.0


-- The color for the shading of the tree's branches.
--      The Alpha here is set to 0.5 so the branches are partly transparent.
treeColor :: Color
treeColor       = makeColor 0.0 1.0 0.0 0.5


-- The tree fractal.
--  The position of the branches changes depending on the animation time
--  as well as the iteration number of the fractal.
treeFrac :: Int -> Float -> Picture
treeFrac 0 timeS = Blank
treeFrac n timeS
 = Pictures
        [ Color treeColor       $ rectangleUpperSolid 20 300
        , Color treeOutline     $ rectangleUpperWire  20 300
        , Translate 0 30
                $ Rotate  (200 * sin timeS / (fromIntegral n) )
                $ Scale   0.9 0.9 
                $ treeFrac (n-1) timeS

        , Translate 0 70
                $ Rotate  (-200 * sin timeS / (fromIntegral n))
                $ Scale   0.8 0.8 
                $ treeFrac (n-1) timeS
        ]