Tableau 'automatique'

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
zariski
Messages : 141
Enregistré le : dim. 30 sept. 2012, 18:50

Tableau 'automatique'

Message non lu par zariski » sam. 21 juin 2014, 12:30

Bonjour !
Ma question s'adresse à GM.
Comme vous le savez depuis l'autre jour, je réutilise un de vos codes en tâtonnant afin d'"automatiser" la création d'un tableau, simple pour l'instant.
Cependant, la taille de mes étiquettes n'est pas bonne et je ne vois pas comment y remédier.
Y a quelque chose qui me dit que ça doit venir du calcul de mon "larg" et de ma "haut"...

Code : Tout sélectionner


unitsize(1cm);


//<-------- Début de la picture tabsgn ----------------------------------->
picture tabsgn(string[][] tab, real ul=1, real kx=1.1, real ky=1.2 ,
                   pen p=0.5bp+black){

  picture pic;

  real larg,haut,xlarg, xhaut, ul=1, kx=1.1, ky=1.2 ;

  pen stylo1=fontsize(ul*10pt)+black,
      stylo2=fontsize(ul*10pt)+red;

  int n=tab.length,    // nb de lignes
      m=tab[0].length; // Nb de colonnes


  object[][] obj=new object[n][m]; //Tableau d'objet de taille nxm

//Une boucle qui détermine la largeur et la hauteur maximales des formules à
//écrire
  for(int k=0; k<n; ++k){
    for(int l=0; l<m; ++l){
    obj[k][l]=object(Label(tab[k][l],stylo1));//création d'un objet
                                              //(texte entouré d'une
                                              //enveloppe de forme
                                              //rectangulaire) qui a une
                                              //largeur et une hauteur
     larg=max(larg,(max(obj[k][l])-min(obj[k][l])).x);//les coordonnées x et
                                                      // y d'un vecteur
                                                      //"diagonale" qui est
                                                      //(max(obj[k])-min(obj[k])
     haut=max(haut,(max(obj[k][l])-min(obj[k][l])).y);
   }
   }
//Fin de la boucle



  //label(format("haut=%f",haut),(2,-1));
 // label(format("larg=%f",larg),(2,-1.5));


//label(format("Nb ligne tableau=%i",n),(2,-1));

//label(format("Nb colonne tableau=%i",m),(2,-1.5));





//------------------------------------------------------------------------>
//------------------------------------------------------------------------>
    path th=(0,0)--(m*larg,0), // premier trait horizontal
         tv=(0,0)--(0,n*haut); // premier trait vertical

   //<--------- Tracer des colonnes 1,2,3,4 ...  --------------------->
     for(int i=0; i<=m; i=i+1){
        draw(shift((larg,0))^i*tv,10bp+black);
      }
   //<--------- Fin Tracer des colonnes 1,2,3,4 ... ------------------>


   //<--------- Tracer des lignes 1,2,3,4 ...  ----------------------->
     for(int j=0; j<n+1; j=j+1){
      draw(shift((0,haut))^j*th,10bp+black);
      }
   //<--------- Fin Tracer des lignes 1,2,3,4 ... -------------------->
//--------------------------------------------------------------------->
//--------------------------------------------------------------------->



//<-----placement des objets---------------------------->
  for(int k=0; k<n; ++k){
    for(int l=0; l<m; ++l){
    label(pic,Label(tab[k][l],((2*l+1)/2*larg,(2*k+1)/2*haut),p));
      }
     }
//<------ Fin placement des objets -------------------->



  return pic;
}
//<-------- Fin de la picture tabsgn ----------------------------------->




//<----- On entre les valeurs du tableau -------------------------------->
string[][] tab={
                {"00","01","02","03","04"},
                {"10","11","12","13","Eric"},
                {"20","21","22","23",""},
                {"30","31","32","","$f(x)$"}
                };
//<----- Fin entrée des valeurs du tableau ------------------------------>




//<---- Afficher le tableau ------------------------------------->
picture tab0=tabsgn(tab,ul=1,kx=1.2,ky=1.2,p=1bp+blue);

add(tab0);
//<---- Fin Affichage du tableau --------------------------------->
Windows 11- Ubuntu 20.10 - WinEdit - TexStudio - TeXMaker - TeXLive2022

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

Re: Tableau"automatique"

Message non lu par GM » sam. 21 juin 2014, 14:34

Je viens de modifier les derniers messages... pour rendre ce sujet de nouveau accessible.

Attention à ne plus coller le code précédent entre des balises asy et /asy ! Il a planté le forum !

Je ne peux regarder ce code maintenant : je dois m'absenter.
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 !

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

Re: Tableau"automatique"

Message non lu par GM » sam. 21 juin 2014, 14:42

GM a écrit :Je ne peux regarder ce code maintenant : je dois m'absenter.
... mais je parie que cela va aller beaucoup mieux si tu mets un unitsize(1bp) et si tu n'imposes pas de d'épaisseur de trait dans le reste du code.

