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

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 !
Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1434
Enregistré le : dim. 7 mars 2010, 14:50

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

Message non lu par GM » jeu. 8 mars 2012, 19:11

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);
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 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.66)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.66-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.66-? git) + TexLive2018
Merci de préciser la votre !

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

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

Message non lu par GM » jeu. 8 mars 2012, 21:25

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.
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 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.66)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.66-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.66-? git) + TexLive2018
Merci de préciser la votre !

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

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

Message non lu par OG » dim. 15 avr. 2012, 21:14

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.

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

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

Message non lu par GM » dim. 15 avr. 2012, 21:47

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... :-(
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 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.66)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.66-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.66-? git) + TexLive2018
Merci de préciser la votre !

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

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

Message non lu par OG » dim. 15 avr. 2012, 22:10

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);

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

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

Message non lu par GM » lun. 16 avr. 2012, 00:00

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));
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 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.66)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.66-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.66-? git) + TexLive2018
Merci de préciser la votre !

Répondre