Page 1 sur 1

envelope & deferred drawing

Posté : lun. 20 août 2012, 08:56
par GM
Un exemple déposé sur mathematex, il y a 18 mois, qui répondait à une demande.

Je mets une copie de l'exemple ici car :
  • je viens de réaliser que certaines images que je mettais, à l'époque, en ligne avec imageshack.us, ne sont plus disponibles et donc j'imagine que toutes les images dans ce cas vont avoir le même sort ;
  • je le trouvais intéressant à faire... même si il faudrait le revoir pour l'optimiser.

Figure asymptote d99543489fd6f490782d25f42b6f7721
*** 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. real u=3;
  2. unitsize(u*cm);
  3. texpreamble("\newcommand{\dfrac}[2]{\displaystyle\frac{#1}{#2}}");
  4. string[] s={"$\dfrac{4}{5}$",
  5. "$=$",
  6. "$\dfrac{\ldots\vphantom{1}}{15}$",
  7. "$=$",
  8. "$\dfrac{20}{\ldots}$",
  9. "$=$",
  10. "$\dfrac{\ldots\vphantom{1}}{20}$"
  11. };
  12. envelope[] env={box,box, box, box, box,box, roundbox};
  13. pen[] couleur={red,nullpen,blue,nullpen,red,nullpen,blue};
  14.  
  15. object[] obj=new object[s.length];
  16. real dx=0;
  17. for(int k=0; k<s.length; ++k){
  18. obj[k] = object(Label(scale(u)*s[k],(dx,0),Align,basealign),env[k],couleur[k]);
  19. dx+=((max(obj[k])-min(obj[k])).x/(u*cm));
  20. }
  21.  
  22. frame o=pack(align=realEpsilon*E,obj[0],obj[1],obj[2],obj[3],obj[4],obj[5],obj[6]);
  23. add(o);
  24.  
  25. draw((0,0)--(truepoint(E).x,0),dotted+red);
  26.  
  27. add(new void(picture pic, transform t) {
  28. transform it=inverse(t);
  29.  
  30. // Flèche noire
  31. draw(pic,point(obj[0],N,t){N}..tension 3 ..{S}point(obj[6],N,t),ArcArrows);
  32.  
  33. // Flèche verte
  34. path flecheverte = point(obj[0],S,t){S}.. {N}point(obj[2],S,t);
  35. pair posplus= point(flecheverte,.7);
  36. Label labplus=scale(.5)*"+",
  37. labelvert=Label(labplus,posplus);
  38. object lab = object(labelvert,box,nullpen);
  39.  
  40. draw(pic,flecheverte,.8green,ArcArrows);
  41.  
  42. // Flèche bleue
  43. draw(pic,(it*point(lab,S,t){SE}..tension 2 ..{N}point(obj[6],S,t)),blue,ArcArrow);
  44.  
  45. // Ajout du +
  46. label(pic,scale(u)*labplus,posplus,Fill(white));
  47. });