Program Mandelbrot;
{$B-,E+,G+,N+,Q-,R-,S-,X+}

uses  Graph, CRT;

type  Tfloat = double;        { Tipo delle variabili floating point }

const PATH_TO_BGI = 'c:\bp\bgi';

      INFX = -2;  SUPX = 2;   { Porzione di piano complesso }
      INFY = -2;  SUPY = 2;   {       da visualizzare       }

      MAXCONT   = 61;   { Max num. di ripetizioni del ciclo WHILE }
      SHIFT_COL = 7;    { Cambia questa costante per... }
                        { ...modificare tutti i colori  }

var   cre, cim  : Tfloat;    { Parte reale e immaginaria di c }
      zre, zim  : Tfloat;    { Parte reale e immaginaria di z }
      temp_zre  : Tfloat;    { Variabile temporanea per Zre }
      latox,                 { Largh. del rettangolo di piano considerato }
      latoy     : Tfloat;    { Altezza del rettangolo di piano considerato }
      incremx,               { Distanza orizz. tra due punti consecutivi }
      incremy   : Tfloat;    { Distanza vert. tra due punti consecutivi }
      i, j      : word;      { Coordinate di un pixel }
      col       : word;      { Colore scelto per il pixel esaminato }
      contatore : word;      { Numero di ripetizioni del ciclo WHILE }

      gd, gm    : integer;
      err_code  : integer;


begin
   gd := Detect;
   InitGraph(gd, gm, PATH_TO_BGI);
   err_code := GraphResult;
   if err_code <> grOK then
      begin
         Writeln(GraphErrorMsg(err_code));
         halt(1)
      end;

   latox := SUPX - INFX;   latoy := SUPY - INFY;
   incremx := latox/GetMaxX;   incremy := latoy/GetMaxY;

   for i := 0 to GetMaxX do   { Esamina tutte le colonne dello schermo }
      begin
         cre := INFX + (i*incremx);
         for j := 0 to GetMaxY do   { Esamina i pixel della colonna iesima }
            begin
               contatore := 0;
               zim := 0;   zre := 0;
               cim := INFY + (j*incremy);

               if (cre>-0.49) and (cim>-0.5) and (cre<0.21) and (cim<0.5) then 
                  contatore := MAXCONT;

               while (sqr(zre) + sqr(zim) <= 4.00) and    { Applica la legge }
                     (contatore < MAXCONT) do             {  di  Mandelbrot  }
                  begin
                     temp_zre := sqr(zre) - sqr(zim) + cre;
                     zim := 2*zim*zre + cim;
                     zre := temp_zre;
                     inc(contatore)
                  end;  { while }

               col := contatore + SHIFT_COL;
               PutPixel(i,j, col)   { <-- Finalmente! }
            end;  { For j }

         while KeyPressed do      { Eventuale uscita anticipata }
            if ReadKey = #27 then    { Per uscire premere ESC }
               begin
                  CloseGraph;
                  halt
               end;

      end;  { For i }

   while KeyPressed do ReadKey;   { Svuota il buffer }
   ReadKey;                       { Attende un carattere }
   CloseGraph
end.


Torna alla pagina sui frattali