SHOW:
|
|
- or go back to the newest paste.
| 1 | module Main where | |
| 2 | import SOE | |
| 3 | ||
| 4 | spaceClose :: Window -> IO () | |
| 5 | spaceClose w = do | |
| 6 | k <- getKeyEx w True | |
| 7 | if k == ' ' | |
| 8 | then closeWindow w | |
| 9 | else spaceClose w | |
| 10 | ||
| 11 | --dir: 1 - Up, -1 - down | |
| 12 | equiTriCorners :: (Int, Int) -> Int -> Int -> ((Int, Int), (Int, Int), (Int, Int)) | |
| 13 | equiTriCorners (x, y) r dir = | |
| 14 | (a, b, c) | |
| 15 | where | |
| 16 | a = (x, y + dir * r) | |
| 17 | b = (x - xshift, y - dir * halfr) | |
| 18 | c = (x + xshift, y - dir * halfr) | |
| 19 | xshift = round $ 0.5 * rr * (sqrt 3) :: Int | |
| 20 | halfr = round $ rr / 2 | |
| 21 | rr = (fromIntegral r :: Double) | |
| 22 | ||
| 23 | equiTri :: Window -> (Int, Int) -> Int -> Int -> IO () | |
| 24 | equiTri w cent r dir = | |
| 25 | drawInWindow w (polyline [a, b, c, a]) | |
| 26 | where | |
| 27 | (a, b, c) = equiTriCorners cent r dir | |
| 28 | ||
| 29 | decRate :: Int | |
| 30 | decRate = 3 | |
| 31 | minSize :: Int | |
| 32 | minSize = 9 | |
| 33 | ||
| 34 | snowFlakeFract :: Window -> (Int, Int) -> Int -> IO () | |
| 35 | snowFlakeFract w c r = do | |
| 36 | equiTri w c r 1 | |
| 37 | equiTri w c r (-1) | |
| 38 | if r >= minSize | |
| 39 | then do | |
| 40 | snowFlakeFract w a (r `div` decRate) | |
| 41 | snowFlakeFract w b (r `div` decRate) | |
| 42 | snowFlakeFract w g (r `div` decRate) | |
| 43 | snowFlakeFract w d (r `div` decRate) | |
| 44 | snowFlakeFract w e (r `div` decRate) | |
| 45 | snowFlakeFract w f (r `div` decRate) | |
| 46 | else | |
| 47 | return () | |
| 48 | where | |
| 49 | (a, b, g) = equiTriCorners c r 1 | |
| 50 | (d, e, f) = equiTriCorners c r (-1) | |
| 51 | ||
| 52 | main = runGraphics $ do | |
| 53 | - | w <- openWindow "Snowflake Fractal" (600,600) |
| 53 | + | w <- openWindow "Avtor - Petuh!" (600,600) |
| 54 | snowFlakeFract w (300, 300) 180 | |
| 55 | spaceClose w |