
-- 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
	]