Je rappelle ma dernière mise en garde :
Attention... aux unités, pour la compréhension de ce que renvoient min et max.
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 !

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

Re: Tableau"automatique"

Message non lu par GM » sam. 21 juin 2014, 16:24

Il faut que TOUT soit dessiné dans pic (il a été oublié dans certaines commandes)... et ne pas oublier également le "fit()" dans la dernière commande d'ajout de tab0 à currentpicture.

Figure asymptote b46f52eadd6ebcf88571da4ca0b45dc2
*** 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. size(400);
  2.  
  3. picture tabsgn(string[][] tab, real ul=1, real kx=1.1, real ky=1.2 , pen p=black){
  4. picture pic;
  5. real larg,haut,xlarg, xhaut, ul=1, kx=1.1, ky=1.2 ;
  6. pen stylo1=black, stylo2=red;
  7. int n=tab.length, // nb de lignes
  8. m=tab[0].length; // Nb de colonnes
  9. object[][] obj=new object[n][m];
  10.  
  11. for(int k=0; k<n; ++k){
  12. for(int l=0; l<m; ++l){
  13. obj[k][l]=object(Label(tab[k][l],stylo1));
  14. larg=max(larg,(max(obj[k][l])-min(obj[k][l])).x);
  15. haut=max(haut,(max(obj[k][l])-min(obj[k][l])).y);
  16. }
  17. }
  18. path th=(0,0)--(m*larg,0), tv=(0,0)--(0,n*haut);
  19.  
  20. for(int i=0; i<=m; i=i+1){
  21. draw(pic,shift((larg,0))^i*tv,black);
  22. }
  23. for(int j=0; j<n+1; j=j+1){
  24. draw(pic,shift((0,haut))^j*th,black);
  25. }
  26. for(int k=0; k<n; ++k){
  27. for(int l=0; l<m; ++l){
  28. label(pic,Label(tab[k][l],((2*l+1)/2*larg,(2*k+1)/2*haut),p));
  29. }
  30. }
  31. return pic;
  32. }
  33. ///////////////////////////////////////////////////////////////////////////
  34. ///////////////////////////////////////////////////////////////////////////
  35. string[][] tab={
  36. {"00","01","02","03","04"},
  37. {"10","11","12","13","Eric"},
  38. {"20","21","22","23",""},
  39. {"30","31","32","","$f(x)$"}
  40. };
  41. picture tab0=tabsgn(tab,ul=1,kx=1.2,ky=1.2,blue);
  42. add(tab0.fit());
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 !

zariski
Messages : 141
Enregistré le : dim. 30 sept. 2012, 18:50

Re: Tableau 'automatique'

Message non lu par zariski » sam. 21 juin 2014, 17:57

super !!!! c'est gentil !!!
je vais regarder ça dès que possible.
Mille fois pardon pour le plantage... je savais pas
Windows 11- Ubuntu 20.10 - WinEdit - TexStudio - TeXMaker - TeXLive2022

zariski
Messages : 141
Enregistré le : dim. 30 sept. 2012, 18:50

Re: Tableau 'automatique'

Message non lu par zariski » lun. 23 juin 2014, 13:04

Bonjour !
J'ai amélioré mon code mais j'avoue me perdre dans les notions de "frame", "picture", "size" et autre "fit()" ...

Code : Tout sélectionner

usepackage("lmodern");
usepackage("fourier");
usepackage("color");
usepackage("amsmath");
usepackage("marvosym");

import x11colors;


//size(20);


//<-------- Début de la picture tabsgn ----------------------------------->
picture tabsgn(string[][] tab, real ul=1, real kx=1, real ky=1, pen p=black){

  picture pic;

  real larg,haut;

  pen stylo1=fontsize(ul*10pt);

  int n=tab.length,    // nb de lignes
      m=tab[0].length; // Nb de colonnes


  object[][] obj=new object[n][m]; //Tableau d'objet de taille nxm

//<---Une boucle qui détermine la largeur et la hauteur maximales des formules à écrire--->
  for(int k=0; k<n; ++k){
    for(int l=0; l<m; ++l){
    obj[k][l]=object(Label(tab[k][l],stylo1));//création d'un objet
                                              //(texte entouré d'une
                                              //enveloppe de forme
                                              //rectangulaire) qui a une
                                              //largeur et une hauteur
     larg=max(larg,(max(obj[k][l])-min(obj[k][l])).x);//les coordonnées x et
                                                      // y d'un vecteur
                                                      //"diagonale" qui est
                                                      //(max(obj[k])-min(obj[k])
     haut=max(haut,(max(obj[k][l])-min(obj[k][l])).y);
   }
   }
//<------------Fin de la boucle---------------------------------------->


larg=larg+kx;   // case un petit peu plus large
haut=haut+ky;  // case un petit peu plus haute


//------------------------------------------------------------------------>
//------------------------------------------------------------------------>
    path th=(0,0)--(m*larg,0), // premier trait horizontal
         tv=(0,0)--(0,n*haut); // premier trait vertical

   //<--------- Tracer des colonnes 1,2,3,4 ...  --------------------->
     for(int i=0; i<=m; i=i+1){
        draw(pic,shift((larg,0))^i*tv,black);
      }
   //<--------- Fin Tracer des colonnes 1,2,3,4 ... ------------------>


   //<--------- Tracer des lignes 1,2,3,4 ...  ----------------------->
     for(int j=0; j<n+1; j=j+1){
      draw(pic,shift((0,haut))^j*th,black);
      }
   //<--------- Fin Tracer des lignes 1,2,3,4 ... -------------------->
//--------------------------------------------------------------------->
//--------------------------------------------------------------------->



//<-----placement des objets---------------------------->
  for(int k=0; k<n; ++k){
    for(int l=0; l<m; l=l+1){
    label(pic,Label(tab[n-1-k][l],((2*l+1)/2*larg,(2*k+1)/2*haut),p));
      }
     }
//<------ Fin placement des objets -------------------->

  return pic;
}
//<-------- Fin de la picture tabsgn ----------------------------------->




