/* 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;
}