1 #include <DrawingWindow.h>
2 #include <QApplication>
5 void do_mandel(DrawingWindow &w,
6 double Rmin, double Rmax, double Imin, double Imax,
9 int x, y; // le pixel considéré
10 double cr, ci; // le complexe correspondant
11 double zr, zi; // pour calculer la suite
13 double pr, pi; // taille d'un pixel
14 double rouge, vert, bleu;
17 pr = (Rmax - Rmin) / w.width;
18 pi = (Imax - Imin) / w.height;
21 for (x = 0; x < w.width; x++) {
23 for (y = 0; y < w.height; y++) {
27 for (i = 1; i <= maxiter; i++) {
31 /* |z| >= 2 : on sort de la boucle */
34 /* on calcule le z suivant */
39 rouge = vert = bleu = 0.0;
41 /* on est sorti trop tôt du for(...): on affiche le pixel
42 d'un couleur en fonction de i */
43 int ii = (maxiter - i) % 96;
51 rouge = (ii - 32) / 32.0;
56 vert = (ii - 64) / 32.0;
61 w.setColor(rouge, vert, bleu);
70 void mandel(DrawingWindow &w)
72 /* nombre max d'itérations */
74 /* zone d'intérêt par défaut */
84 std::cout << "[ " << Rmin
85 << (Imin >= 0.0 ? " + " : " - ")
86 << (Imin >= 0.0 ? Imin : -Imin)
88 << (Imax >= 0.0 ? " + " : " - ")
89 << (Imax >= 0.0 ? Imax : -Imax)
90 << " i ] (" << maxiter << ")"
93 do_mandel(w, Rmin, Rmax, Imin, Imax, maxiter);
97 std::cout << "-=[ Cliquer sur l'image pour zoomer ]=-" << std::endl;
98 w.waitMousePress(x, y, button);
99 Tr = Rmin + x * (Rmax - Rmin) / w.width;
100 Ti = Imax - y * (Imax - Imin) / w.height;
101 std::cout << "(" << x << ";" << y << ") -> ("
102 << Tr << ";" << Ti << ")" << std::endl;
104 double Rmin2 = Rmin / 2;
105 double Rmax2 = Rmax / 2;
106 double Imin2 = Imin / 2;
107 double Imax2 = Imax / 2;
108 double Rdecal = Tr - (Rmin2 + Rmax2) / 2;
109 double Idecal = Ti - (Imin2 + Imax2) / 2;
115 double x_factor = w.width / (Rmax - Rmin);
116 double y_factor = w.height / (Imax - Imin);
118 w.drawRect((Rmin2 - Rmin) * x_factor, (Imax - Imin2) * y_factor,
119 (Rmax2 - Rmin) * x_factor, (Imax - Imax2) * y_factor);
128 int main(int argc, char *argv[])
130 QApplication app(argc, argv);
131 DrawingWindow win(mandel, 800, 800);