Page 1 sur 1

Label intégré à une flèche

Posté : dim. 14 oct. 2012, 10:43
par mumblee
Bonjour,

En fait, cette demande est liée à mon message précédent portant sur les flèches.

La solution donnée par Gaëtan me convient très bien ; j'ai même presque compris le code. Il y a quand même la ligne donnant le point d'intersection (enfin la valeur réelle du paramètre correspondant au point d'intersection sur le chemin) qui reste mystérieuse.

Code : Tout sélectionner

real[] T=intersect(F.p,c--2*(m+realmult(rectify(dir),M-m))-c);

Je ne comprends pas le calcul du point "2*(m...)-c". En particulier la commande "rectify(dir)" que je ne trouve pas dans la doc d'asymptote (j'ai la version 2.15)

Bref, j'essaie d'ajouter des cercles au milieu des flèches, mais cela pourrait être des ellipses ou autre, et j'ai l'impression que je m'y prends mal. J'ai essayé d'utiliser un marker personnalisé (merci la gallerie) ou le marker prédéfini CircleBarIntervalMarker mais j'ai dû en faire une copie modifiée car cette routine trace le disque sans tracer le cercle indépendamment (c'est un constat, pas une critique).

Voici ma tentative. Ça me semble super lourd pour le résultat voulu. Est-ce qu'il serait plus malin de définir une nouvelle flèche ? Je n'ai jamais fait...

Figure asymptote f4e8eff6dea0574f562167158a083656
*** 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 markers;
  2. size(10cm);
  3.  
  4. struct forme{
  5. path p;
  6. pair c;
  7. void operator init(path p, pair c=(0,0)){
  8. this.c=c;
  9. this.p=shift(-0.5*(min(p)+max(p)))*p;
  10. }
  11. void draw(picture pic=currentpicture,
  12. pen drawpen=currentpen+bp,
  13. pen fillpen=invisible,
  14. bool centreO=false){
  15. if(centreO){
  16. filldraw(pic, this.p, fillpen, drawpen);
  17. }else{
  18. filldraw(pic, shift(this.c)*this.p, fillpen, drawpen);
  19. }
  20. }
  21. }
  22.  
  23. pair point(forme F, pair dir, transform t=identity())
  24. {
  25. pair m=min(F.p);
  26. pair M=max(F.p);
  27. pair c=0.5*(m+M);
  28. pair z=t*F.c;
  29. real[] T=intersect(F.p,c--2*(m+realmult(rectify(dir),M-m))-c);
  30. if(T.length == 0) return z;
  31. return z+t*point(F.p,T[0]);
  32. }
  33.  
  34. frame circlebarframeBord(int n=1, real barsize=0,
  35. real radius=0,real angle=0,
  36. pair offset=0, pen p=currentpen,
  37. filltype filltype=NoFill, bool above=false)
  38. {
  39. if(barsize == 0) barsize=barmarksize(p);
  40. if(radius == 0) radius=circlemarkradius(p);
  41. frame opic;
  42. path g=circle(offset,radius);
  43. frame f=stickframe(n,barsize,space=2*radius/(n+1),angle,offset,p);
  44. if(above) {
  45. add(opic,f);
  46. filltype.fill(opic,g,p);
  47. draw(opic,g,p);
  48. } else {
  49. filltype.fill(opic,g,p);
  50. draw(opic,g,p);
  51. add(opic,f);
  52. }
  53. return opic;
  54. }
  55.  
  56. marker CircleBarIntervalMarkerBord(int i=2, int n=1, real barsize=0, real radius=0,
  57. real angle=0, pair offset=0, bool rotated=true,
  58. pen p=currentpen, filltype filltype=NoFill,
  59. bool circleabove=false, frame uniform=newframe,
  60. bool above=true)
  61. {
  62. return marker(uniform,markinterval(i,circlebarframeBord(n,barsize,radius,angle,
  63. offset,p,filltype,
  64. circleabove),
  65. rotated),above);
  66. }
  67.  
  68. pair Orig=(0,0);
  69. forme q=forme((0,0)--(3,0)--(2.5,1.5)--(0.5,1)--cycle,Orig);
  70. forme p=forme(slant(0.5)*yscale(1.5)*xscale(2)*unitsquare,shift(2E+3S)*Orig);
  71.  
  72. q.draw();
  73. p.draw();
  74.  
  75. marker cercle=CircleBarIntervalMarkerBord(i=1,
  76. n=0,
  77. barsize=0,
  78. radius=10,
  79. angle=0,
  80. offset=0,
  81. rotated=true,
  82. currentpen,
  83. Fill(white),
  84. circleabove=false,
  85. above=true);
  86.  
  87. draw(point(q,S){S}..{S}point(p,N),Arrow,cercle);


Le but est d'avoir des labels vides, à compléter par les élèves.

Bon dimanche à tous !

Re: Label intégré à une flèche

Posté : dim. 14 oct. 2012, 21:11
par GM
Bonsoir,
j'ai vu les deux demandes... mais je suis actuellement débordé... donc si une réponse tombe rapidement, elle ne sera pas de moi.
Désolé.

Re: Label intégré à une flèche

Posté : lun. 15 oct. 2012, 06:00
par mumblee
Aucun souci Gaëtan.Ce ne sont pas des urgences.

Bon courage pour le boulot !

Re: Label intégré à une flèche

Posté : mar. 16 oct. 2012, 17:08
par GM
C'est le fruit de très peu de réflexion... mais je suis overbooké en ce moment :

Figure asymptote 58d23f9fb9b91efc9b48f1913e082fc9
*** 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 markers;
  2. size(10cm);
  3.  
  4. struct forme{
  5. path p;
  6. pair c;
  7. void operator init(path p, pair c=(0,0)){
  8. this.c=c;
  9. this.p=shift(-0.5*(min(p)+max(p)))*p;
  10. }
  11. void draw(picture pic=currentpicture,
  12. pen drawpen=currentpen+bp,
  13. pen fillpen=invisible,
  14. bool centreO=false){
  15. if(centreO){
  16. filldraw(pic, this.p, fillpen, drawpen);
  17. }else{
  18. filldraw(pic, shift(this.c)*this.p, fillpen, drawpen);
  19. }
  20. }
  21. }
  22.  
  23. pair point(forme F, pair dir, transform t=identity())
  24. {
  25. pair m=min(F.p);
  26. pair M=max(F.p);
  27. pair c=0.5*(m+M);
  28. pair z=t*F.c;
  29. real[] T=intersect(F.p,c--2*(m+realmult(rectify(dir),M-m))-c);
  30. if(T.length == 0) return z;
  31. return z+t*point(F.p,T[0]);
  32. }
  33. void lier(forme f1, forme f2,
  34. pair a_pt=S,
  35. pair a_dir=S,
  36. pair b_pt=N,
  37. pair b_dir=S,
  38. path cadre=unitcircle,
  39. pen couldraw=blue,
  40. pen coulfill=white,
  41. transform sc=scale(.25)){
  42. path liaison1 = point(f1,a_pt){a_dir}..{b_dir}point(f2,b_pt);
  43. draw(liaison1,Arrow);
  44. filldraw(shift(point(liaison1,.5))*sc*cadre,coulfill,couldraw);
  45. }
  46.  
  47. pair Orig=(0,0);
  48. forme q=forme((0,0)--(3,0)--(2.5,1.5)--(0.5,1)--cycle,Orig);
  49. forme p=forme(slant(0.5)*yscale(1.5)*xscale(2)*unitsquare,shift(2E+3S)*Orig);
  50.  
  51. q.draw();
  52. p.draw();
  53. lier(q,p);
  54. lier(q,p,a_pt=SW,a_dir=SE,b_pt=W,b_dir=E,cadre=polygon(5),coulfill=yellow);
  55. lier(q,p,a_pt=E,a_dir=E,b_pt=NE,b_dir=S,cadre=polygon(3),couldraw=2bp+red);


Je ne doute pas que je changerais beaucoup de choses... si j'avais le temps d'y réfléchir sérieusement
mais si cela peut dépanner pour une éventuelle urgence, ce sera déjà cela.

Re: Label intégré à une flèche

Posté : mer. 17 oct. 2012, 19:56
par GM
Je viens de relire le titre du sujet auquel je n'avais pas prêté suffisamment attention.

Et je me dis que je me suis peut-être laissé influencer par ce qui était proposé : j'ai cru qu'il ne fallait pas de texte dans le cercle.
Qu'en est-il ?

Re: Label intégré à une flèche

Posté : jeu. 18 oct. 2012, 03:08
par maurice
GM a écrit :Je viens de relire le titre du sujet auquel je n'avais pas prêté suffisamment attention.

Et je me dis que je me suis peut-être laissé influencer par ce qui était proposé : j'ai cru qu'il ne fallait pas de texte dans le cercle.
Qu'en est-il ?
mumblee a écrit :Le but est d'avoir des labels vides, à compléter par les élèves.

Je crois que tu as bien fait !

maurice

Re: Label intégré à une flèche

Posté : jeu. 18 oct. 2012, 05:20
par GM
maurice a écrit :Je crois que tu as bien fait !

J'ai dû le lire et je l'avais déjà oublié : je suis poisson et la mémoire qui va avec. :mrgreen:

---------

S'il faut écrire dans les formes, j'attire l'attention sur l'argument suivant :

Code : Tout sélectionner

transform sc

pour un réglage global de la taille des formes.

Après j'ai mis trois formes différentes avec le cercle comme choix par défaut
mais le mieux ne sera t-il pas une ellipse (comme choix par défaut pour pouvoir écrire ?

Pour le choix par défaut d'une flèche... je fais passer du point au sud d'une forme au point au nord d'une autre, avec des directions vers le sud aux extrémités. Mais peut-être qu'un choix par défaut pourrait être la ligne droite qui joint les centres.