Page 1 sur 1

Outils du profs de maths

Posté : jeu. 11 mars 2010, 10:53
par GM
En attendant d'éventuelles figures d'une régle, d'un compas, ...

... voilà celle possible d'un rapporteur :

Figure asymptote 2a1ba4213805c55fcd66937909b45d4c
*** 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. unitsize(.8cm);
  2. import geometry;
  3.  
  4. defaultpen(fontsize(8pt)); // Stylo par défaut
  5.  
  6. real r=5; // rayon du demi-cercle intérieur : r
  7. real l=2.5; // largeur du rapporteur : l
  8. real p=l/10; // largeur des petites graduations
  9. real g=2p; // largeur des grandes graduations
  10.  
  11. point pO=(0,0), pA=(r,0);
  12. line droiteregle=line(0,-l);
  13. circle cercleint=circle(pO,r),
  14. cercleext=circle(pO,r+l);
  15. point[] R=intersectionpoints(droiteregle,cercleext);
  16.  
  17. for(int a=0; a<=6; ++a) draw(pO--r*dir(a*30),gray);
  18. path chint=arc(cercleint,pA,-pA)--cycle,
  19. chext=arc(cercleext,R[1],R[0])--cycle;
  20. filldraw(chint^^chext,paleblue+white+evenodd,1bp+black);
  21. draw((r+l)*dir(45)--pO--(r+l)*dir(135),red);
  22.  
  23. for(int k=0; k<180; ++k)
  24. draw(r*dir(k)--(r+p)*dir(k)^^(r+l-p)*dir(k)--(r+l)*dir(k),.4bp+gray);
  25.  
  26. for(int k=0; k<=18; ++k) {
  27. draw(r*dir(10k)--(r+g)*dir(10k)^^(r+l-g)*dir(10k)--(r+l)*dir(10k),.6bp+blue);
  28. label(rotate(10k-90)*format("%i",10*k),(r+g)*dir(10k),dir(10k));
  29. label(rotate(90-10k)*format("%i",10*k),(r+l-g)*dir(180-10k),dir(-10k));
  30. }
  31. int xmax=floor(R[1].x);
  32. for(int x=0; x<10*xmax; ++x)
  33. draw((-x/10,-l)--(-x/10,p-l)^^(x/10,-l)--(x/10,p-l),.4bp+gray);
  34. for(int x=0; x<=xmax; ++x) {
  35. draw((-x,-l)--(-x,g-l)^^(x,-l)--(x,g-l),.6bp+blue);
  36. label(format("%i",x),(x,g-l),N);
  37. label(format("%i",-x),(-x,g-l),N);
  38. }

Re: Outils du profs de maths

Posté : dim. 24 mai 2015, 21:42
par micercle
Dans les outils du prof de math, je propose les tables de sinus et cosinus "de poche" à la manière d'un abaque d'une époque antérieure à celle glorieuse des calculatrices et de la règle à calcul. J'ai trouvé ça dans le dernier numéro de la bibliothèque Tangente consacré aux angles.

J'envisage de le faire construire en vrai avec un système de loupes mobiles pour lire sur les arcs.

Voici le code, qui peut certainement être amélioré, ne pas se gêner :).

Micercle

