Patrons d'une pyramide

Règles du forum
ATTENTION ! Il est demandé de ne déposer dans ce forum que des exemples en langage Asymptote
  • finalisés
  • que l'on pense intéressants et optimisés
  • et qui se rapportent au thème du forum.
Si certains exemples déposés donnent lieu à de nombreuses modifications, ils seront déplacés et remplacés par un nouveau sujet dans ce forum avec la ou les meilleures propositions.
Pour les demandes d'aide ... il y a un forum spécifique !
mumblee
Messages : 47
Enregistré le : jeu. 11 mars 2010, 10:29
Localisation : Lille

Patrons d'une pyramide

Message non lu par mumblee » ven. 4 janv. 2013, 17:54

Bonjour,

Comme j'ai abordé les patrons de pyramide en quatrième juste avant les vacances, je leur ai donné, suite à une activité dans le manuel Transmath 4e 2011, le problème suivant : trouver les patrons non superposables d'une pyramide non régulière à base triangulaire.

Énoncé de l'activité :
PatronsPyramide_ActiviteManuel.png
Extrait du manuel.
PatronsPyramide_ActiviteManuel.png (223.54 Kio) Vu 9835 fois
Tracé des 16 patrons :

Code : Tout sélectionner

import geometry;
unitsize(1mm);

// Procédure pour tester la présence d'une valeur entière dans un tableau d'entiers
bool test(int[] A,int n) {
  bool reponse=false;
  for (int k=0;k<A.length;++k)
    if (A[k]==n) reponse=true;
  return reponse;
}

// Les faces
// - on choisit un triangle, t1, comme base
// - les faces latérales sont construites cinq fois, selon leur emplacement dans le patron.
// (on doit pouvoir faire beaucoup plus simple...)
triangle t1=triangleabc(85,75,90);
triangle t2=triangleabc(55,50,75);
triangle t3=triangleabc(60,55,85);
triangle t4=triangleabc(50,60,90);

point pA=t1.VA, pB=t1.VB, pC=t1.VC;
triangle t2=rotate(degrees(pC-pA)-degrees(pB-pA),pA)*t2;
point pD=t2.VC;
triangle t3=rotate(degrees(pC-pB)-degrees(pA-pB),pB)*shift(pB-(point)t3.VB)*t3;
point pE=t3.VC;
triangle t4=shift(pA-pB)*rotate(180,pB)*t4;
point pF=t4.VC;

triangle t23=rotate(degrees(pD-pC)-degrees(pE-pC),pC)*t3;
triangle t32=rotate(-degrees(pD-pC)+degrees(pE-pC),pC)*t2;
triangle t24=rotate(-degrees(pF-pA)+degrees(pD-pA),pA)*t4;
triangle t42=rotate(degrees(pF-pA)-degrees(pD-pA),pA)*t2;
triangle t34=rotate(degrees(pE-pB)-degrees(pF-pB),pB)*t4;
triangle t43=rotate(-degrees(pE-pB)+degrees(pF-pB),pB)*t3;
triangle t234=rotate(degrees(pD-pC)-degrees(pE-pC),pC)*t34;
triangle t243=rotate(-degrees(pF-pA)+degrees(pD-pA),pA)*t43;
triangle t342=rotate(degrees(pE-pB)-degrees(pF-pB),pB)*t42;
triangle t324=rotate(-degrees(pD-pC)+degrees(pE-pC),pC)*t24;
triangle t423=rotate(degrees(pF-pA)-degrees(pD-pA),pA)*t23;
triangle t432=rotate(-degrees(pE-pB)+degrees(pF-pB),pB)*t32;
  
// Tableau des indices des liaisons face - face
// Cela donne les faces à tracer pour chaque patron
int[][] P=new int[16][2];

// Énumération des combinaisons des liaisons
// Hormis les 4 boucles isolant une face (qui serait alors détachée du patron)

// Compteur
int n=0;

