[buildcycle] Comment arranger ça ?

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 !
maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: [buildcycle] Comment arranger ça ?

Message non lu par maurice » dim. 1 sept. 2013, 01:52

GM a écrit :
maurice a écrit :Il y a plus simple ?

Cela dépend : la forme d'une feuille... devait répondre à des critères précis ou tu as choisi une forme approximative en tâtonnant ?


J'ai fait ça un peu au hasard. Je voulais m'amuser à créer des enveloppes pour mettre dans des graphes ; juste pour voir.


GM a écrit :Je me pose d'autres questions : pourquoi cette fonction avec deux points en paramètre ?
Si c'est censé permettre avoir des trèfles plus ou moins allongé... change l'une des coordonnées du second point... et tu verras.
Donc je me demande le pourquoi de ces points en paramètres.


C'est pour pouvoir l'appeler avec les paramètres min(src) et max(src) :

Code : Tout sélectionner

path trefle4(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=UnFill, bool above=true)
{
  pair z=(xmargin,ymargin);
  int sign=filltype == NoFill ? 1 : -1;
  pair h=.5*sign*(max(p)-min(p));
  path g=g5(min(src)-h-z,max(src)+h+z);
  frame F;
  if(above == false) {
    filltype.fill(F,g,p);
    prepend(dest,F);
  } else filltype.fill(dest,g,p);
  return g;
}



GM a écrit :Tu parles d'enveloppe : où espères voir le texte dans ce trèfle ?


Au milieu du trèfle, ça ne rend pas terrible mais je ne désespère pas ; et puis pour progresser, il faut bien pratiquer !

Figure asymptote 1d1ff4b82ca6ce0cad3cf30c1e449baa
*** 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. size(400);
  2.  
  3.  
  4. path g5(pair a, pair b)
  5. {
  6. real angle=60;
  7. pair centre=((a.x+b.x)/2, (4*a.y+3*b.y)/7),
  8. p1=((3*a.x+b.x)/4, (3*a.y+b.y)/4),
  9. p2=(a.x, centre.y),
  10. p3=(p1.x, p2.y+centre.y-p1.y);
  11. path f1=centre{dir(180+angle)}..{left}p1{left}..{up}p2{up}..{right}p3{right}..{dir(-angle)}cycle;
  12. path f2=rotate(-90, centre)*(centre{dir(180+angle)}..{left}p1);
  13. path f3=rotate(90, centre)*(p3{right}..{dir(-angle)}centre);
  14. real[][] t2=intersections(f1, f2);
  15. real[][] t3=intersections(f1, f3);
  16. path feuille=subpath(f1, t3[1][0], t2[1][0]);
  17. return feuille--rotate(-90,centre)*feuille--rotate(-180,centre)*feuille--rotate(-270, centre)*feuille--cycle;
  18. // return feuille^^rotate(90,centre)*feuille^^rotate(180,centre)*feuille^^rotate(270, centre)*feuille;
  19. }
  20.  
  21. path trefle4(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=UnFill, bool above=true)
  22. {
  23. pair z=(xmargin,ymargin);
  24. int sign=filltype == NoFill ? 1 : -1;
  25. pair h=.5*sign*(max(p)-min(p));
  26. path g=g5(min(src)-h-z,max(src)+h+z);
  27. frame F;
  28. if(above == false) {
  29. filltype.fill(F,g,p);
  30. prepend(dest,F);
  31. } else filltype.fill(dest,g,p);
  32. return g;
  33. }
  34.  
  35. real marge=4;
  36. object objet_1=draw("Ga\'etan", trefle4, (0,0), xmargin=3, ymargin=5),
  37. objet_2=draw("2", trefle4, (1,0), xmargin=3, ymargin=5),
  38. objet_3=draw("3", trefle4, (2,0), xmargin=3, ymargin=5),
  39. objet_4=draw("Bruno", trefle4, (3,0), marge);
  40.  
  41. add(new void(picture pic, transform t) {
  42. draw(pic, Label("S",align=N), point(objet_1,E,t){N+2*E}..{S+2*E}point(objet_2,W,t),Arrow);
  43. draw(pic, Label("U", align=S), point(objet_2,W,t){S+2*W}..{N+2*W}point(objet_1,E,t), Arrow);
  44. draw(pic, Label("P", align=N), point(objet_2,2*W+N,t){N+2*W}..{S+2*W}point(objet_2,2*E+N,t), Arrow);
  45. draw(pic, Label("C", align=S), point(objet_2,2*W+S,t){S+2*W}..{N+2*W}point(objet_2,2*E+S,t), Arrow);
  46. draw(pic, Label("E", align=N), point(objet_2,E,t)--point(objet_3,W,t), Arrow);
  47. draw(pic, Label("N", align=N), point(objet_3,2*W+N,t){N+2*W}..{S+2*W}point(objet_3,2*E+N,t), Arrow);
  48. draw(pic, Label("E", align=N), point(objet_3,E,t)--point(objet_4,W,t), Arrow);
  49. });
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

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