//<----- On entre les valeurs du tableau -------------------------------->
string[][] tab1={
                {"$x$"   , "$-2$","$-1$","0","1","2","3","4","5","6","7"},
                {"$f(x)$", " "   ," "   ," "," "," "," "," "," "," "," "}
                };

string[][] tab2={
                {"$x$"   , "$2$","$1$","10","20","30","40","50","60","70","80"},
                {"$g(x)$", " "   ," "   ," "," "," "," "," "," "," "," "}
                };
//<----- Fin entrée des valeurs du tableau ------------------------------>




//<---- Afficher le tableau ------------------------------------->
//Il faut que TOUT soit dessiné dans pic  et ne pas oublier également
//le "fit()" dans la dernière commande d'ajout de tab0 à currentpicture.
picture tab10=tabsgn(tab1,
                    ul=2,  // taille des étiquettes; 1 pour 10pt, 1.1 pour 11 pt....
                    kx=2,  // case un petit peu plus large
                    ky=5); // case un petit peu plus haute

picture tab20=tabsgn(tab2,
                    ul=2,  // taille des étiquettes; 1 pour 10pt, 1.1 pour 11 pt....
                    kx=2,  // case un petit peu plus large
                    ky=5); // case un petit peu plus haute

add(tab10.fit());
add(tab20.fit(),(0,min(currentpicture).y-80pt));

//<---- Fin Affichage du tableau --------------------------------->

Windows 11- Ubuntu 20.10 - WinEdit - TexStudio - TeXMaker - TeXLive2022

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

Re: Tableau 'automatique'

Message non lu par GM » lun. 23 juin 2014, 16:13

Pas de problème de compilation et de rendu avec le dernier code : n'est ce pas ce ce que tu souhaites ? Encore un problème ?
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 !

zariski
Messages : 141
Enregistré le : dim. 30 sept. 2012, 18:50

Re: Tableau 'automatique'

Message non lu par zariski » lun. 23 juin 2014, 16:26

ça marche bien sûr mais comme je ne maitrise pas tout, ben ça m'agace.
Dur dur les "frame" "picture" "size" et autres subtilités !!!
Maintenant il faudrait que je m'attaque au remplissage optionnel des cases du tableau, le tracer des filets, bref y a encore du boulot.
Merci encore pour tout, vous êtes le seul référent Asy dans ce pays, bravo.
Windows 11- Ubuntu 20.10 - WinEdit - TexStudio - TeXMaker - TeXLive2022

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

Re: Tableau 'automatique'

Message non lu par GM » lun. 23 juin 2014, 16:48

zariski a écrit :ça marche bien sûr mais comme je ne maitrise pas tout, ben ça m'agace.
Dur dur les "frame" "picture" "size" et autres subtilités !!!
Je partage ce point de vue : je ne pratique pas souvent ce genre de subtilités, et j'oublie vite... donc il m'arrive aussi fréquemment de tâtonner, pour obtenir ce que je veux.
Heureusement que l'on me pose des questions pour rester un peu dans le coup ! :mrgreen:
zariski a écrit :Maintenant il faudrait que je m'attaque au remplissage optionnel des cases du tableau, le tracer des filets, bref y a encore du boulot.
Bon courage.

Moi je suis tout autre chose : j'alterne bricolage... et création d'un site facilitant la création de q.c.m. (pour plusieurs thématiques)... et suivi des progrès des personnes autorisées à s'en servir.
zariski a écrit :... vous êtes le seul référent Asy dans ce pays, bravo.
Houla... je dois rectifier.
Je ne suis que :
  • un amateur avec un peu plus de pratique que d'autres amateurs ;
  • quelqu'un qui dégaine des réponses un peu plus vite que d'autres... du simple fait que je suis un peu, voire beaucoup, plus connecté que d'autres.
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