Fichier fougeres.mp (figure 1) — Modifié le 16 Mars 2008 à 00 h 31

Fougères

fougeres.mp (figure 1)
Source

%% 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