rapporteur

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

rapporteur

Message non lu par zariski » ven. 22 mai 2020, 17:25

Bonjour !
Bon je me résigne à vous embêter mais là c'est trop dur pour moi et ce d'autant plus que la doc d'Asymptote est relativement peu épaisse.
Bref voici mon problème; en fait je rebondis sur un sujet précédent mais différent.

J'ai un joli code pour construire un rapporteur (pas de moi) et je me demande s'il serait possible de le mettre dans une sorte de "void" ou autre routine adéquate afin de l'utiliser sur une feuille dans des positions choisi par moi. Je voudrais essentiellement le placer à un point précis et lui faire subir évidemment une rotation aussi choisie par moi-même.

Voici ce que j'ai fait. Le problème c'est que je ne sais comment lui appliquer une transformation ...

Figure asymptote 5eddfbc3e6cf34ce01b347712ecf8225
*** 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.  
  2.  
  3. import geometry;
  4.  
  5. usepackage("fourier");
  6. usepackage("amsmath");
  7. usepackage("siunitx", "locale=DE");
  8.  
  9. unitsize(1cm);
  10.  
  11. void grille(int xmin, int xmax, int ymin ,int ymax){
  12. for(int k=ymin; k<=ymax; ++k)
  13. draw((xmin,k)--(xmax,k),.4bp+gray);
  14.  
  15. for(int k=xmin; k<=xmax; ++k)
  16. draw((k,ymin)--(k,ymax),.4bp+gray);
  17.  
  18. draw((xmin,0)--(xmax,0),1pt+black);
  19. draw((0,ymin)--(0,ymax),1pt+black);
  20. }
  21.  
  22.  
  23. void rapporteur(real scale=1){
  24. defaultpen(fontsize(12pt*scale)); // Stylo par défaut
  25. real r=3.5*scale; // rayon du demi-cercle intérieur : r
  26. real l=2.5*scale; // largeur du rapporteur : l
  27. real p=l/10*scale; // largeur des petites graduations
  28. real g=2p; // largeur des grandes graduations
  29.  
  30. point pO=(0,0), pA=(r,0);
  31. line droiteregle=line(0,-l);
  32. circle cercleint=circle(pO,r),
  33. cercleext=circle(pO,r+l);
  34. point[] R=intersectionpoints(droiteregle,cercleext);
  35.  
  36. path chint=arc(cercleint,pA,-pA)--cycle,
  37. chext=arc(cercleext,R[1],R[0])--cycle;
  38.  
  39. filldraw(chint^^chext,paleblue+white+evenodd,0.5bp+black);
  40.  
  41. for(int k=0; k<180; ++k){//graduation au 1/10 des 2 cercles
  42. draw(r*dir(k)--(r+p)*dir(k)^^(r+l-p)*dir(k)--(r+l)*dir(k),0.25bp+black);
  43. }
  44.  
  45. for(int k=0; k<36; ++k){//graduation au 1/5 des 2 cercles
  46. draw(r*dir(5*k)--(r+0.75g)*dir(5*k)^^(r+l-0.75g)*dir(5*k)--(r+l)*dir(5*k),0.4bp+black);
  47. }
  48.  
  49. for(int k=0; k<=18; ++k) {//graduations de 10 en 10 des 2 cercles
  50. draw(r*dir(10k)--(r+g)*dir(10k)^^(r+l-g)*dir(10k)--(r+l)*dir(10k),0.4bp+black);
  51. label(rotate(10k-90)*format("%i",10*k),(r+g)*dir(10k),dir(10k));
  52. label(rotate(90-10k)*format("%i",10*k),(r+l-g)*dir(180-10k),dir(-10k));
  53. }
  54.  
  55. int xmax=floor(R[1].x);
  56. for(int x=0; x<10*xmax; ++x){//graduation au 1/10 de la règle
  57. draw((-x/10,-l)--(-x/10,p-l)^^(x/10,-l)--(x/10,p-l),0.25bp+black);
  58. }
  59.  
  60. for(int x=0; x<=xmax; ++x) {//graduations de la règle
  61. draw((-x,-l)--(-x,g-l)^^(x,-l)--(x,g-l),0.4bp+black);
  62. label(format("%i",x),(x,g-l),N);
  63. label(format("%i",-x),(-x,g-l),N);
  64. }
  65. }
  66.  
  67.  
  68. grille(-8,8,-3,8);
  69.  
  70. rapporteur();
  71.  
Windows 11- Ubuntu 20.10 - WinEdit - TexStudio - TeXMaker - TeXLive2022

asynus
Messages : 5
Enregistré le : ven. 8 sept. 2017, 16:38

Re: rapporteur

Message non lu par asynus » mer. 27 mai 2020, 00:38

Effectivement, c'est un joli code.
Ce que je ferais, c'est de passer un objet picture en paramètre :

