Fichier fougeres.mp (figure 1) — Modifié le 16 Mars 2008 à 00 h 31
%% Quelques fougères
%% Jean-Michel Sarlat - Janvier 2002
%% --------------------------------------------------------
%% Les paramètres sont calculés à partir d'éléments trouvés
%% dans :
%% Chaos and Fractals
%% (Peitgen,Jürgens,Saupe)
%% Springer-Verlag 1992
%% ISBN 3-540-97903-4
%% --------------------------------------------------------
%% Les transformations
transform t[];
%% Le point d'impact
pair X;
%% Définition brute des transformations affines
%% -- la « partie » linéaire :
%% [ r.cos(phi) -s.sin(psi) ]
%% [ r.sin(phi) s.cos(psi) ]
%% -- puis la translation de vecteur to
def traffine(expr t,r,phi,s,psi,to) =
origin transformed t = to;
right transformed t = (r*cosd(phi),r*sind(phi))+to;
up transformed t = (-s*sind(psi),s*cosd(psi))+to;
enddef;
beginfig(1);
% unité
u := 10cm;
% nombre d'itérations (par paquets de 100)
n := 80;
% la tige
traffine(t1,0,0,.27,0,(.5,0));
% feuille droite
traffine(t2,.28255,119.46,.34546,-49.58,(.57,-.036));
% feuille gauche
traffine(t3,.27961,52.56,.27785,50.70,(.408,.0893));
% pointe
traffine(t4,.78165,-2.35,.73978,-2.63,(.1075,.27));
% initialisation de X
X := origin transformed t1;
% C'est parti !
for j = 1 upto n:
for i=1 upto 100:
r := uniformdeviate(1);
if r <.02: X := X transformed t1;
elseif r <.17: X := X transformed t2;
elseif r <.3 : X := X transformed t3;
else: X := X transformed t4;
fi;
draw X scaled u
withpen pencircle scaled 1pt
withcolor r[green,red];
endfor
endfor
endfig;
beginfig(2);
% unité
u := 10cm;
% nombre d'itérations (par paquets de 100)
n := 80;
% la tige
traffine(t1,0,0,.27,0,(.5,0));
% feuille droite
traffine(t2,.28255,119.46,.34546,-49.58,(.57,-.036));
% feuille gauche
traffine(t3,.27961,52.56,.27785,50.70,(.408,.0893));
% pointe
traffine(t4,.78165,-2.35,.73978,-2.63,(.1075,.27));
% initialisation de X
X := origin transformed t1;
% C'est parti !
for j = 1 upto n:
for i=1 upto 100:
r := uniformdeviate(1);
if r <.02: X := X transformed t1;
elseif r <.17: X := X transformed t2;
elseif r <.3 : X := X transformed t3;
else: X := X transformed t4;
fi;
draw X scaled u
withpen pencircle scaled 1pt
withcolor (.25+r*(1-r)*2)[green,red];
endfor
endfor
endfig;
end