1 #include <DrawingWindow.h>
2 #include <QApplication>
9 // nombre max d'itérations
11 // zone d'intérêt par défaut
21 const parameters initial_parameters = {
31 int check_point(parameters& p, double cr, double ci)
38 for (i = 0 ; zr2 + zi2 < 4 && i < p.maxiter; i++) {
39 zi = 2 * zr * zi + ci;
47 // int check_point(parameters& p, int x, int y)
49 // double cr = p.Rmin + x * p.Rscale;
50 // double ci = p.Imax - y * p.Iscale;
51 // return check_point(p, cr, ci);
54 void set_color(DrawingWindow& w, parameters& p, int i)
56 double rouge, vert, bleu;
58 rouge = vert = bleu = 0.0;
60 int ii = (p.maxiter - 1 - i) % 96;
68 rouge = (ii - 32) / 32.0;
73 vert = (ii - 64) / 32.0;
78 w.setColor(rouge, vert, bleu);
81 // Fonction de dessin de l'ensemble de Madelbrot, dans la zone
82 // spécifiée, et avec la précision souhgaitée.
83 void do_mandel(DrawingWindow& w, parameters& p)
85 int x, y; // le pixel considéré
86 double cr, ci; // le complexe correspondant
90 for (int k = kmax ; k != 0 ; k /= 2) {
92 double ar = k * p.Rscale;
93 double ai = k * p.Iscale;
95 for (x = 0 ; x < w.width ; x += k) {
97 for (y = 0 ; y < w.height ; y += k) {
98 if (x % kk != 0 || y % kk != 0 || k == kmax) {
99 int i = check_point(p, cr, ci);
105 w.fillRect(x, y, x + k - 1, y + k - 1);
109 w.drawPoint(x + 1, y);
110 w.drawPoint(x, y + 1);
111 w.drawPoint(x + 1, y + 1);
122 // Fonction de dessin principale, calcule la zone d'intérêt, appelle
123 // do_mandel(), pour dessiner l'ensemle, et permet le zoom.
124 void mandel(DrawingWindow &w)
126 parameters p = initial_parameters;
128 p.Rscale = (p.Rmax - p.Rmin) / (w.width - 1);
129 p.Iscale = (p.Imax - p.Imin) / (w.height - 1);
133 w.drawText(5, 5, "Cliquer sur l'image pour zoomer");
137 w.waitMousePress(x, y, button);
139 // calcul des coordonnées du point cliqué
140 double Tr = p.Rmin + x * p.Rscale;
141 double Ti = p.Imax - y * p.Rscale;
143 // calcul de la nouvelle zone d'intérêt :
144 // zoom ×2 en direction du point cliqué
146 double Rmin2 = p.Rmin / zoom;
147 double Rmax2 = p.Rmax / zoom;
148 double Imin2 = p.Imin / zoom;
149 double Imax2 = p.Imax / zoom;
150 double Rshift = Tr - (Rmin2 + Rmax2) / 2;
151 double Ishift = Ti - (Imin2 + Imax2) / 2;
157 // affichage d'un rectangle autour de la nouvelle zone d'intérêt
159 w.drawRect((Rmin2 - p.Rmin) / p.Rscale, (p.Imax - Imin2) / p.Iscale,
160 (Rmax2 - p.Rmin) / p.Rscale, (p.Imax - Imax2) / p.Iscale);
169 int main(int argc, char *argv[])
171 QApplication app(argc, argv);
172 DrawingWindow win(mandel, 800, 800);