% 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