Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Main where
- import SOE
- spaceClose :: Window -> IO ()
- spaceClose w = do
- k <- getKeyEx w True
- if k == ' '
- then closeWindow w
- else spaceClose w
- --dir: 1 - Up, -1 - down
- equiTriCorners :: (Int, Int) -> Int -> Int -> ((Int, Int), (Int, Int), (Int, Int))
- equiTriCorners (x, y) r dir =
- (a, b, c)
- where
- a = (x, y + dir * r)
- b = (x - xshift, y - dir * halfr)
- c = (x + xshift, y - dir * halfr)
- xshift = round $ 0.5 * rr * (sqrt 3) :: Int
- halfr = round $ rr / 2
- rr = (fromIntegral r :: Double)
- equiTri :: Window -> (Int, Int) -> Int -> Int -> IO ()
- equiTri w cent r dir =
- drawInWindow w (polyline [a, b, c, a])
- where
- (a, b, c) = equiTriCorners cent r dir
- decRate :: Int
- decRate = 3
- minSize :: Int
- minSize = 9
- snowFlakeFract :: Window -> (Int, Int) -> Int -> IO ()
- snowFlakeFract w c r = do
- equiTri w c r 1
- equiTri w c r (-1)
- if r >= minSize
- then do
- snowFlakeFract w a (r `div` decRate)
- snowFlakeFract w b (r `div` decRate)
- snowFlakeFract w g (r `div` decRate)
- snowFlakeFract w d (r `div` decRate)
- snowFlakeFract w e (r `div` decRate)
- snowFlakeFract w f (r `div` decRate)
- else
- return ()
- where
- (a, b, g) = equiTriCorners c r 1
- (d, e, f) = equiTriCorners c r (-1)
- main = runGraphics $ do
- w <- openWindow "Snowflake Fractal" (600,600)
- snowFlakeFract w (300, 300) 180
- spaceClose w
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement