//le iriangle de sierpinski ex triserp(-2-2*i,2-2*i,5)
triserp(x,y,n):={
local z;
z:=x+(y-x)*exp(evalf(i*pi/3));
if (n==0) return triangle_equilateral(x,y);
triserp(x,(x+y)/2,n-1);
triserp(z,(x+z)/2,n-1);
triserp(y,(y+z)/2,n-1);
};
//la courbe trapeze de sierpinski ex traserp(-2-2*i,2-2*i,5)
traserp(x,y,n):={
local z;
z:=x+(y-x)*exp(evalf(i*pi/3));
if (n==0) return segment(x,y);
traserp((x+z)/2,x,n-1);
traserp((x+z)/2,(z+y)/2,n-1);
traserp(y,(y+z)/2,n-1);
};
//le tapis carre de sierpinski ex carserp(-2-2*i,2-2*i,4)
carserp(x,y,n):={
local a,b,c,d,f,g,h,j;
h:=(y-x)/3;
a:=x+h;
b:=a+h;
c:=x+i*h;
d:=c+i*h;
f:=b+i*h;
g:=d+h;
j:=g+h;
if (n==0) return carre(x,y);
carserp(x,a,n-1);
carserp(a,b,n-1);
carserp(b,y,n-1);
carserp(c,c+h,n-1);
carserp(f,f+h,n-1);
carserp(d,g,n-1);
carserp(g,j,n-1);
carserp(j,j+h,n-1);
};
// dessin d'un polygone regulier de k cotes
polyreg(x,y,k):={
local a,b,c;
a:=x;
b:=y;
for (j:=1;j<=k;j++) {
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
segment(a,c);
b:=a;
a:=c;
}
};
//napperon de Cantor ou de Sierpinski k=3,4...  utilise polyreg 
//ex polyserp(-1-2*i,1-2*i,5,3); polyserp(-2*i,1-2*i,9,2)
polyserp(x,y,k,n):={
local a,b,c,h,j,q,s;
if (n==0) return polyreg(x,y,k);
a:=x;
b:=y;
for (j:=1;j<=k;j++) {
//pour k=3 ou 4  h:=(b-a)/3;pour k=5,6,7,8 h:=(b-a)/2/(cos(evalf(2*pi/k))+1);
s:=1;
for (l:=1;l<=iquo(k-1,4);l++){
s:=s+cos(2*l*evalf(pi)/k);
} 
h:=(b-a)/2/s;
polyserp(a,a+h,k,n-1);
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
b:=a;
a:=c;
}
};
