suivant: Le flocon
monter: Récursivité ayant plusieurs appels
précédent: Les hexagones
Table des matières
Index
Ces programmes se trouvent dans examples/recur/polygone.cxx.
On part d'un polygone régulier P à k sommets et on le remplace par k
polygones réguliers à k sommets de façon à ce que ces k
polygones aient chacun un angle commun avec P et de façon à ce qu'ils
ne se chevauchent pas. Puis on contine le processus et on ne dessine que les
derniers petits hexagones.
Par exemple un hexagone H de coté a est remplacé par 6 hexagones de
côtés a/3 obtenus par homothétie de rapport 1/3 et de centre les
sommets de l'hexagone H.
Pour écrire une procédure générale il faut faire un peu de
trigonométrie.
Le calcul du coté h du petit polygone k-régulier doit vérifier :
- si k=3, 4 on a h = (b - a)/2
- si k=5, 6, 7, 8 on a
h + h cos(2
/k) = (b - a)/2
- si k=9, 10, 11, 12, 13, 14, 15, 16 on a :
h + h cos(2
/k) + h cos(4
/k) = (b - a)/2
- si p=iquo(k-1,4), on a :
h
cos(2p
/k) = (b - a)/2
On a donc :
s =
cos(2p
/k) = (sin((2p + 1)
/k) + sin(
/k))/(2 sin(
/k))
donc
h = (b - a)/2/s
et on tape :
//napperon de Cantor ou de Sierpinski k=3,4...
//utilise isopolygone(a,b,k) k>0
//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,p,s;
DispG();
if (n==0) {isopolygone(x,y,k);return 0;}
a:=x;
b:=y;
//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);
//pour autre k il faut calculer s avec la trigo ou avec
//s:=1;for (l:=1;l<=iquo(k-1,4);l++){s:=s+cos(2*l*evalf(pi)/k);}
p:=iquo(k-1,4);
s:=(sin(evalf(pi)/k)+sin((2*p+1)*evalf(pi)/k))/
2/sin(evalf(pi)/k);
for (j:=1;j<=k;j++) {
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;
}
};
Le programme du dessin d'un polygone régulier à k cotés peut vous aider á comprendre le programme précédent.
// dessin d'un polygone regulier de k cotes
polyreg(x,y,k):={
local a,b,c;
a:=x;
b:=y;
DispG();
for (j:=1;j<=k;j++) {
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
segment(a,c);
b:=a;
a:=c;
}
};
Remarque
Une faute de signe peut vous faire voir de jolis dessins pour k=7,8...et n=2
//utilise polyreg(a,b,k) k>0 k=nb de cotes
//ex polyserr(-2*i,1-2*i,8,2); polyserr(-2*i,1-2*i,9,2)
polyserr(x,y,k,n):={
local a,b,c,h,j,q,p,s;
//if (n==0) return isopolygone(x,y,k);
DispG();
if (n==0) {polyreg(x,y,k);return 0;}
a:=x;
b:=y;
p:=iquo(k-1,4);
s:=(sin(evalf(pi)/k)-sin((2*p+1)*evalf(pi)/k))/
2/sin(evalf(pi)/k);
for (j:=1;j<=k;j++) {
if ( s!=0) h:=(b-a)/2/s; else h:=(b-a)/3;
polyserr(a,a+h,k,n-1);
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
b:=a;
a:=c;
}
};
Un autre dessin avec des octogones en tracant un octogone au centre et 8
octogones dans les angles :
polyserp8(x,y,n):={
local a,b,c,h,j,q,p,s,k;
//if (n==0) return isopolygone(x,y,8);
k:=8;
DispG();
if (n==0) {polyreg(x,y,k);return 0;}
a:=x;
b:=y;
p:=iquo(k-1,4);
s:=(sin(evalf(pi)/k)+sin((2*p+1)*evalf(pi)/k))/
2/sin(evalf(pi)/k);
h:=(b-a)/2/s;
polyserp8(a+h+i*h*(sqrt(2)+1),a+h*(sqrt(2)+1)+i*h*(sqrt(2)+1),n-1);
for (j:=1;j<=k;j++) {
polyserp8(a,a+h,n-1);
c:=a+(b-a)*exp(evalf(i*pi*(k-2)/k));
b:=a;
a:=c;
h:=(b-a)/2/s;}
};
suivant: Le flocon
monter: Récursivité ayant plusieurs appels
précédent: Les hexagones
Table des matières
Index
Documentation de giac écrite par Renée De Graeve