-
Notifications
You must be signed in to change notification settings - Fork 0
/
fractal.c
159 lines (147 loc) · 4.65 KB
/
fractal.c
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* mandel.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jgourdin <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/09/21 02:05:51 by jgourdin #+# #+# */
/* Updated: 2017/10/18 04:49:31 by jgourdin ### ########.fr */
/* */
/* ************************************************************************** */
#include "fractol.h"
/*
** La fractale de Mandelbrot est defini par Z(n+1) = Z(n^2) + C
** Z = a + ib, ou a et b sont semblable a : x et y.
** Z + Z' = (a + a') + i(b + b')
** En fait on etudie l'itteration de cette suite dans le cas ou Z0 = 0
** Les valeurs de C ou l'ensemble de Mandelbrot ne tend pas vers l'infini sont
** d'un couleur differente
** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
** Pour Julia on donne a C une valeurs constante dans la suite de Mandelbrot
** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
** Pour BurningShip en donne prend la valeur absolue de la partie reelles et
** immaginaire de Zn avant l'elevation au carre.
** La fonction fabs donne la valeurs absolue.
** Sa formule original est z ^ 2 + c
*/
void ft_burningship(int x, int y, t_fract *env)
{
if (BASEX == 0)
BASEX = -0.5;
C_R = 1.5 * (x - WIDTH / 2) / (0.5 * ZOOM * WIDTH) + BASEX;
C_I = 1.5 * (y - HEIGHT / 2) / (0.5 * ZOOM * HEIGHT) + BASEY;
Z_R = 0;
Z_I = 0;
I = -1;
while (Z_R * Z_R + Z_I * Z_I < 4 && ++I < ITT)
{
TMPR = Z_R;
TMPI = Z_I;
Z_R = (TMPR * TMPR) - (TMPI * TMPI) + C_R;
Z_I = 2 * fabs(TMPR * TMPI) + C_I;
}
}
/*
** La valeur de C initial de C est completement arbitraire mais est contenu dans
** la fractale de Mandelbrot. Soit entre -2.1 et 0.6
** sur l'abscisse et -1.2 et 1.2 sur l'ordonnee.
*/
void ft_julia(int x, int y, t_fract *env)
{
if (C_R == 0)
{
C_R = -0.7 + BASEX;
C_I = 0.27 + BASEY;
}
Z_R = 1.5 * (x - WIDTH / 2) / (0.5 * ZOOM * WIDTH) + BASEX;
Z_I = (y - HEIGHT / 2) / (0.5 * ZOOM * HEIGHT) + BASEY;
I = -1;
while (Z_R * Z_R + Z_I * Z_I < 4 && ++I < ITT)
{
TMPR = Z_R;
TMPI = Z_I;
Z_R = TMPR * TMPR - TMPI * TMPI + C_R;
Z_I = 2 * TMPI * TMPR + C_I;
}
}
/*
** Bon, on va un peu expliquer comment on a pu passer de la suite
** a cet algorithme.
** Nous avons cree deux variable pour C et Z. Partie Reel et partie Immaginaire.
** En premier lieu on set au depart BASEX a -0.5
** pour decaller la fractale vers la droite
** On fait dependre C_R et C_I de x et y par rapport a la taille de
** la fenetre et du ZOOM
** pour avoir une image qui s'affiche bien belle toussa.
** On peut trouver que Z_R = (Z_R ^ 2) - (Z_I ^ 2) + C_R.
** Et Z_I = 2 * Z_R * Z_I + C_I.
** On va voir a chaque fois si a un nombre d'itteration raisonnable
** la suite depasse 2.
** Ici 4 car on regarde leur valeurs absolue soit (Z_R ^ 2) + (Z_I ^ 2) < 4.
** On creer des variable tampon, TMPR et TMPI. Voila Voila.
*/
void ft_mandel(int x, int y, t_fract *env)
{
if (BASEX == 0)
BASEX = -0.5;
C_R = 1.5 * (x - WIDTH / 2) / (0.5 * ZOOM * WIDTH) + BASEX;
C_I = (y - HEIGHT / 2) / (0.5 * ZOOM * HEIGHT) + BASEY;
Z_R = 0;
Z_I = 0;
I = -1;
while (Z_R * Z_R + Z_I * Z_I < 4 && ++I < ITT)
{
TMPR = Z_R;
TMPI = Z_I;
Z_R = TMPR * TMPR - TMPI * TMPI + C_R;
Z_I = 2 * TMPI * TMPR + C_I;
}
}
/*
** La selection de la fractale a afficher.
*/
void ft_select(int x, int y, t_fract *env)
{
if (FLAG == 1)
ft_mandel(x, y, env);
else if (FLAG == 2)
ft_julia(x, y, env);
else if (FLAG == 3)
ft_burningship(x, y, env);
else if (FLAG == 4)
birdofprey(x, y, env);
else if (FLAG == 5)
burning_turn_down(x, y, env);
else if (FLAG == 6)
juliabird(x, y, env);
else
{
ft_putstr("Julia/Mandelbrot/ModBurn/Burning_Ship/BirdOfPrey/JuliaBird");
exit(42);
}
}
/*
** On fait tourner la machine pour tous les points de l'image et on les dessine
** en fonction de l'itteration.
*/
void lauch_factory(t_fract *env)
{
int x;
int y;
DATA = mlx_get_data_addr(IMAGE, &BPP, &SIZE, &ENDIAN);
y = -1;
while (++y < HEIGHT)
{
x = -1;
while (++x < WIDTH)
{
ft_select(x, y, env);
pixel_to_image(x, y, env);
}
}
mlx_put_image_to_window(INIT, WIN, IMAGE, 0, 0);
ft_hud(env);
T_TIME = TIME / CLOCKS_PER_SEC * 10;
TIME = clock();
}