program Fractal;

{$N+} {Benutze Nummerischen Corproessor}

uses Graph,Dos,Crt;

const C = 8.0; {Abbruchbedingung auch anderer Werte (2.818.... mglich}

var   Links,Rechts,Oben,Unten : Double;
    Iteration,Farbe         : Integer;
    X,Y,Dx,Dy  : Double;
    Xp,Yp      : Integer;
    Driver,Mode: Integer;
    Pfad       : string[30];
    Taste      : Char;
    Start      : Double;

function Rechne(Re,Im:Double) : Integer;

var Reel,Imag : Double;
    Farbe     : Integer;
begin
  for Farbe:=0 to Iteration do
  begin
    Reel:=Re*Re;Imag:=Im*Im;
    if Reel+Imag>C then begin Rechne:=Farbe; Exit; end; {Abbruch}
    Im:=Im*Re*2-Y;
    Re:=Reel-Imag-X;
  end;
  Rechne:=-1; {Schwarz}
end;

function Time : Double; {holt Uhrzeit}

var Std,Min,Sec,Hsec : Word;

begin
  Gettime(Std,Min,Sec,Hsec);
  Time:=3600.0*Std+60.0*Min+Sec+Hsec/100.0;
end;


{******************************************************************************************}
{**********                                                               *****************}
{**********                   Haupt Programm Fractal                      *****************}
{**********                                                               *****************}
{******************************************************************************************}

begin
  Driver:=Vga; Mode:=Vgahi;
  Pfad:='C:\TP\BGI';
  Write('oben   :  ');ReadLn(Oben);
  Write('unten  :  ');ReadLn(Unten);
  Write('Links  :  ');ReadLn(Links);
  Write('Rechts :  ');ReadLn(Rechts);
  Write('Iteration : ');ReadLn(Iteration);
  Initgraph(Driver,Mode,Pfad);
  Dx:=(Rechts-Links)/Getmaxx;
  Dy:=(Oben-Unten)/Getmaxy;
  Start:=Time;
  Y:=Oben;
  for Yp:=0 to Getmaxy do
  begin
    X:=Links;
    for Xp:=0 to Getmaxx do
    begin
      Farbe:=Rechne(X,Y);
      if Farbe>=0 then Farbe:=(Farbe mod 15)+1 else Farbe:=0;
      Putpixel(Xp,Yp,Farbe);
      X:=X+Dx;
    end;
    Y:=Y-Dy;
  end;
  Start:=Time-Start;
  repeat until KeyPressed; {Benutzer soll auch die Grafik anschauen drfen...}
  Closegraph;
  WriteLn(Start:6:2,' Sekunden');
end.