for (int a=0;a<6;++a)
  for (int b=a+1;b<6;++b)
    for (int c=b+1;c<6;++c) {
      if (!(((a==0)&(b==1)&(c==3))|((a==0)&(b==2)&(c==4))|((a==1)&(b==2)&(c==5))|((a==3)&(b==4)&(c==5))))
	{ P[n][0]=a;
	  P[n][1]=b;
	  P[n][2]=c;
	  draw(t1);
	  if (test(P[n],0)) draw(t2);
	  if (test(P[n],1)) draw(t3);
	  if (test(P[n],2)) draw(t4);
	  if (test(P[n],0)&test(P[n],3)) draw(t23);
	  if (test(P[n],0)&test(P[n],3)&test(P[n],5)) draw(t234);
	  if (test(P[n],1)&test(P[n],3)) draw(t32);
	  if (test(P[n],1)&test(P[n],3)&test(P[n],4)) draw(t324);
	  if (test(P[n],0)&test(P[n],4)) draw(t24);
	  if (test(P[n],0)&test(P[n],4)&test(P[n],5)) draw(t243);
	  if (test(P[n],2)&test(P[n],4)) draw(t42);
	  if (test(P[n],2)&test(P[n],4)&test(P[n],3)) draw(t423);
	  if (test(P[n],1)&test(P[n],5)) draw(t34);
	  if (test(P[n],1)&test(P[n],5)&test(P[n],4)) draw(t342);
	  if (test(P[n],2)&test(P[n],5)) draw(t43);
	  if (test(P[n],2)&test(P[n],5)&test(P[n],3)) draw(t432);
	  shipout(format="pdf",prefix=format("PyramidePatrons_%i",n));
	  erase();
	  ++n;
	}
    }
Ça m'a quand même demandé pas mal de temps. J'ai probablement plus travailler que mes élèves sur le sujet :D

Outre le fait que l'on doit pouvoir faire mieux, je pose une colle à Gaëtan car le code génère autant de fichiers que de patrons, mais termine par une page blanche.

Meilleurs vœux à toutes et à tous !

EDIT : correction d'une faute dans le 12e patron généré ; il y avait un 2 ou lieu de 4 dans le test.
Modifié en dernier par mumblee le sam. 5 janv. 2013, 10:58, modifié 1 fois.
Fabrice Eudes
Debian Bullseye 11.4, Asymptote 2.79, texlive 2022, Emacs 27.1

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Patrons d'une pyramide

Message non lu par GM » ven. 4 janv. 2013, 19:38

Je ne peux pas tester pour l'instant... mais merci pour la contribution. :-)

Pour la colle, sans pouvoir tester ce que je dis, je tente une réponse : peut-être le shipout implicite de fin de fichier ?

-------

Digression :

sur le thème "je pratique la géométrie assistée par ordinateur pendant mes vacances" :

une contribution d'un autre collègue avec metapost qui vaut le détour : http://melusine.eu.org/syracuse/poulecl/Cubes/.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

mumblee
Messages : 47
Enregistré le : jeu. 11 mars 2010, 10:29
Localisation : Lille

Re: Patrons d'une pyramide

Message non lu par mumblee » sam. 5 janv. 2013, 11:12

GM a écrit :Pour la colle, sans pouvoir tester ce que je dis, je tente une réponse : peut-être le shipout implicite de fin de fichier ?

Je ne comprends pas la réponse mais il faut dire que ma question était très mal formulée.

Le code que j'ai fourni compile correctement et donne 16 fichiers PDF correspondant aux 16 patrons possibles.

Ce que je voulais dire c'est que ces fichiers sont générés dans une boucle qui termine par l'effacement de la currentpicture, donc la compilation sur le forum ne donne pas de figure. Pour en obtenir une, il faudrait procéder/coder autrement : placer tous les patrons dans une seule figure avant de faire un shipout().
  • Ce serait mieux pour le forum, mais cela serait moins souple pour l'insertion ultérieure dans un document LaTeX.
  • Je ne sais pas le faire !
    • Avec de multiples picture, j'ai des problème d'unités différentes à l'assemblage que je sais pas résoudre.
    • Avec des frame, pour travailler en unités PostScript, la routine draw ne permet pas de tracer un triangle.
  • Ce que je saurais faire, c'est utiliser les compteurs de boucles pour organiser les figures en 4 lignes de 4 figures, mais en gérant les espacement arbitrairement. Pas terrible.

Morale : il faudra qu'un jour je me penche sérieusement sur les frames, les pictures, les routines add(), align(), etc.
Fabrice Eudes
Debian Bullseye 11.4, Asymptote 2.79, texlive 2022, Emacs 27.1

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Patrons d'une pyramide

Message non lu par GM » sam. 5 janv. 2013, 11:36

mumblee a écrit :Ce que je voulais dire c'est que ces fichiers sont générés dans une boucle qui termine par l'effacement de la currentpicture, donc la compilation sur le forum ne donne pas de figure.


Là effectivement, tu t'étais mal exprimé :lol: car je ne pouvais pas deviner que tu parlais du non-affichage sur le forum, avec ce que tu avais écrit. ;-)

mumblee a écrit :Pour en obtenir une, il faudrait procéder/coder autrement : placer tous les patrons dans une seule figure avant de faire un shipout().

