Page 1 sur 1

Tableau 'automatique'

Posté : sam. 21 juin 2014, 12:30
par zariski
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 --------------------------------->

Re: Tableau"automatique"

Posté : sam. 21 juin 2014, 14:34
par GM
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.

Re: Tableau"automatique"

Posté : sam. 21 juin 2014, 14:42
par GM
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.

Re: Tableau"automatique"

Posté : sam. 21 juin 2014, 16:24
par GM
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());

Re: Tableau 'automatique'

Posté : sam. 21 juin 2014, 17:57
par zariski
super !!!! c'est gentil !!!
je vais regarder ça dès que possible.
Mille fois pardon pour le plantage... je savais pas

Re: Tableau 'automatique'

Posté : lun. 23 juin 2014, 13:04
par zariski
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 --------------------------------->


Re: Tableau 'automatique'

Posté : lun. 23 juin 2014, 16:13
par GM
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 ?

Re: Tableau 'automatique'

Posté : lun. 23 juin 2014, 16:26
par zariski
ç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.

Re: Tableau 'automatique'

Posté : lun. 23 juin 2014, 16:48
par GM
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.