View difference between Paste ID: cUmap2iS and 8EDsDXG4
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