Code : Tout sélectionner

void rapporteur(real scale=1,picture pic=currentpicture)
en ajoutant pic à toutes les commandes de dessin de la function (1 filldraw, 5 draw et 4 label).
Puis, exécuter rapporteur(pic1) pour un object picture pic1.
Il suffit ensuite d'ajouter cet objet à currentpicture avec la transformation souhaitée, par exemple

Code : Tout sélectionner

rapporteur(pic1);
add(currentpicture,rotate(30)*pic1);
Il y a peut-être mieux !

Figure asymptote e0b60658c9f341f8b0e68101f7edb344
*** 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.  
  2. import geometry;
  3.  
  4. usepackage("fourier");
  5. usepackage("amsmath");
  6. usepackage("siunitx", "locale=DE");
  7.  
  8. unitsize(1cm);
  9.  
  10. void grille(int xmin, int xmax, int ymin ,int ymax){
  11. for(int k=ymin; k<=ymax; ++k)
  12. draw((xmin,k)--(xmax,k),.4bp+gray);
  13.  
  14. for(int k=xmin; k<=xmax; ++k)
  15. draw((k,ymin)--(k,ymax),.4bp+gray);
  16.  
  17. draw((xmin,0)--(xmax,0),1pt+black);
  18. draw((0,ymin)--(0,ymax),1pt+black);
  19. }
  20. picture pic1;
  21. void rapporteur(real scale=1,picture pic=currentpicture){
  22. defaultpen(fontsize(12pt*scale)); // Stylo par défaut
  23. real r=3.5*scale; // rayon du demi-cercle intérieur : r
  24. real l=2.5*scale; // largeur du rapporteur : l
  25. real p=l/10*scale; // largeur des petites graduations
  26. real g=2p; // largeur des grandes graduations
  27.  
  28. point pO=(0,0), pA=(r,0);
  29. line droiteregle=line(0,-l);
  30. circle cercleint=circle(pO,r),
  31. cercleext=circle(pO,r+l);
  32. point[] R=intersectionpoints(droiteregle,cercleext);
  33.  
  34. path chint=arc(cercleint,pA,-pA)--cycle,
  35. chext=arc(cercleext,R[1],R[0])--cycle;
  36.  
  37. filldraw(pic,chint^^chext,paleblue+white+evenodd,0.5bp+black);
  38.  
  39. for(int k=0; k<180; ++k){//graduation au 1/10 des 2 cercles
  40. draw(pic,r*dir(k)--(r+p)*dir(k)^^(r+l-p)*dir(k)--(r+l)*dir(k),0.25bp+black);
  41. }
  42.  
  43. for(int k=0; k<36; ++k){//graduation au 1/5 des 2 cercles
  44. draw(pic,r*dir(5*k)--(r+0.75g)*dir(5*k)^^(r+l-0.75g)*dir(5*k)--(r+l)*dir(5*k),0.4bp+black);
  45. }
  46.  
  47. for(int k=0; k<=18; ++k) {//graduations de 10 en 10 des 2 cercles
  48. draw(pic,r*dir(10k)--(r+g)*dir(10k)^^(r+l-g)*dir(10k)--(r+l)*dir(10k),0.4bp+black);
  49. label(pic,rotate(10k-90)*format("%i",10*k),(r+g)*dir(10k),dir(10k));
  50. label(pic,rotate(90-10k)*format("%i",10*k),(r+l-g)*dir(180-10k),dir(-10k));
  51. }
  52.  
  53. int xmax=floor(R[1].x);
  54. for(int x=0; x<10*xmax; ++x){//graduation au 1/10 de la règle
  55. draw(pic,(-x/10,-l)--(-x/10,p-l)^^(x/10,-l)--(x/10,p-l),0.25bp+black);
  56. }
  57.  
  58. for(int x=0; x<=xmax; ++x) {//graduations de la règle
  59. draw(pic,(-x,-l)--(-x,g-l)^^(x,-l)--(x,g-l),0.4bp+black);
  60. label(pic,format("%i",x),(x,g-l),N);
  61. label(pic,format("%i",-x),(-x,g-l),N);
  62. }
  63. }
  64.  
  65.  
  66. grille(-8,8,-3,8);
  67.  
  68. rapporteur(pic1);
  69. add(currentpicture,rotate(30)*pic1);
  70.  
Windows 10 - MiKTeX 2.9 - Asymptote 2.65 - GNU Emacs 26.2

asynus
Messages : 5
Enregistré le : ven. 8 sept. 2017, 16:38

Re: rapporteur

Message non lu par asynus » mer. 27 mai 2020, 08:42

En fait, il serait mieux de passer une transformation à rapporteur en paramètre pour n'avoir qu'à taper :

Code : Tout sélectionner

rapporteur(rotate(30));

Figure asymptote a5c220ff360dac3c4f303fab8222a9c0
*** 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.  
  2. import geometry;
  3.  
  4. usepackage("fourier");
  5. usepackage("amsmath");
  6. usepackage("siunitx", "locale=DE");
  7.  
  8. unitsize(1cm);
  9.  
  10. void grille(int xmin, int xmax, int ymin ,int ymax){
  11. for(int k=ymin; k<=ymax; ++k)
  12. draw((xmin,k)--(xmax,k),.4bp+gray);
  13.  
  14. for(int k=xmin; k<=xmax; ++k)
  15. draw((k,ymin)--(k,ymax),.4bp+gray);
  16.  
  17. draw((xmin,0)--(xmax,0),1pt+black);
  18. draw((0,ymin)--(0,ymax),1pt+black);
  19. }
  20.  
  21. void rapporteur(real scale=1,transform t=identity){
  22. picture pic;
  23. defaultpen(fontsize(12pt*scale)); // Stylo par défaut
  24. real r=3.5*scale; // rayon du demi-cercle intérieur : r
  25. real l=2.5*scale; // largeur du rapporteur : l
  26. real p=l/10*scale; // largeur des petites graduations
  27. real g=2p; // largeur des grandes graduations
  28.  
  29. point pO=(0,0), pA=(r,0);
  30. line droiteregle=line(0,-l);
  31. circle cercleint=circle(pO,r),
  32. cercleext=circle(pO,r+l);
  33. point[] R=intersectionpoints(droiteregle,cercleext);
  34.  
  35. path chint=arc(cercleint,pA,-pA)--cycle,
  36. chext=arc(cercleext,R[1],R[0])--cycle;
  37.  
  38. filldraw(pic,chint^^chext,paleblue+white+evenodd,0.5bp+black);
  39.  
  40. for(int k=0; k<180; ++k){//graduation au 1/10 des 2 cercles
  41. draw(pic,r*dir(k)--(r+p)*dir(k)^^(r+l-p)*dir(k)--(r+l)*dir(k),0.25bp+black);
  42. }
  43.  
  44. for(int k=0; k<36; ++k){//graduation au 1/5 des 2 cercles
  45. draw(pic,r*dir(5*k)--(r+0.75g)*dir(5*k)^^(r+l-0.75g)*dir(5*k)--(r+l)*dir(5*k),0.4bp+black);
  46. }
  47.  
  48. for(int k=0; k<=18; ++k) {//graduations de 10 en 10 des 2 cercles
  49. draw(pic,r*dir(10k)--(r+g)*dir(10k)^^(r+l-g)*dir(10k)--(r+l)*dir(10k),0.4bp+black);
  50. label(pic,rotate(10k-90)*format("%i",10*k),(r+g)*dir(10k),dir(10k));
  51. label(pic,rotate(90-10k)*format("%i",10*k),(r+l-g)*dir(180-10k),dir(-10k));
  52. }
  53.  
  54. int xmax=floor(R[1].x);
  55. for(int x=0; x<10*xmax; ++x){//graduation au 1/10 de la règle
  56. draw(pic,(-x/10,-l)--(-x/10,p-l)^^(x/10,-l)--(x/10,p-l),0.25bp+black);
  57. }
  58.  
  59. for(int x=0; x<=xmax; ++x) {//graduations de la règle
  60. draw(pic,(-x,-l)--(-x,g-l)^^(x,-l)--(x,g-l),0.4bp+black);
  61. label(pic,format("%i",x),(x,g-l),N);
  62. label(pic,format("%i",-x),(-x,g-l),N);
  63. }
  64. add(currentpicture,t*pic);
  65. }
  66.  
  67.  
  68. grille(-8,8,-3,8);
  69.  
  70. rapporteur(rotate(30));
  71.  
Windows 10 - MiKTeX 2.9 - Asymptote 2.65 - GNU Emacs 26.2

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

Re: rapporteur

Message non lu par GM » mer. 27 mai 2020, 17:49

Bonjour,
je n'ai pas testé la dernière fonction donnée ci-dessus (merci au contributeur) mais si elle fonctionne, il suffit de créer une surcharge de la fonction rapporteur avec cette deuxième définition :

Code : Tout sélectionner

void rapporteur(pair centre=(0,0),real angle=0){
   rapporteur(shift(centre)*rotate(angle));
}
pour permettre aussi cet usage :

Code : Tout sélectionner

rapporteur((3,2),45);
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: rapporteur

Message non lu par zariski » jeu. 28 mai 2020, 13:00

Merci beaucoup !
J'ai eu ma réponse sur mathematex de la part de l'administrateur MB.
Bonne continuation.
Windows 11- Ubuntu 20.10 - WinEdit - TexStudio - TeXMaker - TeXLive2022

Répondre