Skip to content

Instantly share code, notes, and snippets.

@fastjack
Created January 31, 2022 17:52
Show Gist options
  • Save fastjack/1b0758bdfa75a5b41e82703cb6c3d281 to your computer and use it in GitHub Desktop.
Save fastjack/1b0758bdfa75a5b41e82703cb6c3d281 to your computer and use it in GitHub Desktop.
My optimized version of a mandelbrot generator on the C64
program mandelopt(input,output);
const xmax = 319;
ymax = 199;
type complex = record
r,i : real;
end; (* complex *)
var z,c : complex;
rmax, rmin, imax, imin : real;
xt, yt : real;
x, y : integer;
symetry : boolean;
maxtiefe : integer;
srange : integer;
(*$"ngraph.unit"*)
procedure box(xp,yp,d,t : integer);
begin
if t mod 2=0
then begin
quad(xp,yp,d-1);
if symetry then quad(xp,ymax-(yp+d-1),d-1);
end;
end;
procedure step;
var zo : complex;
begin
zo:=z;
z.r:=(zo.r*zo.r-zo.i*zo.i)+c.r;
z.i:=(2*zo.r*zo.i)+c.i;
end;
function iterate(xs, ys : integer):integer;
var atiefe : integer;
begin
atiefe:=0;z.r:=0;z.i:=0;
c.r:=rmin+xs*xt;
c.i:=imin+ys*yt;
repeat
step;
atiefe:=atiefe+1;
until (atiefe=maxtiefe) or (z.r*z.r+z.i*z.i>=4);
if atiefe mod 2 = 0
then begin
point(xs,ys);
if symetry then point(xs,ymax-ys);
end;
iterate:=atiefe;
end;
procedure calc(xn, yn, range : integer);
var t1, t2, t3, t4 : integer;
begin
if range = 1
then t1:=iterate(xn,yn)
else begin
t1:=iterate(xn,yn);
t2:=iterate(xn,yn+range-1);
t3:=iterate(xn+range-1,yn);
t4:=iterate(xn+range-1,yn+range-1);
if (t1=t2) and (t2=t3) and (t3=t4)
then
box(xn,yn,range,t1)
else begin
range:=range div 2;
calc(xn,yn,range);
calc(xn,yn+range,range);
calc(xn+range,yn,range);
calc(xn+range,yn+range,range);
end;
end;
end;
begin
slow;
write("rmin : ");readln(rmin);
write("rmax : ");readln(rmax);
write("imin : ");readln(imin);
write("imax : ");readln(imax);
write("max rek : ");readln(maxtiefe);
write("srange : ");readln(srange);
fast;
xt:=(rmax-rmin)/xmax;
yt:=(imax-imin)/ymax;
symetry:=false;if abs(imax)=abs(imin) then symetry:=true;
graphon;clrgraph;graphcol(1,0);
for y:=0 to ymax div srange do
for x:=0 to xmax div srange do
begin
calc(x*srange,y*srange,srange);
if symetry and (y>(ymax div 2)/2) then y:=ymax;
end;
slow;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment