Page 1 sur 1

rapporteur

Posté : ven. 22 mai 2020, 17:25
par zariski
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.  

Re: rapporteur

Posté : mer. 27 mai 2020, 00:38
par asynus
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.  

Re: rapporteur

Posté : mer. 27 mai 2020, 08:42
par asynus
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.  

Re: rapporteur

Posté : mer. 27 mai 2020, 17:49
par GM
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);

Re: rapporteur

Posté : jeu. 28 mai 2020, 13:00
par zariski
Merci beaucoup !
J'ai eu ma réponse sur mathematex de la part de l'administrateur MB.
Bonne continuation.