import LSystem {-##################################################-} {-# COMPETITION ENTRY: AISTIS STANKEVICIUS 0791918 #-} {-##################################################-} {-IMPORTANT: For best view type: display 1.0 inits -} {-It takes some time to generate the image, so please be patient -} {-Also be aware that size of the file is about 40Mbs, sorry for that -} {-FAKE PIXEL-} putPixel :: Int -> Int -> Int -> Command putPixel a x y = GrabPen (p a x y) :#: Go 1 :#: Go (-1) {-END FAKE PIXEL-} {-GO TO POSITION X Y-} gotoXY :: (Int,Int) -> (Int,Int) -> Command gotoXY (0,0) (x,y) = Go (fromIntegral y) :#: Turn (-90) :#: Go (fromIntegral x) :#: Turn 90 gotoXY (x,y) (0,0) = Go (fromIntegral(-y)) :#: Turn (-90) :#: Go (fromIntegral(-x)) :#: Turn 90 --gotoXY (0,0) (0,0) = Sit jumpXY (x,y) (x1,y1) = GrabPen Inkless :#: (gotoXY (x,y) (x1,y1)) {-END GO TO POSITION X Y-} {----MANDELBROT----} maxIter = 64 {-Number of iterations-} {-GENERATE AREA-} area :: [(Int,Int)] area = [(x,y) | x <- [0..400], y <- [0..400]] {- 400x400 "screen" -} {-END GENERATE AREA-} {-EVALUATE PIXELS IN AREA-} areaEval :: [(Int,(Int,Int))] areaEval = zip [coordEval (fromIntegral(x),fromIntegral(y)) 0 0 0 0 | (x,y) <- area] area {-END EVALUATE PIXELS IN AREA-} {-EVALUATE PIXEL AT XY-} coordEval :: (Float,Float) -> Int -> Float -> Float -> Float -> Int coordEval (x,y) i a1 a2 b | (za2(a1,b,x) * za2(a1,b,x) + zb(a1,b,y) * zb(a1,b,y) <= 4) && (i <= maxIter) = coordEval (x,y) (i + 1) (za2(a1,b,x)) (za2(a1,b,x)) (zb(a1,b,y)) | (i > maxIter) = 0 | (za2(a1,b,x) * za2(a1,b,x) + zb(a1,b,y) * zb(a1,b,y) > 4) = 1 {-Helper functions for computation and adjustment-} za2 (a1,b,x) = a1*a1 - b*b + c1(x) zb (a1,b,y) = 2*a1*b + c2(y) c1 x = x / 400 * 2.8 - 2.2 c2 y = y / 400 * 2.8 - 1.4 {-END EVALUATE PIXEL AT XY-} {----END MANDELBROT----} {-INITIATE PLOTTER-} inits :: Command inits = adjustPos :#: join[jumpXY (0,0) (x,y) :#: (putPixel n x y) :#: jumpXY (x,y) (0,0) | (n,(x,y)) <- areaEval] {-END INITIATE PLOTTER-} {-COLOUR GENERATOR-} p :: Int -> Int -> Int -> Pen p a x y | a == 0 = Colour (abs(ca ((y*y*x)`div`(x*x*y)))) 0 (abs(sa (x`div`(y+1)))) | otherwise = Colour (abs(sa (x`div`(y+1)))) (abs(sa (x`div`(y+1)))) (abs(sa (x`div`(y+1)))) ca a = (cos (fromIntegral(a))) sa a = (sin (fromIntegral(a))) {-END COLOUR GENERATOR-} {-ADJUST STARTING POSITION-} adjustPos :: Command adjustPos = GrabPen Inkless :#: Go (-100) :#: Turn 90 :#: Go(300) :#: Turn (-90) {-END ADJUST STARTING POSITION-} {-JOIN LIST OF COMMANDS-} join :: [Command] -> Command join a = foldr (:#:) Sit a {-END JOIN LIST OF COMMANDS-}