Pavé droit et comptage d'unités de volumes

Suite à des messages postés sur la liste "Math-collège", voici un autre exemple d'utilisation de geometriesyr16.mp : une macro pour compter les unités de volumes dans un pavé droit.

pavecomptage.mp [ source brut ]

 input geometriesyr16;
 
 vardef comptage(expr ll,hh,pp)=
   save compt;
   picture compt;
   color A,B,C,D,E,F,G,H;
   color pts[];
   pts1=(1/hh)[D,E];
   pts2=(1/hh)[C,H];
   compt=image(
     trace Pave(A,B,C,D,E,F,G,H)(pp/4,ll/4,hh/4) withcolor gris;
     %horizontal longueur
     trace segment(pts1+(1/ll)*(H-E),pts2);
     trace segment(pts1+(1/pp)*(B-C),pts2+(1/pp)*(B-C));
     trace segment((1/pp)[C,B],(1/pp)[D,A]+(1/ll)*(C-D));
     trace chemin((1/hh)[C,H],C,(1/pp)[C,B]);
     for k=1 upto ll:
       trace segment((k/ll)[pts1,pts2],(k/ll)[pts1,pts2]+(1/pp)*(B-C));
       trace segment((k/ll)[pts1,pts2]+(1/pp)*(B-C),(k/ll)[pts1,pts2]+(1/pp)*(B-C)+(1/hh)*(D-E));
     endfor;
     %horizontal profondeur
     trace segment(pts1+(1/pp)*(A-D),pts1+A-D);
     trace segment(pts1+(1/ll)*(C-D),pts1+A-D+(1/ll)*(C-D));
     trace segment((1/ll)[A,B],(1/ll)[A,B]+((pp-1)/pp)*(D-A));
     trace chemin((1/hh)[A,F],A,(1/ll)[A,B]);
     for k=0 upto (pp-2):
       trace segment((1/hh)[A,F]+(k/pp)*(D-A),(1/hh)[A,F]+(k/pp)*(D-A)+(1/ll)*(B-A));
       trace segment((1/hh)[A,F]+(k/pp)*(D-A)+(1/ll)*(B-A),(k/pp)*(D-A)+(1/ll)[A,B]);
     endfor;
     %vertical
     trace segment((1/pp)[E,F],(1/pp)[E,F]+((hh-1)/hh)*(D-E));
     trace segment((1/ll)[E,H],(1/ll)[E,H]+((hh-1)/hh)*(D-E));
     trace segment((1/pp)[E,F]+(1/ll)*(H-E),(1/pp)[E,F]+(1/ll)*(H-E)+((hh-1)/hh)*(D-E));
     trace chemin((1/pp)[E,F],E,(1/ll)[E,H]);
     for k=0 upto (hh-2):
       trace segment((1/pp)[E,F]+(k/hh)*(D-E),(1/pp)[E,F]+(k/hh)*(D-E)+(1/ll)*(H-E));
       trace segment((1/ll)[E,H]+(k/hh)*(D-E),(1/ll)[E,H]+(k/hh)*(D-E)+(1/pp)*(F-E));
     endfor;
     );
   compt
 enddef;
 
 
Conversion au format PDF de pavecomptage.1
 figureespace(-10u,-10u,10u,10u);
 Initialisation(5,30,22,500);
 trace comptage(8,4,2);
 finespace;
 
 
Conversion au format PDF de pavecomptage.2
 figureespace(-10u,-10u,10u,10u);
 Initialisation(5,30,22,400);
 trace comptage(4,5,9);
 finespace;
 
 
Conversion au format PDF de pavecomptage.3
 figureespace(-10u,-10u,10u,10u);
 Initialisation(5,30,22,500);
 trace comptage(4,8,3);
 finespace;
 
 
Conversion au format PDF de pavecomptage.4
 figureespace(-10u,-10u,10u,10u);
 Initialisation(5,60,40,500);
 trace comptage(8,4,2);
 finespace;
 
 end