packages feed

mcmaster-gloss-examples-2013: MovingStar.hs

---------

--(c) 2013 Ahmed Khan, MATTHEW PRIOR-COXHEAD    
--Permission granted to distributed and modify, as long as this notice is preserved. Distributed without warrantee

---------

module Main where

import Graphics.Gloss

--define the main function
main :: IO ()
--creates a window with the name create moving star, which is 650 by 450 pixels big and positions 0 by 0 on the screen, which is on the top left
main 
 =  animate (InWindow "create moving star" (650, 450) (0, 0))
                (greyN 0.1)
        frame

--the frame function takes a float and returns a the picture which is displayed at that given time
-- the float represents the amount of time that has passed since thes start of the animation 
--the frame function calls the function getFracs for each individual rectangle on the screan
--the getFracs returns a list of objects, which are all the particles
frame :: Float -> Picture
frame timeS
 = Pictures (getFracs timeS)
 
 
 -- these varibles effect the circular  pattern behavior 
bigR :: Float
bigR = 80.0
r :: Float
r = 20.0
p :: Float
p = 158.0

--this function takes an int and returns a color
differentColors :: Int -> Color
differentColors 0 = makeColor 0.0 1.0 0.0 0.9
differentColors 1 = makeColor 0.0 0.0 1.0 0.9
differentColors 2 = makeColor 1.0 0.0 0.0 0.9

-- draws the rectangle, and calls the differentColors function for the color
-- the int for the color is determined by dividing the time by three and returning its remainder into the function. 
-- makes makes it so each object changes color ofter 3 seconds
drawRectangle timeS = Color (differentColors (mod (round (timeS*0.98)) 3)) $ rectangleUpperSolid 5 10
 
--this function calls itself until the time variable is lower then 0
--this function draws each individual particle using the spiroFrac function
getFracs timeS = if timeS > 0 then [spiroFrac 1 timeS] ++ getFracs (timeS-0.2) else [] -- gets a series of rectanlges


--This function makes the fractal
spiroFrac :: Int -> Float -> Picture
spiroFrac n timeS -- this actually generates the fractal
 =  let x = ((r+bigR)*cos(timeS + 3*pi/2)) + (r*cos(((timeS)*bigR)/(r) + 3*pi/2));
        y = ((r+bigR)*(sin(timeS + pi/2))) + (r*sin(((timeS)*bigR)/(r) - pi/4));
        rotatedImage = Rotate (-atan(y/x)*180/pi) (drawRectangle timeS)
        in Pictures [Translate x y (rotatedImage)] 
--so the spiroFrac actually detirmines the position and rotation of all the particles. 
--The basis of all this equation is to create a circle with the radius of the inner area of the star. 
--then create another circle on top of that circle rolling around it. This is known as a spiro
--but what this does is create a line straight through the circle as time passes as the circle is rolling around the big circle