Page 1 sur 1

Définir un nouveau type de flèche pour Asymptote

Posté : jeu. 8 mars 2012, 19:11
par GM
Ce message fait suite à celui-ci sur un problème de rendu 3D où la discussion a dérivé pour finir en un discussion sur la forme des pointes de flèches.

Tout est partie d'une discussion, où Fabrice nous a déclaré son grand intérêt pour les flèches "à la pstricks" :
Image



D'où la question : comment faire avec Asymptote pour se faire un style personnel de type de flèche ?

--------------------------

Une première idée où on utilise un type de flèche existant... pour en créer un nouveau en modifiant que quelques paramètres.

Figure asymptote 6398bdb3d6df04240b5b62bf344087e0
*** 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 math;
  2. add(grid(9,6,gray));
  3.  
  4. /////////////////////////////////////////////////////////
  5. ////// A mettre dans un fichier perso.asy dans home/.asy
  6. ////// et ajouter dans les figures : import perso;
  7. /////////////////////////////////////////////////////////
  8. arrowhead guillaumetellHead=HookHead(dir=10);
  9. guillaumetellHead.size=new real(pen p)
  10. {
  11. static real hcoef=6;
  12. return hcoef*arrowtexfactor*linewidth(p);
  13. };
  14. arrowbar guillaumetell=Arrow(guillaumetellHead);
  15. ///////////////////////////////////////////////////
  16. ///////////////////////////////////////////////////
  17.  
  18.  
  19.  
  20. size(200);
  21. draw("$\vec{u}$",(1,4)--(5,3),1bp+red,guillaumetell);
  22. draw("$\vec{v}$",(8,5)--(5,1),1bp+blue,guillaumetell);

Re: Définir un nouveau type de flèche pour Asymptote

