Page 1 sur 1

Pavage

Posté : dim. 10 févr. 2013, 13:13
par mumblee
Bonjour,

Juste un exemple de pavage que j'ai demandé de faire à mes élèves de sixième. Ils devaient remplir une page A4.

Comme d'habitude, je prends les améliorations du code que vous suggérerez :)

Figure asymptote 10334bfcf65dcfcbb20b0731e154ef97
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import geometry;
  2. // Changez l'unité de longueur pour remplir une page A4.
  3. // Avec 1cm, l'image obtenue est trop grande pour être acceptée par le forum.
  4. unitsize(2.5mm);
  5. // unitsize(1cm);
  6.  
  7. point pA=(0,0), pB=shift((4,0))*pA, pC=rotate(60,pA)*pB;
  8.  
  9. void Pave(point P=pA) {
  10. // Figures de base
  11. point pa=P, pb=shift((4,0))*pa, pc=rotate(60,pa)*pb;
  12. path tri=pa--pb--pc--cycle,
  13. carre=pa--pb--rotate(-90,pb)*pa--rotate(90,pa)*pb--cycle,
  14. losa=pa--reflect(line(pa,pb))*pc--pb--pc--cycle;
  15.  
  16. // Un pavé
  17. path L1=rotate(30,pa)*losa;
  18. path L2=rotate(150,pa)*losa;
  19. path L3=rotate(270,pa)*losa;
  20. path C1=shift((rotate(210,pa)*pb-pa)+(pa-pb))*carre;
  21. path C2=shift(rotate(210,pa)*pb-pa+(pa-pc))*rotate(-30,pa)*carre;
  22. path C3=shift((rotate(270,pa)*pb-pa)+(pb-pc))*rotate(30,pa)*carre;
  23. path T1=shift(rotate(270,pa)*pb-pa+(pa-pc))*tri;
  24. path T2=shift((rotate(210,pa)*pb-pa)+(pa-pb))*rotate(-60,pa)*tri;
  25. filldraw(L1,cyan,black);
  26. filldraw(L2,magenta,black);
  27. filldraw(L3,yellow,black);
  28. filldraw(C1,lightblue,black);
  29. filldraw(C2,blue,black);
  30. filldraw(C3,deepblue,black);
  31. filldraw(T1,lightgreen,black);
  32. filldraw(T2,lightred,black);
  33. }
  34.  
  35. // Translations du pavage
  36. vector u=rotate(-30,pA)*(pB-pA)+(pB-pA)+rotate(30,pA)*(pB-pA), v=rotate(60,pA)*u;
  37.  
  38. // Remplissage
  39. for(int i=0; i<3; ++i){
  40. for(int j=0; j<4; ++j){
  41. Pave((i-quotient(j,2))*u+j*v);
  42. }
  43. }
  44.  
  45. path pageA4=(0,0)--(21,0)--(21,29.7)--(0,29.7)--cycle;
  46. clip(pageA4);

Re: Pavage

Posté : dim. 10 févr. 2013, 15:42
par GM
Merci pour la participation.

Plutôt que :

Code : Tout sélectionner

Pave(point P=pA)

avec un argument par défaut qui ne devrait pas dépendre de la définition d'un point pA
et la nécessité de faire ensuite une double boucle imbriquée

... je verrai plutôt :

Code : Tout sélectionner

Pavage(point P=(0,0),int nh=1,int nv=1,bool crop=true)

avec les nombres nh et nv spécifiant les nombres de "pavés" à mettre horizontalement et verticalement,
et un booléen crop pour limiter à un rectangle qui tient compte de nh et nv.

Re: Pavage

Posté : sam. 12 oct. 2013, 15:05
par mumblee
Bonjour,

GM a écrit :je verrai plutôt :

Code : Tout sélectionner

Pavage(point P=(0,0),int nh=1,int nv=1,bool crop=true)

avec les nombres nh et nv spécifiant les nombres de "pavés" à mettre horizontalement et verticalement,
et un booléen crop pour limiter à un rectangle qui tient compte de nh et nv.


Merci de tes remarques. Ci-dessous, une première tentative d'adaptation. J'ai préféré sortir le crop suite à la possibilité de choisir la direction du tracé. C'est mieux ?

Figure asymptote 9a00d3f2c5a0935455ba0b7f450fa669
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import geometry;
  2. unitsize(1cm);
  3.  
  4. // Un pavé
  5. picture Pave(vector u=(1,0), real taille=1) {
  6. picture pic;
  7. // Figures de base
  8. point pa=(0,0), pb=scale(taille,pa)*shift(u)*pa, pc=rotate(60,pa)*pb;
  9. path tri=pa--pb--pc--cycle,
  10. carre=pa--pb--rotate(-90,pb)*pa--rotate(90,pa)*pb--cycle,
  11. losa=pa--reflect(line(pa,pb))*pc--pb--pc--cycle;
  12. // Figures constituant un pavé
  13. path L1=losa;
  14. path L2=rotate(120,pa)*losa;
  15. path L3=rotate(240,pa)*losa;
  16. path C1=shift(pa-pc)*reflect(line(pa,pb))*carre;
  17. path C2=shift(pa-pc)*rotate(120,pa)*carre;
  18. path C3=shift(pa-pb)*rotate(60,pa)*carre;
  19. path T1=shift(pa-pc)*rotate(210,pa)*tri;
  20. path T2=shift(pa-pb)*rotate(150,pa)*tri;
  21. // Tracé
  22. filldraw(pic,L1,cyan,black);
  23. filldraw(pic,L2,magenta,black);
  24. filldraw(pic,L3,yellow,black);
  25. filldraw(pic,C1,lightblue,black);
  26. filldraw(pic,C2,blue,black);
  27. filldraw(pic,C3,deepblue,black);
  28. filldraw(pic,T1,lightgreen,black);
  29. filldraw(pic,T2,lightred,black);
  30. return pic;
  31. }
  32.  
  33. // Un pavage
  34. picture Pavage(point pP=(0,0), vector u=(1,0), real taille=1, int nh=1, int nv=1) {
  35. picture pic;
  36. // Vecteurs de translations du pavé
  37. point pa=(0,0), pb=scale(taille)*shift(u)*pa, pc=rotate(60,pa)*pb;
  38. vector vv=(rotate(90,pa)*(pb-pa))+(pc-pa)+(pc-pb), vh=rotate(-60,pa)*vv;
  39. // Remplissage
  40. for(int i=0; i<nh; ++i){
  41. for(int j=0; j<nv; ++j){
  42. add(pic,shift(i*vh+(j-quotient(i,2))*vv+pP)*Pave(u,taille));
  43. }
  44. }
  45. return pic;
  46. }
  47.  
  48. // Tracé du pavage dans currentpicture
  49. real t=1;
  50. point pA=(0,0);
  51. add(Pavage(pA,(1,0),taille=t,nh=3,nv=4));
  52.  
  53. // // Obtention d'une page A5
  54. // path pageA5=(0,0)--(14.85,0)--(14.85,21)--(0,21)--cycle;
  55. // clip(pageA5);