Un exemple d'utilisation de Maple : le flocon de Von Koch .

Faire défiler pour voir la suite...

On part d'un triangle équilatéral, puis on greffe sur chaque coté, vers l'extérieur, un triangle de taille réduite de 1/3, et on recommence le processus...

Une première procédure qui ne fonctionne que pour n=2 ou n=3, car le type "list" ne peut contenir assez d'éléments pour les n>3... On utilise ensuite l'instruction de tracé de ligne polygonale joignant des nombres complexes.

> etoile:=proc(n::integer)
> local T,S,k,i,c,r;
> r:=exp(I*2*Pi/3);
> T:=[seq(0,i=1..3*4^(n-1)+1)];
> T[1]:=1;T[2]:=r;T[3]:=conjugate(r);T[4]:=1;
> for k from 2 to n do
> S:=T;T[3*4^(k-1)+1]:=1;
> for i from 0 to 3*4^(k-2)-1 do
> T[4*i+1]:=evalc(S[i+1]);
> c:=(S[i+2]-S[i+1])/3;
> T[4*i+2]:=evalc(S[i+1]+c);
> T[4*i+4]:=evalc(S[i+2]-c);
> T[4*i+3]:=evalc(T[4*i+2]-r*c);
> od;
> od;
> plots[complexplot](T,scaling=constrained);
> end:

Testons :
> etoile(3);

> etoile(4);
Error, (in etoile) assigning to a long list, please use arrays

Modifions notre procédure pour qu'elle accepte les n>3 (et on trace un triangle plus gros) :
> etoile2:=proc(n::integer)
> local T,S,k,i,c,r;
> r:=exp(I*2*Pi/3);
> T:=array(1..3*4^(n-1)+1);
> T[1]:=1;T[2]:=r;T[3]:=conjugate(r);T[4]:=1;
> for k from 2 to n do
Attention : si on fait S:=T, chaque modification de T est reportée dans S...et tout est faux!
> S:=copy(T);T[3*4^(k-1)+1]:=1;
> for i from 0 to 3*4^(k-2)-1 do
> T[4*i+1]:=evalc(S[i+1]);
> c:=(S[i+2]-S[i+1])/3;
> T[4*i+2]:=evalc(S[i+1]+c);
> T[4*i+4]:=evalc(S[i+2]-c);
> T[4*i+3]:=evalc(T[4*i+2]-r*c);
> od;
> od;

Comme T est un "array", on ne peut pas utiliser plots[complexplots]....
On voudra plus tard mettre toutes les figures sur un même dessin, alors nous translatons :

> for i to 3*4^(n-1)+1 do S[i]:=[Re(T[i])+2*n,Im(T[i])] od;
> eval(S);
> end:


On veut voir la progression de la figure lorsque n grandit :
> et[1]:=plots[complexplot]([3,2+exp(I*2*Pi/3),2+exp(4*I*Pi/3),3],scaling=constrained,axes=none):
> for n from 2 to 5 do et[n]:=plot(etoile2(n),scaling=constrained,axes=none) od:
> plots[display]([seq(et[n],n=1..5)]);

plot(etoile2(5),scaling=constrained,axes=none);

Et si on greffait les triangles sur l'intérieur?
> etoile3:=proc(n::integer)
> local T,S,k,i,c,r;
> r:=exp(I*2*Pi/3);
> T:=array(1..3*4^(n-1)+1);
> T[1]:=1;T[2]:=r;T[3]:=conjugate(r);T[4]:=1;
> for k from 2 to n do

attention : si on fait S:=T, chaque modification de T est reportée dans S...et tout est faux!
> S:=copy(T);T[3*4^(k-1)+1]:=1;
> for i from 0 to 3*4^(k-2)-1 do
> T[4*i+1]:=evalc(S[i+1]);
> c:=(S[i+2]-S[i+1])/3;
> T[4*i+2]:=evalc(S[i+1]+c);
> T[4*i+4]:=evalc(S[i+2]-c);
> T[4*i+3]:=evalc(T[4*i+4]+r*c);
> od;
> od;

Comme T est un "array", on ne peut pas utiliser plots[complexplots]....
On voudra plus tard mettre toutes les figures sur un même dessin, alors nous translatons :

> for i to 3*4^(n-1)+1 do S[i]:=[Re(T[i])+2*n,Im(T[i])] od;
> eval(S);
> end:

Testons :
> plot(etoile3(5),scaling=constrained,axes=none,color=black);

On veut voir la progression : (on aurait pu utiliser aussi l'option insequence=true pour avoir une animation...)
> et3[1]:=plots[complexplot]([3,2+exp(I*2*Pi/3),2+exp(4*I*Pi/3),3],scaling=constrained,axes=none):
> for n from 2 to 5 do et3[n]:=plot(etoile3(n),scaling=constrained,axes=none) od:
> plots[display]([seq(et3[n],n=1..5)]);

Avec un petit travail supplémentaire, on obtient l'animation du début de page .

Retour aux mathématiques