program julia_animation; {Creates an animation of Julia sets. This is like a
                         combination of 'mset_animation' and 'julia_col'.}

uses crt, graph;

var     xcorner, y2corner, x2corner, ycorner: real;
        xsize, ysize, k, i, xgap, ygap, max: integer;
        ca, cb, cd, za2, za1, za, zb, b1, b2: real;
        gd, gm, Size, counter: integer;
        count, del, del2: word;
        A,B,C,D,E,F,G,H,J, L,M,N,O,P,Q,R,S,T,U,V: pointer;




procedure iterate;
begin
count := 0;
za2 := za;
while 1=1 do
begin
za1 := za2;
za2 := (za1 * za1 - zb * zb) + ca;
zb := za1 * zb * 2 + cb;
IF za2 * za2 + zb * zb > 4 THEN EXIT;
count := count + 1;
IF count > max THEN EXIT
end;
END;



procedure main;
begin
gd := Detect;
InitGraph(gd, gm, 'd:\tp\bgi');
xcorner := -2;
y2corner := 2;
x2corner := 2;
ycorner := -2;
setcolor(white);
max := 200;
xsize := 200;
ysize := 200;
xgap := 0;
ygap := 0;
del := 0;
del2 := del;
{CLS}
Size := ImageSize(0, ysize, xsize, 0);
GetMem(A,Size);
Getmem(B,Size);
Getmem(C,Size);
Getmem(D,Size);
Getmem(E,Size);

Getmem(F,Size);
Getmem(G,Size);
Getmem(H,Size);
Getmem(J,Size);
Getmem(L,Size);
counter := 1;
cb := 2.5 - 0.75 * 0;   {We did juliafi2.pas in stages, like in
            mset_animation. For each part, increase the '0' in the line above
            by 1. The 0.75 is the increment we decided on.
              The 'cb' values in the lines above and below can be changed to
            make the corresponding points on the M set move along a different
            axis.
            The cb's can be swapped for ca's in the line above and two lines
            below and ca for cb (in the line marked (*)) to produce a
            different animation}
cd := cb - 0.75;
while cb > cd do
begin
FOR k := ysize downTO 1 do
FOR i := 1 TO xsize do
begin
za := (i / xsize) * (x2corner - xcorner) + xcorner;
zb := (k / ysize) * (y2corner - ycorner) + ycorner;
ca := 0;
iterate;
if count < 5 then count := 5;
if count >= max then count := 5;
setcolor(count - 5);
LINE (xgap + i, ygap + ysize- k, xgap+i, ygap +ysize- k);
end;
if counter = 1 then getimage(0,ysize,xsize,0, A^);
if counter = 2 then getimage(0,ysize,xsize,0, B^);
if counter = 3 then getimage(0,ysize,xsize,0, C^);
if counter = 4 then getimage(0,ysize,xsize,0, D^);
if counter = 5 then getimage(0,ysize,xsize,0, E^);
if counter = 6 then getimage(0,ysize,xsize,0, F^);
if counter = 7 then getimage(0,ysize,xsize,0, G^);
if counter = 8 then getimage(0,ysize,xsize,0, H^);
if counter = 9 then getimage(0,ysize,xsize,0, J^);
if counter = 10 then getimage(0,ysize,xsize,0, L^);
counter := counter + 1;
cb:= cb - 0.075;
cleardevice;
end;
repeat
cleardevice;

putimage(0,0, A^, NormalPut);
delay(del);
putimage(0,0, B^, NormalPut);
delay(del);
putimage(0,0, C^, NormalPut);
delay(del);
putimage(0,0, D^, NormalPut);
delay(del);
putimage(0,0, E^, NormalPut);
delay(del);
putimage(0,0, F^, NormalPut);
delay(del);
putimage(0,0, G^, NormalPut);
delay(del);
putimage(0,0, H^, NormalPut);
delay(del);
putimage(0,0, J^, NormalPut);
delay(del);
putimage(0,0, L^, NormalPut);
delay(del);
readln(del);
if del = 0 then del := del2;
until del = 1;
end;



begin
main;
end.
