Le pavage de Penrose

Voici le programme Maple qui l'a dessiné.

Les deux tuiles sont le cerf-volant et la flèche. La construction du pavage se fait par la propriété
d'autosimilarité qui permet aussi de montrer que ces tuiles ne pavent le plan que de façon apériodique
(voir la section 2.2 de mon cours "Pavages du plan" aux journées X-UPS).

On mémorise tout d'abord la liste des racines dixièmes de l'unité.

> restart:with(plots):with(plottools):
for i to 9 do r.i:=evalf(exp(I*i*Pi/5)) od:

Une tuile de Penrose est repérée par T:=[n,a,c], où n=1 pour le cerf-volant et 2 pour la flèche
et où a et c sont deux nombres complexes: le sommet le plus obtus et son opposé.
La procédure autosim(T) remplace chaque cerf-volant par deux cerf-volants plus une flèche
et chaque flèche par un cerf-volant plus une flèche.

> autosim:=proc(T) local n,a,c,o:
n:=T[1]: a:=T[2]: c:=T[3]: o:=c+(r2+r8)*(a-c):
if n=1 then [1,o,c+r1*(a-c)],[1,o,c+r9*(a-c)],[2,o+r6*(a-o),c]:
else [1,a,c],[2,c+r1*(a-c),a+r7*(c-a)]: fi: end:

La procédure polygone(T) transforme la liste T en un polygone.

> polygone:=proc(T) local n,a,c,vec:
n:=T[1]: a:=T[2]: c:=T[3]: vec:=a->[Re(a),Im(a)]:
if n=1 then POLYGONS([vec(a),vec(c+r1*(a-c)),vec(c),vec(c+r9*(a-c))]):
else POLYGONS([vec(a),vec(a+r7*(c-a)),vec(c),vec(a+r3*(c-a))]): fi: end:

La procédure pavage(n) part d'un seul cerf-volant et applique n itérations du processus d'autosimilarité .

> pavage:=proc(n) local S,i,j:
S:=[[1,-2*I,3*I]]:
for i to n do S:= [seq(autosim(S[j]),j=1..nops(S))]: od:
seq(polygone(S[j]),j=1..nops(S)): end:

Choix du nombre d'itérations et envoi du dessin.

> n:=9:P:=pavage(n):nops([P]);
PLOT(P,AXESSTYLE(NONE),SCALING(CONSTRAINED),VIEW(-1..1,-1..1));