Figure asymptote 7263b60b2eacd6b1710234395a477a62
*** 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. import graph;
  2. import math;
  3. usepackage("amsmath");
  4. size(15cm,15cm,Aspect);
  5.  
  6. pair O=(0,0), A, B, C, D;
  7. real R[], u = 1cm;
  8. path cercle[];
  9. int n= 100;
  10.  
  11. R[1] = 13u;
  12. R[2] = R[1]/2;
  13.  
  14. // Définition et tracé du cadre
  15. A = shift(R[1],0)*O;
  16. B = shift(0,R[1])*O;
  17.  
  18. void test(real theta)
  19. {
  20. real angle = radians(theta);
  21. pair P =R[1]*(cos(angle),sin(angle));
  22. // write(P);
  23. dot("P",P,red);
  24. draw(O--P,red);
  25. //
  26. pair Q = (0,ypart(P));
  27. draw(P--Q,red);
  28. dot("Q",Q,red);
  29. }
  30. path cadre(pair point, real R)
  31. {
  32. return arc(point,R,0,90)--point--shift(R,0)*point;
  33. }
  34.  
  35. draw(cadre(O,R[1]),linewidth(0.5bp));
  36.  
  37. path trait1,trait2,trait3;
  38.  
  39. real longueur = 1u;
  40. real longueur1 = 0.05*u;
  41. real longueur2 = 0.10*u;
  42. real longueur3 = 0.20*u;
  43. real longueur4 = 0.25*u;
  44. real longueur5 = 0.35*u;
  45. real longueur6 = 0.5*u;
  46.  
  47. // Tracé des graduations du cadre
  48. for (int i=0; i <=n; ++i)
  49. {
  50. if (i%5 != 0){
  51. longueur = longueur2;
  52. }else{
  53. longueur = longueur3;
  54. label(format("% 0.2f ",i/n), shift(-longueur,(i/n)*R[1])*O,+0.2W); //,+0.2W
  55. label(format("% 0.2f ",i/n), shift((i/n)*R[1],-longueur)*O,+0.4S);//,+0.4S
  56. }
  57. trait1 = O--shift(0,-longueur)*O;
  58.  
  59. // Graducations sur l'axe horizontal
  60. draw(shift((i/n)*R[1],0)*trait1,linewidth(0.5bp));
  61. // Graducations sur l'axe vertical
  62. draw(shift(0,(i/n)*R[1])*rotate(-90)*trait1,linewidth(0.5bp));
  63. }
  64.  
  65. // Tracé des degrés sur la cercle
  66. real i= 0;
  67. while (i <= 90)
  68. {
  69. if (2*i % 2 == 0){
  70. longueur = longueur2;}
  71. if (i % 5 == 0){
  72. if (i % 10 == 0){
  73. longueur = longueur4;
  74. }else{
  75. longueur = longueur3;
  76. }
  77. Label toto= format("%1f ",i);
  78. label(rotate(-90+i)*toto,rotate(i)*shift(R[1]+longueur5,0)*O, black);
  79. }
  80. if (2*i % 2 == 1){
  81. longueur = longueur1;
  82. }
  83. trait1 = shift(R[1],0)*(O--shift(longueur,0)*O);
  84. draw(rotate(i,O)*trait1);
  85. i = i + .5;
  86. }
  87. draw(arc(O,R[1]+longueur2,0,90),linewidth(0.5bp));
  88. draw(arc(O,R[1]+longueur6,0,90),linewidth(0.5bp));
  89.  
  90. // tracé des cercles de Cosinus et Sinus
  91. C = (R[1]/2,0);
  92. real epaisseur = 1*longueur/3;
  93.  
  94. // Cercle des Cosinus
  95. cercle[1] = arc(O,R[1]/2,0,180);
  96. cercle[2] = arc(O,R[1]/2-epaisseur,0,180);
  97. draw(shift(C)*cercle[1],linewidth(0.5bp));
  98. draw(shift(C)*cercle[2],linewidth(0.5bp));
  99.  
  100. // Cercle des Sinus
  101. D = rotate(90)*C;
  102. cercle[3] = shift(D)*rotate(-90)*cercle[1];
  103. cercle[4] = shift(D)*rotate(-90)*cercle[2];
  104. draw(cercle[3],linewidth(0.5bp));
  105. draw(cercle[4],linewidth(0.5bp));
  106.  
  107. // Graduation des arcs de Cosinus
  108. trait1 = shift(0,R[1]/2-epaisseur)*(C--shift(0,epaisseur)*C);
  109. trait2 = shift(0,R[1]/2-epaisseur/2)*(C--shift(0,epaisseur/2)*C);
  110.  
  111. Label toto;
  112.  
  113. void pointC(int i)
  114. {
  115. real abs = i/1000*R[1];
  116. real x = abs^2/R[1];
  117. real y = sqrt(R[2]^2-(x-xpart(C))^2);
  118. toto = format("%.2f",abs/R[1]);
  119. pair T = (x,y);
  120. if (i % 10 ==0){
  121. real delta;
  122. if (i <= 100){
  123. delta = 1-0.75*epaisseur/100;
  124. }else{
  125. delta = 1.0075;
  126. }
  127. draw(rotate(2*degrees(angle(T))-90)*scale(0.35)*toto,shift((T-C)*delta)*C);
  128. }
  129. path trait;
  130. trait1 = C--shift(0,-epaisseur)*C;
  131. trait2 = C--shift(0,-epaisseur/2)*C;
  132. if (i % 5 ==0){
  133. trait = trait1;
  134. }else{
  135. trait = trait2;
  136. }
  137. draw(rotate(2*degrees(angle(T))-90,T)*shift(T-C)*trait);
  138. }
  139.  
  140. void pointS(int i)
  141. {
  142. real abs = i/1000*R[1];
  143. real y = abs^2/R[1];
  144. real x = sqrt(R[2]^2-(y-ypart(D))^2);
  145. toto = format("%.2f",abs/R[1]);
  146.  
  147. pair T = (x,y);
  148. if (i % 10 ==0){
  149. real delta;
  150. if (i <= 100 ){
  151. delta = 1-0.75*epaisseur/100;
  152. }else{
  153. delta = 1.01;
  154. }
  155. if (i != 710){
  156. draw(rotate(2*degrees(angle(T))-90)*scale(0.35)*toto,shift((T-D)*delta)*D);
  157. }
  158. }
  159.  
  160. path trait;
  161. trait1 = D--shift(-epaisseur,0)*D;
  162. trait2 = D--shift(-epaisseur/2,0)*D;
  163. if (i % 5 ==0){
  164. trait = trait1;
  165. }else{
  166. trait = trait2;
  167. }
  168. draw(rotate(2*degrees(angle(T))-90,T)*shift(T-D)*trait);
  169. }
  170.  
  171. for (int i = 2; i <= 1000; i = i +2){
  172. pointC(i);
  173. pointS(i);
  174. }
  175.  
  176. // Schéma de principe
  177. pair M = R[1]*.76*(1,1);
  178. real r= 3.5u;
  179. dot("M",M,SW);
  180.  
  181. draw(cadre(M, r));
  182. real theta = 35;
  183. real angle = radians(theta);
  184. pair P =M + r*(cos(angle),sin(angle));
  185.  
  186. dot("$P$",P);
  187. draw(M--P);
  188. pair Q1 = (xpart(M),ypart(P));
  189. pair Q2 = (xpart(P),ypart(M));
  190. draw(Q1--P--Q2,dashed);
  191. dot("$\sin \alpha$",Q1,W);
  192. dot("$\cos \alpha$",Q2,S);
  193. draw(arc(shift(r/2,0)*M,r/2,0,180));
  194. draw(arc(shift(0,r/2)*M,r/2,-90,90));
  195. draw(arc(M,xpart(Q2)-xpart(M),0,theta));
  196. draw(arc(M,r/5,0,theta));
  197. label("$\alpha$", rotate(theta/2,M)*shift(r/5,0)*M,W);
  198. dot("$\cos \alpha$", rotate(theta,M)*Q2,N);
  199. draw(rotate(theta,M)*Q2--shift(r,0)*M);
  200.  
  201. dot("$\sin \alpha$", rotate(theta-90,M)*Q1,SE);
  202. draw(shift(0,r)*M--rotate(theta-90,M)*Q1);
  203. draw(arc(M,ypart(Q1)-ypart(M),theta,90));
  204.  
  205. draw(arc(M,xpart(Q2)-xpart(M),0,theta));
  206.  
  207. draw(arc(shift(0,r)*M,r/5,-90,-90+theta));
  208. label("$\alpha$", rotate(theta/2,shift(0,r)*M)*shift(0,4r/5)*M,N);

