Created
January 31, 2022 17:52
-
-
Save fastjack/1b0758bdfa75a5b41e82703cb6c3d281 to your computer and use it in GitHub Desktop.
My optimized version of a mandelbrot generator on the C64
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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