Re: [buildcycle] Comment arranger ça ?

Message non lu par GM » dim. 1 sept. 2013, 09:18

maurice a écrit :Au milieu du trèfle, ça ne rend pas terrible mais je ne désespère pas ;


et puis pour progresser, il faut bien pratiquer !


Je préviens que je fais une proposition... sans avoir du tout étudié la pertinence de la fonction trefle4 (dupliquée en losange... en changeant g5 en gm2, sans réfléchir au reste de la fonction).

Je n'ai réfléchi qu'aux fonctions gm1 et gm2, sans réfléchir au reste... faute de temps : je n'avais que 10mn, désolé.

Après toutes ces mises en garde, voilà une source d'inspiration pour des trèfles qui devraient avoir davantage de constance au niveau de la forme, selon que le texte est une lettre ou un mot :

Figure asymptote 676d1999981b0ecd656362359a246cf2
*** 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. size(400);
  2.  
  3. path gm1(pair a, pair b)
  4. {
  5. path p=box(a,b);
  6. pair pS=point(p,.5),
  7. pE=point(p,1.5),
  8. pN=point(p,2.5),
  9. pW=point(p,3.5);
  10. return pN--pW--pS--pE--cycle;
  11. }
  12.  
  13. path losange(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=UnFill, bool above=true)
  14. {
  15. pair z=(xmargin,ymargin);
  16. int sign=filltype == NoFill ? 1 : -1;
  17. pair h=.5*sign*(max(p)-min(p));
  18. path g=gm1(min(src)-h-z,max(src)+h+z);
  19. frame F;
  20. if(above == false) {
  21. filltype.fill(F,g,p);
  22. prepend(dest,F);
  23. } else filltype.fill(dest,g,p);
  24. return g;
  25. }
  26.  
  27. path gm2(pair a, pair b)
  28. {
  29. path p=box(a,b);
  30. pair pS=point(p,.5),
  31. pE=point(p,1.5),
  32. pN=point(p,2.5),
  33. pW=point(p,3.5);
  34. return pN{N}..{E}pW{W}..{N}pS{S}..{W}pE{E}..{S}cycle;
  35. }
  36.  
  37. path trefle4(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin, pen p=currentpen, filltype filltype=UnFill, bool above=true)
  38. {
  39. pair z=(xmargin,ymargin);
  40. int sign=filltype == NoFill ? 1 : -1;
  41. pair h=.5*sign*(max(p)-min(p));
  42. path g=gm2(min(src)-h-z,max(src)+h+z);
  43. frame F;
  44. if(above == false) {
  45. filltype.fill(F,g,p);
  46. prepend(dest,F);
  47. } else filltype.fill(dest,g,p);
  48. return g;
  49. }
  50.  
  51. real marge=3;
  52. object objet_1=draw("Ga\'etan", losange, (0,0), xmargin=10, ymargin=10),
  53. objet_2=draw("2", losange, (1,0), xmargin=10, ymargin=10),
  54. objet_3=draw("3", trefle4, (2,.5), marge),
  55. objet_4=draw("Bruno", trefle4, (3,0), marge);
  56.  
  57. add(new void(picture pic, transform t) {
  58. draw(pic, Label("S",align=N), point(objet_1,E,t){ENE}..{ESE}point(objet_2,W,t),Arrow);
  59. draw(pic, Label("U", align=S), point(objet_2,W,t){WSW}..{WNW}point(objet_1,E,t), Arrow);
  60. draw(pic, Label("P", align=N), point(objet_2,NW,t){WNW}..{WSW}point(objet_2,2*E+N,t), Arrow);
  61. draw(pic, Label("C", align=S), point(objet_2,SW,t){WSW}..{WNW}point(objet_2,2*E+S,t), Arrow);
  62. draw(pic, Label("E", align=N), point(objet_2,E,t)--point(objet_3,SW,t), Arrow);
  63. draw(pic, Label("N", align=N), point(objet_3,WNW,t){WNW}..{WSW}point(objet_3,ENE,t), Arrow);
  64. draw(pic, Label("E", align=N), point(objet_3,SE,t)--point(objet_4,WNW,t), Arrow);
  65. });


J'ai changé la valeur de marge... et j'ai eu une flèche qui ne pointait plus où je voulais... donc il faudra y passer plus que mes 10mn... pour améliorer la chose.

Le sujet m'intéresse donc c'est un peu à regrets que je donne une proposition, en modifiant une partie du code, sans avoir le temps de regarder la seconde.
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 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

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

Re: [buildcycle] Comment arranger ça ?

Message non lu par GM » dim. 1 sept. 2013, 09:29

Précision : je rappelle qu'il existe N, W, S, E mais aussi les 12 autres points cardinaux !

Image


J'ai donc remplacé, par exemple, tes "N+2W" par "WNW".
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 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: [buildcycle] Comment arranger ça ?

Message non lu par maurice » dim. 1 sept. 2013, 17:12

