z0=(210/2mm, 297/2mm);
numeric radius; radius=x0-2.54cm/2;
numeric np; np=5;
numeric depth; depth=1;
numeric startang; startang=90;
numeric ang; ang=360/np;
def sierpthing(expr nang, cen, rad, n) =
begingroup
save pentrat, radsm, radto, bgp, smc, mdp;
numeric pentrat, radsm, radto;
pentrat=1/(2*(cosd ang)+2); % Ratio of size of small pents to big one.
radsm=pentrat*rad; % Radius of smaller ones.
radto=rad-radsm; % Radius to center of smaller ones.
pair bgp[], smc[], mdp[];
for i=0 upto np-1:
bgp[i]=cen+rad*dir(nang+ang*i);
smc[i]=cen+radto*dir(nang+ang*i);
endfor
for i=0 upto np-1:
% The point of the center pent just anti-clockwise of the others.
mdp[i]=(bgp[(i) mod np]--bgp[(i+2) mod np]) intersectionpoint
(bgp[(i+1) mod np]--bgp[(i+4) mod np]);
endfor
if n>0:
fill mdp[0]--mdp[1]--mdp[2]--mdp[3]--mdp[4]--cycle;
fi
if (n<depth) and (n>=0):
fill mdp[2]--(pentrat[bgp[2],bgp[3]])--(pentrat[bgp[3],bgp[2]])--cycle;
fi
if n>0:
sierpthing(nang+4ang, smc[4], radsm, n-1);
sierpthing(nang, smc[0], radsm, n-1);
sierpthing(nang+ang, smc[1], radsm, n-1);
if n=depth:
sierpthing(nang+2ang, smc[2], radsm, n-1);
sierpthing(nang+3ang, smc[3], radsm, n-1);
else:
sierpthing(nang, smc[2], radsm, n-2);
sierpthing(nang, smc[3], radsm, n-2);
fi
fi
endgroup
enddef;
sierpthing(startang, z0, radius, depth);
endfig
end |