/* Programma per disegnare l'insieme di Mandelbrot */ /* Autore: Pino Navato <pnavato@libero.it> */ #include <graphics.h> #include <conio.h> typedef double Tfloat; /* Tipo delle variabili floating point */ const char* PATH_TO_BGI = "c:\\tc\\bgi"; const Tfloat INFX = -2, SUPX = 2, /* Porzione di piano complesso */ INFY = -2, SUPY = 2; /* da visualizzare */ const unsigned MAXCONT = 61, /* Max num. di ripetizioni del ciclo WHILE */ SHIFT_COL = 7; /* Cambia questa costante per... */ /* ...modificare tutti i colori */ Tfloat cre, cim; /* Parte reale e immaginaria di c */ Tfloat zre, zim; /* Parte reale e immaginaria di z */ Tfloat temp_zre; /* Variabile temporanea per Zre */ Tfloat latox, /* Largh. del rettangolo di piano considerato */ latoy; /* Altezza del rettangolo di piano considerato */ Tfloat incremx, /* Distanza orizz. tra due punti consecutivi */ incremy; /* Distanza vert. tra due punti consecutivi */ unsigned i, j; /* Coordinate di un pixel */ unsigned col; /* Colore scelto per il pixel esaminato */ unsigned contatore; /* Numero di ripetizioni del ciclo WHILE */ int gd, gm; int err_code; int main(void) { gd = DETECT; initgraph(&gd, &gm, PATH_TO_BGI); err_code = graphresult(); if (err_code != grOk) { cprintf("%s\n", grapherrormsg(err_code)); return 1; } latox = SUPX - INFX; latoy = SUPY - INFY; incremx = latox/getmaxx(); incremy = latoy/getmaxy(); for (i=0; i<=getmaxx(); i++) /* Esamina tutte le colonne dello schermo */ { cre = INFX + (i*incremx); for (j=0; j<=getmaxy(); j++) /* Esamina i pixel della colonna iesima */ { contatore = 0; zim = zre = 0; cim = INFY + (j*incremy); if (cre>-0.49 && cim>-0.5 && cre<0.21 && cim<0.5) contatore = MAXCONT; while (zre*zre + zim*zim <= 4.00 && /* Applica la legge */ contatore < MAXCONT) /* di Mandelbrot */ { temp_zre = zre*zre - zim*zim + cre; zim = 2*zim*zre + cim; zre = temp_zre; contatore++; } /* while */ col = contatore + SHIFT_COL; putpixel(i,j, col); /* <-- Finalmente! */ } /* for j */ while (kbhit()) /* Eventuale uscita anticipata */ if (getch() == 27) /* Per uscire premere ESC */ { closegraph(); return 0; } } /* for i */ while (kbhit()) getch(); /* Svuota il buffer */ getch(); /* Attende un carattere */ closegraph(); return 0; }
Torna alla pagina sui frattali