Posté : jeu. 8 mars 2012, 21:25
par GM
Une deuxième idée : on récupère la définition de DefaultHead dans plain_arrows.asy... et on bidouille un peu sans forcément tout comprendre... :mrgreen: et avec un peu de miterjoin (qui fait de cette solution quelque chose de non satisfaisant : les bleues semblent correspondre à ce qui était attendu... mais cela déconne si on n'utilise pas miterjoin. :| ), on obtient cela :

Figure asymptote 0a0427c417f22500729703d20c9fad7c
*** 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. arrowhead MyHead;
  2. MyHead.head=new path(path g, position position=EndPoint, pen p=currentpen,
  3. real size=0, real angle=arrowangle) {
  4. arrowfactor=3;
  5. if(size == 0) size=MyHead.size(p);
  6. bool relative=position.relative;
  7. real position=position.position.x;
  8. if(relative) position=reltime(g,position);
  9. path r=subpath(g,position,0);
  10. pair x=point(r,0);
  11. real t=arctime(r,size);
  12. pair y=point(r,t);
  13. path base=arrowbase(r,y,t,size);
  14. path left=rotate(-angle,x)*r;
  15. path right=rotate(angle,x)*r;
  16. real[] T=arrowbasepoints(base,left,right);
  17. return subpath(left,0,T[0])--point(r,.5*t)--subpath(right,T[1],0)&cycle;
  18. };
  19.  
  20. size(300);
  21. real a=0;
  22. draw((a,0)--(a+4,4),.5bp+red,Arrow(MyHead));
  23. draw((++a,0)--(a+4,4),.5bp+blue+miterjoin,Arrow(MyHead));
  24. draw((++a,0)--(a+4,4),1bp+red,Arrow(MyHead));
  25. draw((++a,0)--(a+4,4),1bp+blue+miterjoin,Arrow(MyHead));
  26. draw((++a,0)--(a+4,4),1.5bp+red,Arrow(MyHead));
  27. draw((++a,0)--(a+4,4),1.5bp+blue+miterjoin,Arrow(MyHead));
  28. draw((++a,0)--(a+4,4),2bp+red,Arrow(MyHead));
  29. draw((++a,0)--(a+4,4),2bp+blue+miterjoin,Arrow(MyHead));
  30. draw((++a,0)--(a+4,4),2bp+red);


------

J'essaierai d'y réfléchir un peu plus sérieusement à une prochaine période de vacances : je retourne à mes copies.

Re: Définir un nouveau type de flèche pour Asymptote

Posté : dim. 15 avr. 2012, 21:14
par OG
Question flèches, je ne connais pas celles de Pstricks, sont-elles pointues même si le trait est épais ?
(parce qu'avec asymptote il semble que le pinceau soit le même que pour tracer le segment et la flèche).
Sinon dans le code il manque des choses concernant la structure de MyHead, il y a besoin de définir
head, size, arcsize et filltype). Définir size est important car deux appels l'un après l'autre ne donnent pas
la même flèche

Figure asymptote 42d2678cdd08c8a6611a8adeb81f65ee
*** 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. arrowhead MyHead;
  2. MyHead.head=new path(path g, position position=EndPoint, pen p=currentpen,
  3. real size=0, real angle=arrowangle) {
  4. arrowfactor=3;
  5. if(size == 0) size=MyHead.size(p);
  6. bool relative=position.relative;
  7.  
  8. real position=position.position.x;
  9. if(relative) position=reltime(g,position);
  10. path r=subpath(g,position,0);
  11. pair x=point(r,0);
  12. real t=arctime(r,size);
  13. pair y=point(r,t);
  14. path base=arrowbase(r,y,t,size);
  15. path left=rotate(-angle,x)*r;
  16. path right=rotate(angle,x)*r;
  17. real[] T=arrowbasepoints(base,left,right);
  18. return subpath(left,0,T[0])--point(r,.5*t)--subpath(right,T[1],0)&cycle;
  19. };
  20.  
  21. size(300);
  22. real a=0;
  23. draw((a,0)--(a+4,4),.5bp+red,Arrow(MyHead));
  24. draw((++a,0)--(a+4,4),.5bp+red,Arrow(MyHead));


O.G.

Re: Définir un nouveau type de flèche pour Asymptote

Posté : dim. 15 avr. 2012, 21:47
par GM
OG a écrit :Question flèches, je ne connais pas celles de Pstricks, sont-elles pointues même si le trait est épais ?

Je crois que oui... et je trouve que c'est ce qui serait appréciable, comme nouveau type de flèche.

OG a écrit :(parce qu'avec asymptote il semble que le pinceau soit le même que pour tracer le segment et la flèche).

Bein oui, j'ai cru comprendre comme toi... :-(

Re: Définir un nouveau type de flèche pour Asymptote

Posté : dim. 15 avr. 2012, 22:10
par OG
En fait non tu peux juste remplir la forme, donc si la forme est pointue ce sera ok.
TeXHead est programmée comme cela mais elle n'est pas pointue. Si le raccord
était mauvais avant c'est que la ligne est collée au zéro de la flèche, cela se voit
avec TeXHead.

Vite fait voici ce que cela donne

Figure asymptote 8cee660d4e8b4bdb95d9d110e232fd83
*** 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. arrowhead MyHead;
  2.  
  3. MyHead.size=new real(pen p)
  4. {
  5. static real hcoef=2.1; // 84/40=abs(base-hint)/base_height
  6. return hcoef*arrowtexfactor*linewidth(p);
  7. };
  8. MyHead.arcsize=MyHead.size;
  9.  
  10. MyHead.head=new path(path g, position position=EndPoint, pen p=currentpen,
  11. real size=0, real angle=arrowangle) {
  12. static real wcoef=1/84; // 1/abs(base-hint)
  13. static path texhead=scale(wcoef)*
  14. ((0,20)--(-128,106) --(84,0)--(-128,-106)--(0,-20)--cycle);
  15.  
  16. if(size == 0) size=TeXHead.size(p);
  17. path gp=scale(size)*texhead;
  18. bool relative=position.relative;
  19. real position=position.position.x;
  20. if(relative) position=reltime(g,position);
  21. path r=subpath(g,position,0);
  22. pair y=point(r,arctime(r,size));
  23. return shift(y)*rotate(degrees(-dir(r,arctime(r,0.5*size))))*gp;
  24. };
  25.  
  26.  
  27.  
  28. MyHead.defaultfilltype=new filltype(pen p) {return Fill(p);};
  29.  
  30.  
  31. size(300);
  32. real a=0;
  33. draw((a,0)--(a+4,4),.5bp+red,Arrow(MyHead));
  34. draw((++a,0)--(a+4,4),.5bp+red,Arrow(MyHead));
  35. draw((++a,0)--(a+4,4),.5bp+blue+miterjoin,Arrow(MyHead));
  36. draw((++a,0)--(a+4,4),1bp+red,Arrow(MyHead));
  37. draw((++a,0)--(a+4,4),1bp+blue+miterjoin,Arrow(MyHead));
  38. draw((++a,0)--(a+4,4),1.5bp+red,Arrow(MyHead));
  39. draw((++a,0)--(a+4,4),1.5bp+blue+miterjoin,Arrow(MyHead));
  40. draw((++a,0)--(a+4,4),2bp+red,Arrow(MyHead));
  41. draw((++a,0)--(a+4,4),2bp+blue+miterjoin,Arrow(MyHead));
  42. draw((++a,0)--(a+4,4),2bp+red);

Re: Définir un nouveau type de flèche pour Asymptote

Posté : lun. 16 avr. 2012, 00:00
par GM
Bien vu pour TeXhead, c'est effectivement celle-là dont j'aurais dû m'inspirer.
Merci.

Figure asymptote 144febb23b9ee002ffdfb495c5c4a549
*** 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.  
  4. arrowhead MyHead;
  5.  
  6. MyHead.size=new real(pen p)
  7. {
  8. static real hcoef=2.1; // 84/40=abs(base-hint)/base_height
  9. return hcoef*arrowtexfactor*linewidth(p);
  10. };
  11. MyHead.arcsize=MyHead.size;
  12.  
  13. MyHead.head=new path(path g, position position=EndPoint, pen p=currentpen,
  14. real size=0, real angle=arrowangle) {
  15. static real wcoef=1/84; // 1/abs(base-hint)
  16. static path texhead=scale(wcoef)*
  17. ((-125,20)--(-350,120) --(84,0)--(-350,-120)--(-125,-20)--cycle);
  18.  
  19. if(size == 0) size=TeXHead.size(p);
  20. path gp=scale(size)*texhead;
  21. bool relative=position.relative;
  22. real position=position.position.x;
  23. if(relative) position=reltime(g,position);
  24. path r=subpath(g,position,0);
  25. pair y=point(r,arctime(r,size));
  26. return shift(y)*rotate(degrees(-dir(r,arctime(r,0.5*size))))*gp;
  27. };
  28.  
  29. MyHead.defaultfilltype=new filltype(pen p) {return Fill(p);};
  30.  
  31. ///////////////////////////////////////////////////////////
  32. ///////////////////////////////////////////////////////////
  33.  
  34. unitsize(100);
  35. path p=(0,0)--(1,2);
  36. transform t=shift(1,0);
  37. draw(p,.5bp+blue,Arrow(MyHead));
  38. draw(t*p,1bp+blue,Arrow(MyHead));
  39. draw(t^2*p,1.5bp+blue,Arrow(MyHead));
  40. draw(t^3*p,2bp+blue,Arrow(MyHead));