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