Bonjour,
Voici un petit bout de code sensé dessiner "fern" bien connu.
Hélas il ne dessine que ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 import Data.Monoid import System.IO import System.Random import Graphics.Gloss main = do let f = mkStdGen 17 let [e] = take 1 (randomStuff f) let g = e affiche g main affiche g = display (InWindow "Fougere - Fern" -- window title (513, 375) -- window size (10, 10)) -- window position black -- background color (picture g) -- picture to display Au picture g = pictures (listOfPointsq n g a c r w x y p q) where n = 60000 a = 0 c = -1 r = sqrt(2*(1/sqrt(2))^2) :: Float w = (atan(1)) :: Float x = 1/sqrt(2) y = 1/sqrt(2) p = r*cos(w - c/6 * pi/2) q = r*sin(w - c/6 * pi/2) listOfPoints 0 _ _ _ _ _ _ _ _ _ = [] listOfPoints n g a c r w x y p q = point : listOfPoints (n-1) g' a' c' r' w' x' y' p' q' where g' = g a' = (g' !! (n-1))/10 c' = calcc c n r' = sqrt(x*x+y*y) w' = calcw x y p' = calcp c' r' w' q' = calcq c' r' w' x' = choix a' r' p' q' y' = choiy a' r' p' q' point = translate (x') (y'-150) (color (green) (circle 1.0)) calcp c' r' w' |w' < 0 = -r'*cos(w' - c'/6*pi/2) |w' >= 0 = r'*cos(w' - c'/6*pi/2) |otherwise = r'*cos(w' - c'/6*pi/2) calcq c' r' w' |w' < 0 = -r'*sin(w' - c'/6*pi/2) |w' >= 0 = r'*sin(w' - c'/6*pi/2) |otherwise = r'*sin(w' - c'/6*pi/2) calcw x y |x /= 0 && y /= 0 = (atan(y/x)) |x == 0 && y == 0 = 0 |x == 0 && y /= 0 = 0 calcc c n |(n-1)`mod`2 == 0 = -1 |otherwise = 1 choix a' r' p' q' |a' > 0.15 = 0.85 * p' + 0.04 * q' |a' <= 0.15 && a' > 0.07 = -0.15 * p' + 0.28 * q' |a' <= 0.07 && a' > 0.01 = 0.2 * p' - 0.26 * q' |a' <= 0.01 = 0 choiy a' r' p' q' |a' > 0.15 = -0.04 * p' + 0.85 * q' + 1.6 |a' <= 0.15 && a' > 0.07 = 0.26 * p' + 024 * q' + 0.44 |a' <= 0.07 && a' > 0.01 = 0.23 * p' + 0.22 * q' + 1.6 |a' <= 0.01 = 0.16 * q' randomStuff :: RandomGen f => f -> [[Float]] randomStuff f = work (randomRs ( 0.0, 10.0) f) work :: [Float] -> [[Float]] work (r:rs) = let n = truncate (r * 10.0) + 60000 (xs,ys) = splitAt n rs in xs : work ys
Si j'enlève odtherwise dans le calcul de p' ou q' j'ai le message :
<interactive>: Fern1.hs48,1)-(50,41): Non-exhaustive patterns in function calcp
De plus si j'ajoute otherwise dans le calcul du w' j'ai ça :
[ATTACH=CONFIG]173977[/ATTACH
Donc le cas otherwise existe!
A quoi correspondent ces otherwise après <0 et >= 0 ?; non déterminé ?. Portant tout est déterminé,alors je ne trouve pas.
Partager