MetaPost / Le billard arithmétique…

billard.mp

 u=1cm;
 
 % Nécessaire pour les "graduations"
 input format;
 init_numbers(btex $-$ etex, 
              btex$1$etex, 
              btex$ times 10$etex, 
              btex$"" sup -$etex, 
              btex$"" sup 2$etex);
 
 % Nécessaire pour une largeur et une longueur 
 % assez grande (par exemple a=37 et b=25)
 input marith;
 
 % Quelques macros arithmétiques
 vardef pgcd(expr A,B) = 
     save a,b,r;
     numeric a,b,r;
     a := A; b := B;
     forever: 
         r := a mod b;
         a := b; b := r;
         exitunless r > 0;
     endfor;
     a
 enddef;
 vardef ppcm(expr A,B)=
   A * B / pgcd(A,B)
 enddef;
 
 % Paramètres du billard
 a = 12;         % longueur
 b = 5;          % largeur
 
 
Conversion au format PDF de billard.1
 beginfig(1);
   pair O,A,B,C,M[];
   O=u*(0,0);
   A=u*(a,0);
   B=u*(a,b);
   C=u*(0,b);
   label.rt(btex $A$ etex,A);
   label.rt(btex $B$ etex,B);
   label.lft(btex $C$ etex,C);
   label.lft(btex $O$ etex,O);
   M[0]=O;
   j=0;
   % La grille
   for k=0 upto a:
     draw ((0,0)--u*(0,b)) shifted(u*(k,0));
   endfor;
   for k=0 upto b:
     draw ((0,0)--u*(a,0)) shifted(u*(0,k));
   endfor;
   draw (0,0)--u*(a,0)--u*(a,b)--u*(0,b)--cycle 
        withpen pencircle scaled 2bp;
 
   % On définit les points en juxtaposant horizontalement 
   % le maillage
   for j=0 upto (ppcm(a,b)-1):
     k:=j div b;
     if k mod 2=0:
         M[j+1]-M[j]=u*(1,1);
     else:
         M[j+1]-M[j]=u*(1,-1);
     fi;
   endfor;
 
   % On les replace dans le rectangle de départ
   for j=0 upto ppcm(a,b):
     k:=j div a;
     if (k mod 2=0) :
         M[j]:=M[j] shifted(u*(-k*(a,0)));
     else:
         M[j]:=M[j] reflectedabout(u*(a,0),u*(a,b)) 
                    shifted(u*(k-1)*(a,0));
     fi;
   endfor;
 
   % On trace le chemin
   for k=1 upto ppcm(a,b):
     drawarrow M[k-1]--M[k] withcolor (red+green);
   endfor;
 
   % Passons à la numérotation des noeuds du quadrillage
   label.bot(btex 0 etex,M0);
   % On déplace légèrement le point à nommer en fonction 
   % du point précédent
   for j=1 upto ppcm(a,b):
     label(format("%10f",j),
           M[j] shifted(M[j-1]-75/100[M[j],M[j-1]]));
   endfor;
 
 endfig;
 end
 
 
fichier mp

 

Validation CSS Validation XHTMLChristophe Poulain — Dernière modification : 1 août 2008 (0.08s - 3778060 - jeudi 20 novembre 2008) vers le haut