Le fichier tortue.mp


Fichier : tortue.mp


% tortue.mp
% La tortue de 11 février 2003
% --------------------------------------------------------------------
% Jean-Michel Sarlat (http://melusine.eu.org/syracuse/metapost/)
% --------------------------------------------------------------------

%% Les tables (chemin,point actuel,orientation,direction)
path __p[]; pair __xy[] ; numeric __m[], __a[];

%% L'enregistrement d'une tortue (initialisation)
def tortue(expr n, x , y , a , m ) =
    __xy[n] := (x,y) ; __a[n] := a ; __m[n] := m ; __p[n] := (x,y);
enddef;

%% La tortue <n> se dédouble, <m> à cet instant se superpose à <n>
def blop(expr n,m) =
    tortue(m,xpart __xy[n],ypart __xy[n],__a[n],__m[n]);
enddef;


%% La tortue tourne (sur place)
def tourne(expr n, a ) =
    __a[n] := ( __a[n] + a * __m[n] ) mod 360;
enddef;


%% La tortue se retourne, sa gauche est notre droite !
def retourne(expr n ) =
    __m[n] := - __m[n];
enddef;

%% La tortue avance d'une certaine distance et fait ce qu'on lui demande
vardef avance(expr n,l)(suffix faire) =
    save position;
    pair position;
    position =  __xy[n] + ((l,0) rotated __a[n]);
    faire(__xy[n],position);
    __xy[n] := position;
    __p[n] := __p[n]--position;
enddef;

%% Remplissage du polygone circonscrit par le chemin de la tortue
vardef remplis(expr n,c) =
    fill __p[n]--cycle withcolor c;
enddef;

%% Une chose que la tortue peut faire en se déplaçant : laisser une trace !
vardef trace(expr a,b) =
    draw a--b;
enddef;


%% Une autre chose : suivre un chemin floconneux (tortue ivre mais sûre ...)
numeric indice_koch,iter_koch;
indice_koch := 0;  % valeurs par défaut
iter_koch   := 2;

vardef m_koch(expr m,d) =
 if m=0:
  avance(indice_koch,d,trace);
 else:
  m_koch(m-1,d);
  tourne(indice_koch,60);
  m_koch(m-1,d);
  tourne(indice_koch,-120);
  m_koch(m-1,d);
  tourne(indice_koch,60);
  m_koch(m-1,d);
 fi
enddef;

vardef koch(expr a,b) = 
 numeric d_koch;
 d_koch = sqrt((xpart (b-a))**2+(ypart (b-a))**2)/(3**iter_koch);
 tortue(indice_koch,xpart a,ypart  a,angle(b-a),1);
 m_koch(iter_koch,d_koch);
enddef; 

endinput

    
 
retour
Source tortue.txt mouliné par petitParseur(Z+B) le dimanche 16 février 2003.