Bonjour, merci pour la proposition, effectivement l'idée est bonne et bien plus simple d'utiliser les points pN, pE, pS et pW pour construire le chemin.
Néanmoins, j'ai du mal avec :

Code : Tout sélectionner

 path p=box(a,b);
pair pS=point(p,.5),
pE=point(p,1.5),
pN=point(p,2.5),
pW=point(p,3.5);

On suppose dans ce cas que la longueur de p est 4 ou j'ai mal compris ?...
(rapport avec les courbes de Bézirer ?)
Je trouve, à première vue, plus logique d'utiliser :

Code : Tout sélectionner

 path p=box(a,b);
pair pS=point(p,1/8),
pE=relpoint(p,3/8),
pN=relpoint(p,5/8),
pW=relpoint(p,7/8);


Bruno
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: [buildcycle] Comment arranger ça ?

Message non lu par maurice » dim. 1 sept. 2013, 17:14

GM a écrit :Précision : je rappelle qu'il existe N, W, S, E mais aussi les 12 autres points cardinaux !

Je ne savais pas au'ils étaient prédéfinis dans Asymptote !
Bruno
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

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

Re: [buildcycle] Comment arranger ça ?

Message non lu par GM » dim. 1 sept. 2013, 19:20

maurice a écrit :j'ai du mal avec :

Code : Tout sélectionner

 path p=box(a,b);
pair pS=point(p,.5),
pE=point(p,1.5),
pN=point(p,2.5),
pW=point(p,3.5);


Une notion très importante dans Asymptote pour le repérage d'un point d'un path est son "time".

Un path p cyclique défini par 4 noeuds a ses noeuds qui ont pour "times" : 0, 1, 2, 3 (modulo 4).

Exemple :

Figure asymptote 87d9ed472f77468f6b987b43c715d985
*** 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. size(300);
  2. path p=(0,0)..(2,0)..(3,0)..(1,2)..cycle;
  3. draw(p,dot());
  4. for(int k=0; k<size(p); ++k) label(string(k),point(p,k),S);


maurice a écrit :Je trouve, à première vue, plus logique d'utiliser :

Code : Tout sélectionner

 path p=box(a,b);
pair pS=point(p,1/8),
pE=relpoint(p,3/8),
pN=relpoint(p,5/8),
pW=relpoint(p,7/8);


Je ne vais pas être d'accord.

Si pour le path p de l'exemple précédent, je souhaite placer les points "aux milieux" des 4 tronçons, on pense naturellement aux valeurs 0.5, 1.5, 2.5, 3.5 :

Figure asymptote 42ea5b3003031519af1181c280d1e3c1
*** 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. size(300);
  2. path p=(0,0)..(2,0)..(3,0)..(1,2)..cycle;
  3. draw(p,dot());
  4. for(int k=0; k<size(p); ++k) label(string(k),point(p,k),S);
  5. dot("0,5",point(p,0.5),3bp+red);
  6. dot("1,5",point(p,1.5),3bp+red);


Pour la figure suivante d'un path p, saurais-tu me dire quel est ce point rouge ?
Moi, je peux te répondre que si 1 et 2 sont les times de noeuds définissant le path, alors c'est probablement le point point(p,1.5)... et je n'ai pas à connaitre le nombre de noeuds définissant le chemin, pour pouvoir le dire.
Image
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 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

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

Re: [buildcycle] Comment arranger ça ?

Message non lu par GM » dim. 1 sept. 2013, 19:29

Je vais en rajouter une couche : non seulement ce que tu proposes n'est pas "plus logique" mais en fait cela ne marche que par le fait que c'est un cas particulier avec des longueurs identiques entre des noeuds consécutifs.

Un exemple pour montrer que c'est une mauvaise idée :

Figure asymptote 6c952553363b19881585f9226382d686
*** 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. size(300);
  2. path p=box((0,0),(4,2));
  3. pair pS=point(p,1/8),
  4. pE=relpoint(p,3/8),
  5. pN=relpoint(p,5/8),
  6. pW=relpoint(p,7/8);
  7. draw(p);
  8. dot(pS^^pE^^pN^^pW);


alors que :

Figure asymptote 03329489649850b84d7a92cff83cf094
*** 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. size(300);
  2. path p=box((0,0),(4,2));
  3. pair pS=point(p,0.5),
  4. pE=point(p,1.5),
  5. pN=point(p,2.5),
  6. pW=point(p,3.5);
  7. draw(p);
  8. dot(pS^^pE^^pN^^pW);
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 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: [buildcycle] Comment arranger ça ?

Message non lu par maurice » lun. 2 sept. 2013, 00:22

GM a écrit :Une notion très importante dans Asymptote pour le repérage d'un point d'un path est son "time".

Un path p cyclique défini par 4 noeuds a ses noeuds qui ont pour "times" : 0, 1, 2, 3 (modulo 4).


C'est cette notion que je n'avais pas bien comprise !
C'est plus clair maintenant ; je ne sais pas pourquoi, je croyais qu'il y avait un rapport avec la longueur du chemin.
Merci

Bruno
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Répondre