module SimpleGraphics where import Graphics.SOE main0 = runGraphics $ do w <- openWindow "My First Graphics Program" (300,300) drawInWindow w (text (100,200) "HelloGraphicsWolrd") spaceClose w spaceClose :: Window -> IO () spaceClose w = do k <- getKey w if k == ' ' then closeWindow w else spaceClose w getLine :: IO String getLine = do c <- getChar if c == '\n' then return "" else do v <- SimpleGraphics.getLine return (c:v) putStr :: String -> IO () putStr [] = return () putStr (x:xs) = do putChar x SimpleGraphics.putStr xs pic1 = withColor Red (ellipse (150, 150) (300, 200)) pic2 = withColor Blue (polyline [(100, 50), (200, 50), (200, 250), (100, 250), (100, 50)]) main2 = runGraphics $ do w <- openWindow "Some Graphics Figures" (300, 300) drawInWindow w pic1 drawInWindow w pic2 spaceClose w fillTri :: Window -> Int -> Int -> Int -> IO () fillTri w x y size = drawInWindow w $ withColor Blue $ polygon [(x,y), (x + size, y), (x, y - size), (x, y)] minSize :: Int minSize = 8 sierpinskiTri :: Window -> Int -> Int -> Int -> IO () sierpinskiTri w x y size = if size <= minSize then fillTri w x y size else let size2 = size `div` 2 in do sierpinskiTri w x y size2 sierpinskiTri w x (y-size2) size2 sierpinskiTri w (x+size2) y size2 main3 = runGraphics $ do w <- openWindow "Sierpinski's Triangle" (windowSize, windowSize) drawInWindow w $ overGraphics [ (withColor Red $ text (1,1) "(0,0)") , (withColor Red $ text (1, windowSize) ("(0," ++ (show windowSize) ++ ")")) , (withColor Red $ text (windowSize+1, 1) ("("++(show windowSize) ++ ",0)")) , (withColor Red $ text (windowSize-1, windowSize-1) ("("++(show windowSize) ++ "," ++ (show windowSize) ++ ")")) , (withColor White $ polygon [(0,0), (0, windowSize), (windowSize, windowSize), (windowSize, 0)]) ] sierpinskiTri w 50 300 256 spaceClose w where windowSize = 400 snowflake :: Window -> IO () snowflake w = do drawTri w x y m 0 False -- draw first triangle w/flat top flake w x y m 0 True -- begin recursion to complete job where m = 81 x = 250 y = 250 flake :: Window -> Int -> Int -> Int -> Int -> Bool -> IO () flake w x y m c o = do drawTri w x y m c o -- draw second triangle let c1 = (c+1)`mod`5 -- get next color if (m<=3) then return () -- if too small, we're done else do flake w (x-2*m) (y-m) (m`div`3) c1 True -- NW flake w (x+2*m) (y-m) (m`div`3) c1 True -- NE flake w x (y+2*m) (m`div`3) c1 True -- S flake w (x-2*m) (y+m) (m`div`3) c1 False -- SW flake w (x+2*m) (y+m) (m`div`3) c1 False -- SE flake w x (y-2*m) (m`div`3) c1 False -- N drawTri :: Window -> Int -> Int -> Int -> Int -> Bool -> IO () drawTri w x y m c o = let colors = [ Magenta, Blue, Green, Red, Yellow ] d = (3*m) `div` 2 ps = if o then [(x,y-3*m), (x-3*m,y+d), (x+3*m,y+d)] -- side at bottom else [(x,y+3*m), (x-3*m,y-d), (x+3*m,y-d)] -- side at top in drawInWindow w (withColor (colors !! c) (polygon ps)) main4 = runGraphics $ do w <- openWindow "Snowflake Fractal" (windowSize,windowSize) drawInWindow w $ withColor White $ polygon [(0,0) ,(windowSize-1,0) ,(windowSize-1,windowSize-1) ,(0,windowSize-1)] snowflake w spaceClose w where windowSize = 500