Fichier lsys11.mp (figure 1) — Modifié le 22 Février 2005 à 23 h 37

lsys11.mp (figure 1)
Source

input tortue.mp; 
numeric d,iter; 
d = 3 ;
iter = 15;
color marron;
marron = (.5,.1,0);
 
path gf;

gf = (0,0)--(1,.8)--(0,0)--(-.5,1)--(0,0)--(-.7,-.1)--(0,0)--(0,-1.2)--(0,0)--(.7,-.4)--(0,0);

def pas(expr x) = x * .3mm + .5mm enddef;
def epaisseur(expr x) = .12mm * x + .1mm enddef;
def couleur(expr x) = (x/iter)[green,marron] enddef;

vardef trace(expr a,b) = 
 draw a--b 
      withpen pencircle scaled e
      withcolor c; 
enddef; 

%% lsys11
%% règle A => GS[---fA][++MB];
%% règle B => C
%% règle C => A
%% règle f => g
%% règle g => k
%% règle k => ' ' 
%% règle G => HS
%% règle H => IS
%% règle I => GLMS
%% règle L => S+S+S+S+S+S--cycle
vardef A (expr n,m) = 
 save h,e,c;
 color c;
 h := pas(m);
 e := epaisseur(m);
 c := couleur(m);
 if m>0:
   G(n,m-1); 
   avance(n,h,trace); 
   blop(n,n+1); 
   tourne(n+1,-3*d);
   f(n+1,m-1);
   A(n+1,m-1); 
   blop(n,n+1); 
   tourne(n+1,2*d); 
   retourne(n+1);
   B(n+1,m-1); 
 fi 
enddef; 

vardef B (expr n,m) = 
 if m>0: C(n,m-1); fi 
enddef; 

vardef C (expr n,m) = 
 if m>0: A(n,m-1); fi 
enddef; 

vardef f (expr n,m) = 
 if m>0: 
   g(n,m-1); 
 else:
   fill (fullcircle scaled 2.5mm) shifted tortue_xy[n] withcolor .5[red,white]; 
   draw (fullcircle scaled 2.5mm) shifted tortue_xy[n] withcolor red; 
 fi
enddef; 
 
vardef g (expr n,m) = 
 if m>0: 
   k(n,m-1); 
 else:
   draw (gf scaled 5mm) rotated tortue_a[n] shifted tortue_xy[n]
                        withpen pencircle scaled 1pt
                        withcolor .2[red,black]; 
   draw (gf scaled 4.7mm) shifted tortue_xy[n] 
                        withpen pencircle scaled .2pt
                        withcolor black; 
 fi
enddef;

vardef k (expr n,m) = 
  if m=0:
   fill (fullcircle xscaled 5mm yscaled 2mm) shifted tortue_xy[n] withcolor (green+red); 
   draw (fullcircle xscaled 5mm yscaled 2mm) shifted tortue_xy[n] withcolor marron;
  fi
enddef;

vardef G (expr n,m) = 
 save h;
 h := pas(m-1);
 if m>0: 
   H(n,m-1); 
   avance(n,h,trace); 
 fi 
enddef; 

vardef H (expr n,m) = 
 save h;
 h := pas(m-1);
 if m>0: 
   I(n,m-1); 
   avance(n,h,trace); 
 fi 
enddef; 
 
vardef I (expr n,m) = 
 save h;
 h := pas(m-1);
 if m>0: 
   G(n,m-1);
   L(n,m-1);
   retourne(n); 
   avance(n,h,trace); 
 fi 
enddef; 

vardef L (expr n,m) = 
 save h,e,c;
 color c;
 h := pas(m);
 e := epaisseur(m/10);
 c := green;
 if m>0: 
   blop(n,n+1);
   for j=1 upto 5:
     avance(n+1,h,trace);
     tourne(n+1,3*d);
   endfor
   avance(n+1,h,trace);
   retourne(n+1);
   tourne(n+1,180);
   avance(n+1,h,trace);
   remplis(n+1,.9*green);
 fi 
enddef; 


beginfig(1); 
tortue(1,0,0,90,1); 
A(1,iter);
endfig;

end