{ kod zrodlowy znaleziony w internecie, nie moge niestety dotrzec 
do autora, jesli takowy jest, prosze o kontakt}
program zbior_julii;

uses graph,crt;

type
DaneEkranu = Record
        x,y: integer;
        kolor: byte;
        end;

DaneR2 = Record
        x,y: real;
        end;

var max: DaneEkranu;
    ldpunkt,pgpunkt: DaneR2;
    dx,dy: real;

const
   warkryt=4;
   maxiter=150;
   c:daneR2 = (x:-0.766227;y:0.09699);

procedure inicjujgrafike;
var i,j: integer;
begin
   i:=detect;
   initgraph(i,j,'e:\dos\pascal\bgi');
   if graphresult <> 0 then halt;
   with max do begin
   x:=getmaxx;
   y:=getmaxy;
   kolor:=getmaxcolor;
   end;
end;

procedure wyznaczobszarwykresu;
begin
writeln('Podaj zakres wspolrzednych X i Y wykresu:');
write(' minimalna wartosc X = '); readln(ldpunkt.x);
write(' maksymalna wartosc X = '); readln(pgpunkt.x);
write(' minimalna wartosc Y = '); readln(ldpunkt.y);
write(' maksymalna wartosc Y = '); readln(pgpunkt.y);
end;

procedure wyznaczdxdy(var dx,dy: real);
begin
   dx:=(pgpunkt.x-ldpunkt.x)/max.x;
   dy:=(pgpunkt.y-ldpunkt.y)/max.y;
end;

function iteruj(x,y: real): byte;
var x2,y2,p,q,u: real;
    k: byte;
begin
k:=0;
p:=C.x;
q:=C.y;
repeat
   x2:=x*x;
   y2:=y*y;
   u:=x*y;
   x:=x2-y2+p;
   y:=2*u+q;
   inc(k);
until ((x2+y2)>=warkryt) or (k>=maxiter);
iteruj:=(k mod max.kolor);
end;

procedure rysujfraktal;
var i,j,kolor: integer;
begin
for i:=0 to max.x-1 do
   for j:=0 to max.y-1 do
   begin
   kolor:=iteruj(ldpunkt.x + i*dx,ldpunkt.y + j*dy);
   putpixel(i,j,kolor);
   end;
end;

begin
   wyznaczobszarwykresu;
   inicjujgrafike;
   wyznaczdxdy(dx,dy);
   rysujfraktal;
   readln;
   closegraph;
end.