Laisse tomber l'idée : il y a une limitation de la taille des images : cela deviendrait trop petit.

__________

Pour éventuellement, mettre un lien vers un pdf qui contiendrait toutes les images, je rappelle éventuellement la façon de faire (avec newpage()):

Code : Tout sélectionner

import geometry;
unitsize(1mm);
 
// Procédure pour tester la présence d'une valeur entière dans un tableau d'entiers
bool test(int[] A,int n) {
  bool reponse=false;
  for (int i=0;i<A.length;++i)
    if (A[i]==n) reponse=true;
  return reponse;
}
 
// Les faces
// - on choisit un triangle, t1, comme base
// - les faces latérales sont construites cinq fois, selon leur emplacement dans le patron.
// (on doit pouvoir faire beaucoup plus simple...)
triangle t1=triangleabc(85,75,90);
triangle t2=triangleabc(55,50,75);
triangle t3=triangleabc(60,55,85);
triangle t4=triangleabc(50,60,90);
 
point pA=t1.VA, pB=t1.VB, pC=t1.VC;
triangle t2=rotate(degrees(pC-pA)-degrees(pB-pA),pA)*t2;
point pD=t2.VC;
triangle t3=rotate(degrees(pC-pB)-degrees(pA-pB),pB)*shift(pB-(point)t3.VB)*t3;
point pE=t3.VC;
triangle t4=shift(pA-pB)*rotate(180,pB)*t4;
point pF=t4.VC;
 
triangle t23=rotate(degrees(pD-pC)-degrees(pE-pC),pC)*t3;
triangle t32=rotate(-degrees(pD-pC)+degrees(pE-pC),pC)*t2;
triangle t24=rotate(-degrees(pF-pA)+degrees(pD-pA),pA)*t4;
triangle t42=rotate(degrees(pF-pA)-degrees(pD-pA),pA)*t2;
triangle t34=rotate(degrees(pE-pB)-degrees(pF-pB),pB)*t4;
triangle t43=rotate(-degrees(pE-pB)+degrees(pF-pB),pB)*t3;
triangle t234=rotate(degrees(pD-pC)-degrees(pE-pC),pC)*t34;
triangle t243=rotate(-degrees(pF-pA)+degrees(pD-pA),pA)*t43;
triangle t342=rotate(degrees(pE-pB)-degrees(pF-pB),pB)*t42;
triangle t324=rotate(-degrees(pD-pC)+degrees(pE-pC),pC)*t24;
triangle t423=rotate(degrees(pF-pA)-degrees(pD-pA),pA)*t23;
triangle t432=rotate(-degrees(pE-pB)+degrees(pF-pB),pB)*t32;
 
// Tableau des indices des liaisons face - face
// Cela donne les faces à tracer pour chaque patron
int[][] P=new int[16][2];
 
// Énumération des combinaisons des liaisons
// Hormis les 4 boucles isolant une face (qui serait alors détachée du patron)
 
// Compteur
int n=0;
 
for (int a=0;a<6;++a)
  for (int b=a+1;b<6;++b)
    for (int c=b+1;c<6;++c) {
      if (!(((a==0)&(b==1)&(c==3))|((a==0)&(b==2)&(c==4))|((a==1)&(b==2)&(c==5))|((a==3)&(b==4)&(c==5))))
   { P[n][0]=a;
     P[n][1]=b;
     P[n][2]=c;
     draw(t1);
     if (test(P[n],0)) draw(t2);
     if (test(P[n],1)) draw(t3);
     if (test(P[n],2)) draw(t4);
     if (test(P[n],0)&test(P[n],3)) draw(t23);
     if (test(P[n],0)&test(P[n],3)&test(P[n],5)) draw(t234);
     if (test(P[n],1)&test(P[n],3)) draw(t32);
     if (test(P[n],1)&test(P[n],3)&test(P[n],4)) draw(t324);
     if (test(P[n],0)&test(P[n],4)) draw(t24);
     if (test(P[n],0)&test(P[n],4)&test(P[n],5)) draw(t243);
     if (test(P[n],2)&test(P[n],4)) draw(t42);
     if (test(P[n],2)&test(P[n],4)&test(P[n],3)) draw(t423);
     if (test(P[n],1)&test(P[n],5)) draw(t34);
     if (test(P[n],1)&test(P[n],5)&test(P[n],2)) draw(t342);
     if (test(P[n],2)&test(P[n],5)) draw(t43);
     if (test(P[n],2)&test(P[n],5)&test(P[n],3)) draw(t432);
     newpage();
     ++n;
   }
    }
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

Répondre