Skip to content

Commit 59d7276

Browse files
Add Rössler, Aizawa, Sprott, Levy curve
1 parent a68e74e commit 59d7276

7 files changed

Lines changed: 333 additions & 25 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Explorateur de Fractales
22

3-
Application GitHub Pages qui rend 52 fractales en **WebAssembly**, dont le code de
3+
Application GitHub Pages qui rend 56 fractales en **WebAssembly**, dont le code de
44
calcul est entièrement écrit en **français** grâce au langage
55
[multilingual](https://github.com/johnsamuelwrites/multilingual).
66

@@ -26,9 +26,9 @@ françaises** dans `src/*.ml`.
2626
| Groupe | Fractales |
2727
|---|---|
2828
| Évasion | Mandelbrot, Julia, Burning Ship, Tricorn, Multibrot (n=3…8), Celtic, Buffalo, Perpendicular Burning Ship, Heart, Perpendicular Mandelbrot, Perpendicular Celtic, Duck, Buddhabrot |
29-
| Dynamique | Newton (z³−1), Phoenix, Lyapunov, Lyapunov multiséquence, Bassin de Newton généralisé, Orbitale de Nova, Collatz complexe, Attracteur de Clifford, Attracteur de Peter de Jong, Attracteur d'Ikeda, Attracteur de Hénon |
29+
| Dynamique | Newton (z³−1), Phoenix, Lyapunov, Lyapunov multiséquence, Bassin de Newton généralisé, Orbitale de Nova, Collatz complexe, Attracteur de Clifford, Attracteur de Peter de Jong, Attracteur d'Ikeda, Attracteur de Hénon, Attracteur de Lorenz, Attracteur de Rössler, Attracteur d'Aizawa, Attracteur de Sprott |
3030
| IFS | Barnsley (fougère), Sierpinski, Tapis de Sierpinski |
31-
| L-système | Koch (flocon de neige), Dragon de Heighway, Courbe de Gosper, Joint apollonien, Arbre de Pythagore |
31+
| L-système | Koch (flocon de neige), Dragon de Heighway, Courbe de Lévy C, Courbe de Gosper, Joint apollonien, Arbre de Pythagore |
3232
| Magnétiques | Magnet I, Magnet II, Magnet III, Lambda (logistique complexe), Lambda cubique, Magnet cosinus, Magnet sinus, Nova magnétique |
3333

3434
---

public/js/renderer.js

Lines changed: 149 additions & 17 deletions
Large diffs are not rendered by default.

scripts/compile_wasm.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ déf main():
220220
afficher(f" WAT ecrit : {SORTIE_WAT.relative_to(RACINE)}")
221221
afficher(f" WASM ecrit: {SORTIE_WASM.relative_to(RACINE)} ({longueur(octets_wasm):,} octets)")
222222
223-
soit exports_requises = ["mandelbrot", "julia", "burning_ship", "tricorn", "multibrot", "celtic", "buffalo", "perpendicular_burning_ship", "heart", "perpendicular_mandelbrot", "perpendicular_celtic", "duck", "buddhabrot", "newton", "phoenix", "lyapunov", "lyapunov_multisequence", "bassin_newton_generalise", "orbitale_de_nova", "collatz_complexe", "attracteur_de_clifford", "attracteur_de_peter_de_jong", "attracteur_ikeda", "attracteur_de_henon", "lorenz_attractor", "feigenbaum_tree", "barnsley", "sierpinski", "tapis_sierpinski", "menger_sponge", "mandelbulb", "tetraedre_sierpinski", "julia_quaternion", "mandelbox", "vicsek_fractal", "lichtenberg_figures", "koch", "dragon_heighway", "gosper_curve", "cantor_set", "triangle_de_cercles_recursifs", "apollonian_gasket", "t_square_fractal", "h_fractal", "hilbert_curve", "peano_curve", "arbre_pythagore", "magnet1", "magnet2", "magnet3", "lambda_fractale", "lambda_cubique", "magnet_cosinus", "magnet_sinus", "nova_magnetique", "interpoler_lineaire", "interpoler_logarithmique", "ajuster_iterations_export", "mandelbrot_classe"]
223+
soit exports_requises = ["mandelbrot", "julia", "burning_ship", "tricorn", "multibrot", "celtic", "buffalo", "perpendicular_burning_ship", "heart", "perpendicular_mandelbrot", "perpendicular_celtic", "duck", "buddhabrot", "newton", "phoenix", "lyapunov", "lyapunov_multisequence", "bassin_newton_generalise", "orbitale_de_nova", "collatz_complexe", "attracteur_de_clifford", "attracteur_de_peter_de_jong", "attracteur_ikeda", "attracteur_de_henon", "lorenz_attractor", "rossler_attractor", "aizawa_attractor", "sprott_attractor", "feigenbaum_tree", "barnsley", "sierpinski", "tapis_sierpinski", "menger_sponge", "mandelbulb", "tetraedre_sierpinski", "julia_quaternion", "mandelbox", "vicsek_fractal", "lichtenberg_figures", "koch", "dragon_heighway", "courbe_levy_c", "gosper_curve", "cantor_set", "triangle_de_cercles_recursifs", "apollonian_gasket", "t_square_fractal", "h_fractal", "hilbert_curve", "peano_curve", "arbre_pythagore", "magnet1", "magnet2", "magnet3", "lambda_fractale", "lambda_cubique", "magnet_cosinus", "magnet_sinus", "nova_magnetique", "interpoler_lineaire", "interpoler_logarithmique", "ajuster_iterations_export", "mandelbrot_classe"]
224224
valider_exports_wasm(octets_wasm, exports_requises)
225225
afficher(f" Exports valides: {', '.join(exports_requises)}")
226226

scripts/integration_checks.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
"attracteur_ikeda",
3939
"attracteur_de_henon",
4040
"lorenz_attractor",
41+
"rossler_attractor",
42+
"aizawa_attractor",
43+
"sprott_attractor",
4144
"feigenbaum_tree",
4245
"barnsley",
4346
"sierpinski",
@@ -51,6 +54,7 @@
5154
"lichtenberg_figures",
5255
"koch",
5356
"dragon_heighway",
57+
"courbe_levy_c",
5458
"gosper_curve",
5559
"cantor_set",
5660
"triangle_de_cercles_recursifs",

src/fractales_dynamique.ml

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,24 @@ déf projeter_lorenz_x(x, y, z):
416416
déf projeter_lorenz_y(x, y, z):
417417
retour (z - 26.0) * 0.07 - (x + y) * 0.02
418418

419+
déf projeter_rossler_x(x, y, z):
420+
retour x * 0.16 + z * 0.035
421+
422+
déf projeter_rossler_y(x, y, z):
423+
retour y * 0.16 - z * 0.04
424+
425+
déf projeter_aizawa_x(x, y, z):
426+
retour x * 0.18 + z * 0.03
427+
428+
déf projeter_aizawa_y(x, y, z):
429+
retour y * 0.18 - z * 0.055
430+
431+
déf projeter_sprott_x(x, y, z):
432+
retour x * 0.19 + z * 0.045
433+
434+
déf projeter_sprott_y(x, y, z):
435+
retour y * 0.18 - z * 0.03
436+
419437
déf lorenz_attractor(cx, cy, max_iter):
420438
soit sigma = 10.0
421439
soit rho = 28.0
@@ -452,6 +470,127 @@ déf lorenz_attractor(cx, cy, max_iter):
452470
retour max_iter
453471
retour score
454472

473+
déf rossler_attractor(cx, cy, max_iter):
474+
soit a = 0.2
475+
soit b = 0.2
476+
soit c = 5.7
477+
soit dt = 0.02
478+
soit x = 0.1
479+
soit y = 0.0
480+
soit z = 0.0
481+
soit meilleur = 1.0e9
482+
soit iter_lim = max_iter
483+
si iter_lim > 560.0:
484+
iter_lim = 560.0
485+
soit iter = 0.0
486+
487+
tantque iter < iter_lim:
488+
soit dx = -y - z
489+
soit dy = x + a * y
490+
soit dz = b + z * (x - c)
491+
x = x + dx * dt
492+
y = y + dy * dt
493+
z = z + dz * dt
494+
si iter > 40.0:
495+
soit px = projeter_rossler_x(x, y, z)
496+
soit py = projeter_rossler_y(x, y, z)
497+
soit distance = (px - cx) * (px - cx) + (py - cy) * (py - cy)
498+
si distance < meilleur:
499+
meilleur = distance
500+
si x * x + y * y + z * z > 4096.0:
501+
x = 0.1
502+
y = 0.0
503+
z = 0.0
504+
iter = iter + 1.0
505+
506+
soit score = max_iter - meilleur * 520.0
507+
si score < 0.0:
508+
retour 0.0
509+
si score > max_iter:
510+
retour max_iter
511+
retour score
512+
513+
déf aizawa_attractor(cx, cy, max_iter):
514+
soit a = 0.95
515+
soit b = 0.7
516+
soit c = 0.6
517+
soit d = 3.5
518+
soit e = 0.25
519+
soit f = 0.1
520+
soit dt = 0.008
521+
soit x = 0.1
522+
soit y = 0.0
523+
soit z = 0.0
524+
soit meilleur = 1.0e9
525+
soit iter_lim = max_iter
526+
si iter_lim > 720.0:
527+
iter_lim = 720.0
528+
soit iter = 0.0
529+
530+
tantque iter < iter_lim:
531+
soit r2 = x * x + y * y
532+
soit dx = (z - b) * x - d * y
533+
soit dy = d * x + (z - b) * y
534+
soit dz = c + a * z - (z * z * z) / 3.0 - r2 * (1.0 + e * z) + f * z * x * x * x
535+
x = x + dx * dt
536+
y = y + dy * dt
537+
z = z + dz * dt
538+
si iter > 70.0:
539+
soit px = projeter_aizawa_x(x, y, z)
540+
soit py = projeter_aizawa_y(x, y, z)
541+
soit distance = (px - cx) * (px - cx) + (py - cy) * (py - cy)
542+
si distance < meilleur:
543+
meilleur = distance
544+
si x * x + y * y + z * z > 4096.0:
545+
x = 0.1
546+
y = 0.0
547+
z = 0.0
548+
iter = iter + 1.0
549+
550+
soit score = max_iter - meilleur * 540.0
551+
si score < 0.0:
552+
retour 0.0
553+
si score > max_iter:
554+
retour max_iter
555+
retour score
556+
557+
déf sprott_attractor(cx, cy, max_iter):
558+
soit dt = 0.04
559+
soit x = 0.2
560+
soit y = 0.1
561+
soit z = 0.1
562+
soit meilleur = 1.0e9
563+
soit iter_lim = max_iter
564+
si iter_lim > 520.0:
565+
iter_lim = 520.0
566+
soit iter = 0.0
567+
568+
tantque iter < iter_lim:
569+
soit dx = y * z
570+
soit dy = x - y
571+
soit dz = 1.0 - x * y
572+
x = x + dx * dt
573+
y = y + dy * dt
574+
z = z + dz * dt
575+
si iter > 32.0:
576+
soit px = projeter_sprott_x(x, y, z)
577+
soit py = projeter_sprott_y(x, y, z)
578+
soit distance = (px - cx) * (px - cx) + (py - cy) * (py - cy)
579+
si distance < meilleur:
580+
meilleur = distance
581+
si x * x + y * y + z * z > 4096.0:
582+
x = 0.2
583+
y = 0.1
584+
z = 0.1
585+
iter = iter + 1.0
586+
587+
soit score = max_iter - meilleur * 520.0
588+
si score < 0.0:
589+
retour 0.0
590+
si score > max_iter:
591+
retour max_iter
592+
retour score
593+
455594
déf feigenbaum_tree(cx, cy, max_iter):
456595
soit r = 3.4 + (cx + 1.0) * 0.3
457596
soit x = 0.5

src/fractales_lsystem.ml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,39 @@ déf dragon_heighway(cx, cy, max_iter):
8080
retour 6.0
8181
retour score
8282

83+
déf courbe_levy_c(cx, cy, max_iter):
84+
soit x = cx
85+
soit y = cy
86+
soit dist = abs_koch(x) + abs_koch(y)
87+
soit niveau = 0.0
88+
soit echelle = 1.0
89+
soit nmax = min_koch(max_iter, 14.0)
90+
soit inv_racine2 = 0.70710678118
91+
92+
tantque niveau < nmax:
93+
soit somme = x + y
94+
soit diff = y - x
95+
soit branche = niveau % 2.0
96+
si branche == 0.0:
97+
x = (somme - 0.5) * inv_racine2
98+
y = diff * inv_racine2
99+
sinon:
100+
x = (somme + 0.5) * inv_racine2
101+
y = diff * inv_racine2
102+
soit d = (abs_koch(y) + abs_koch(abs_koch(x) - 0.18)) / echelle
103+
si d < dist:
104+
dist = d
105+
echelle = echelle * 1.41421356237
106+
niveau = niveau + 1.0
107+
108+
soit seuil = 0.028
109+
si dist < seuil:
110+
retour max_iter * 0.91
111+
soit score = max_iter * 0.9 - (dist / (seuil * 10.0)) * (max_iter * 0.9)
112+
si score < 6.0:
113+
retour 6.0
114+
retour score
115+
83116
déf gosper_curve(cx, cy, max_iter):
84117
soit x = cx
85118
soit y = cy

src/main.ml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ importer fractales_classes_compat
1616
importer fractales_classes
1717

1818
soit MODES_EVASION = ["mandelbrot", "julia", "burning_ship", "tricorn", "multibrot", "celtic", "buffalo", "perpendicular_burning_ship", "heart", "perpendicular_mandelbrot", "perpendicular_celtic", "duck", "buddhabrot"]
19-
soit MODES_DYNAMIQUE = ["newton", "phoenix", "lyapunov", "lyapunov_multisequence", "bassin_newton_generalise", "orbitale_de_nova", "collatz_complexe", "attracteur_de_clifford", "attracteur_de_peter_de_jong", "attracteur_ikeda", "attracteur_de_henon", "lorenz_attractor", "feigenbaum_tree"]
19+
soit MODES_DYNAMIQUE = ["newton", "phoenix", "lyapunov", "lyapunov_multisequence", "bassin_newton_generalise", "orbitale_de_nova", "collatz_complexe", "attracteur_de_clifford", "attracteur_de_peter_de_jong", "attracteur_ikeda", "attracteur_de_henon", "lorenz_attractor", "rossler_attractor", "aizawa_attractor", "sprott_attractor", "feigenbaum_tree"]
2020
soit MODES_IFS = ["barnsley", "sierpinski", "tapis_sierpinski", "menger_sponge", "mandelbulb", "vicsek_fractal", "lichtenberg_figures", "tetraedre_sierpinski", "julia_quaternion", "mandelbox"]
2121
soit MODES_3D = ["tetraedre_sierpinski", "julia_quaternion", "mandelbox"]
22-
soit MODES_LSYSTEM = ["koch", "dragon_heighway", "gosper_curve", "cantor_set", "triangle_de_cercles_recursifs", "apollonian_gasket", "t_square_fractal", "h_fractal", "hilbert_curve", "peano_curve", "arbre_pythagore"]
22+
soit MODES_LSYSTEM = ["koch", "dragon_heighway", "courbe_levy_c", "gosper_curve", "cantor_set", "triangle_de_cercles_recursifs", "apollonian_gasket", "t_square_fractal", "h_fractal", "hilbert_curve", "peano_curve", "arbre_pythagore"]
2323
soit MODES_MAGNETIQUE = ["magnet1", "magnet2", "magnet3", "lambda_fractale", "lambda_cubique", "magnet_cosinus", "magnet_sinus", "nova_magnetique"]
2424
soit MODES_CLASSES_COMPAT = ["mandelbrot_classe"]
2525
affirmer longueur(MODES_EVASION) == 13
26-
affirmer longueur(MODES_DYNAMIQUE) == 13
26+
affirmer longueur(MODES_DYNAMIQUE) == 16
2727
affirmer longueur(MODES_IFS) == 10
2828
affirmer longueur(MODES_3D) == 3
29-
affirmer longueur(MODES_LSYSTEM) == 10
29+
affirmer longueur(MODES_LSYSTEM) == 12
3030
affirmer longueur(MODES_MAGNETIQUE) == 8
3131
affirmer longueur(MODES_CLASSES_COMPAT) == 1

0 commit comments

Comments
 (0)