Re: Outils du profs de maths

Posté : lun. 25 mai 2015, 06:15
par GM
micercle a écrit :Voici le code, qui peut certainement être amélioré, ne pas se gêner :).
Je me suis contenté d'indenter le code pour faciliter la lecture sur le forum.

Mais on voit, qu'il y aurait effectivement possibilité d'améliorer...puisque, j'ai réduit de moitié les valeurs passées à size (pour que l'image ne soit pas trop grande sur le forum) et cela induit un mauvais placement de certains labels et surtout un problème de taille des écritures.

L'idée me semble très intéressante,
la solution me semble (mais ce n'est qu'une impression, sans avoir analysé le code) fort longue.

Si je n'oublie pas, je reviendrai ultérieurement (pas avant juillet) sur cette figure, pour voir s'il est possible de réduire le code
et surtout, pour voir s'il est possible de gérer les étiquettes pour qu'elles ne soient plus sensibles au changement des valeurs passées à size (en faisant du "deferred drawing") : mon avis est que si on réduit les valeurs passées à size, il faut réduire le nombre d'étiquettes mais pas leur taille.

Si on devait réussir ultérieurement à améliorer le code... je signale, déjà, que la proposition initiale et ma réponse seront déplacées dans http://asy.gmaths.net/forum/demandes-d-aide-f15/, pour ne garder dans ce sujet qu'une version optimale.