Quel est le type de box ?

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 :

Quel est le type de box ?

Message non lu par maurice » sam. 17 août 2013, 18:40

Bonjour,
Je voulais reproduire le graphe du sujet TES d'Asie :

Figure asymptote 3adbdb1d66adf482f88a668e33ac67b7
*** 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. real marge=0.2;
  3. object objet_1=draw("1", box, (0,0), marge),
  4. objet_2=draw("2", box, (1,0), marge),
  5. objet_3=draw("3", box, (2,0), marge),
  6. objet_4=draw("4", box, (3,0), marge);
  7.  
  8. add(new void(picture pic, transform t) {
  9. draw(pic, Label("S",align=N), point(objet_1,E,t){N+2*E}..{S+2*E}point(objet_2,W,t),Arrow);
  10. draw(pic, Label("U", align=S), point(objet_2,W,t){S+2*W}..{N+2*W}point(objet_1,E,t), Arrow);
  11. 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);
  12. 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);
  13. draw(pic, Label("E", align=N), point(objet_2,E,t)--point(objet_3,W,t), Arrow);
  14. 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);
  15. draw(pic, Label("E", align=N), point(objet_3,E,t)--point(objet_4,W,t), Arrow);
  16. });


Pour être conforme à l'original, je souhaitais que les boites qui encadrent les numéros subissent une rotation de 45 degrés.
Or, dans l'index des fonctions asymptote, lorsque l'on recherche draw avec comme filtre object (pour type) et pair (comme argument) on tombe sur :

Code : Tout sélectionner

(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), pair position, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);


qui laisse à penser que box est du type path.

Si dans le code, j'ajoute :

Code : Tout sélectionner

transform r=rotate(45, (0,0));
path boite=r*box((0,0),(1,1));


et remplace box par boite j'obtiens le message d'erreur :

Code : Tout sélectionner

Asie-2013-graphe.asy: 6.20: no matching function 'draw(string, path, pair, real)'


Si je remplace box par rota(45)*box, j'obtiens le message d'erreur :

Code : Tout sélectionner

Asie-2013-graphe.asy: 6.36: no matching function 'operator *(transform, <overloaded>)'
Asie-2013-graphe.asy: 6.37: use of variable 'box' is ambiguous


Je suis à court d'idées.

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
chellier
Messages : 104
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Quel est le type de box ?

Message non lu par chellier » sam. 17 août 2013, 21:47

Bonsoir,

box est, d'après ce que j'ai compris, du type envelope : voir plain_boxes.asy

En attendant une autre solution, on peut modifier box pour faire tourner la boite, mais... on obtient pas un beau losange, ce qui est normal !

Figure asymptote 7a5cd3a9225037ca1c52fce7aa1455d4
*** 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,0);
  2.  
  3. // --------------------------------------------------------------------------------
  4. path rotbox(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin,
  5. pen p=currentpen, filltype filltype=NoFill, bool above=true)
  6. {
  7. pair z=(xmargin,ymargin);
  8. int sign=filltype == NoFill ? 1 : -1;
  9. pair h=0.5*sign*(max(p)-min(p));
  10. path g=rotate(45,(min(src)+max(src))/2)*box(min(src)-h-z,max(src)+h+z);
  11. frame F;
  12. if(above == false) {
  13. filltype.fill(F,g,p);
  14. prepend(dest,F);
  15. } else filltype.fill(dest,g,p);
  16. return g;
  17. }
  18. // --------------------------------------------------------------------------------
  19. real marge=0.2;
  20. object objet_1=draw("1", rotbox, (0,0), marge),
  21. objet_2=draw("2", rotbox, (1,0), marge),
  22. objet_3=draw("3", box, (2,0), marge),
  23. objet_4=draw("4", box, (3,0), marge);
  24.  
  25. add(new void(picture pic, transform t) {
  26. draw(pic, Label("S",align=N), point(objet_1,E,t){N+2*E}..{S+2*E}point(objet_2,W,t),Arrow);
  27. draw(pic, Label("U", align=S), point(objet_2,W,t){S+2*W}..{N+2*W}point(objet_1,E,t), Arrow);
  28. 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);
  29. 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);
  30. draw(pic, Label("E", align=N), point(objet_2,E,t)--point(objet_3,W,t), Arrow);
  31. 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);
  32. draw(pic, Label("E", align=N), point(objet_3,E,t)--point(objet_4,W,t), Arrow);
  33. });


Il faudrait modifier le path g. J'ai essayé, mais je n'y arrive pas :oops: je dois être un peu fatigué ce soir...

Christophe

EDIT : Voir nouvelle solution ci-dessous

Avatar du membre
chellier
Messages : 104
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Quel est le type de box ?

Message non lu par chellier » dim. 18 août 2013, 05:28

chellier a écrit :Il faudrait modifier le path g. J'ai essayé, mais je n'y arrive pas :oops: je dois être un peu fatigué ce soir...


La nuit porte conseil ;)

Figure asymptote 785d342df337e60476adcc41199cdc08
*** 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,0);
  2.  
  3. // --------------------------------------------------------------------------------
  4. path rotbox(pair a, pair b)
  5. {
  6. return (a.x,(a.y+b.y)/2)--((a.x+b.x)/2,b.y)--(b.x,(a.y+b.y)/2)--((a.x+b.x)/2,a.y)--cycle;
  7. }
  8.  
  9.  
  10. path rotbox(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin,
  11. pen p=currentpen, filltype filltype=NoFill, bool above=true)
  12. {
  13. pair z=(xmargin,ymargin);
  14. int sign=filltype == NoFill ? 1 : -1;
  15. pair h=0.5*sign*(max(p)-min(p));
  16. path g=rotbox(min(src)-h-z,max(src)+h+z);
  17. frame F;
  18. if(above == false) {
  19. filltype.fill(F,g,p);
  20. prepend(dest,F);
  21. } else filltype.fill(dest,g,p);
  22. return g;
  23. }
  24. // --------------------------------------------------------------------------------
  25.  
  26. real marge=0.2;
  27. object objet_1=draw("1", rotbox, (0,0), xmargin=3, ymargin=5),
  28. objet_2=draw("2", rotbox, (1,0), xmargin=5, ymargin=3),
  29. objet_3=draw("3", box, (2,0), marge),
  30. objet_4=draw("4", box, (3,0), marge);
  31.  
  32. add(new void(picture pic, transform t) {
  33. draw(pic, Label("S",align=N), point(objet_1,E,t){N+2*E}..{S+2*E}point(objet_2,W,t),Arrow);
  34. draw(pic, Label("U", align=S), point(objet_2,W,t){S+2*W}..{N+2*W}point(objet_1,E,t), Arrow);
  35. 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);
  36. 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);
  37. draw(pic, Label("E", align=N), point(objet_2,E,t)--point(objet_3,W,t), Arrow);
  38. 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);
  39. draw(pic, Label("E", align=N), point(objet_3,E,t)--point(objet_4,W,t), Arrow);
  40. });


Christophe

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

Re: Quel est le type de box ?

Message non lu par maurice » dim. 18 août 2013, 05:35

Bonjour Christophe (ça faisait longtemps) et merci ...
Il va falloir que je regarde ça et je pense que j'aurais plusieurs questions ...
Mais décalage horaire oblige (-8), je verrais ça demain ...
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: Quel est le type de box ?

Message non lu par maurice » dim. 18 août 2013, 18:59

Bonjour,

quelques questions sur le code :

A quoi sert

Code : Tout sélectionner

int sign=filltype == NoFill ? 1 : -1;

J'ai testé avec sign=1 et -1 et n'ai pas vu de différence.

J'ai essayé de tester aussi avec

Code : Tout sélectionner

above=false
pour voir... sans succès... Comment faire ?

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
chellier
Messages : 104
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Quel est le type de box ?

Message non lu par chellier » dim. 18 août 2013, 20:24

Je n'ai pas vu de différence non plus... Je n'ai pas essayé de tout réécrire : j'ai tout simplement modifié au minimum les définitions de box de plain_constants.asy et plain_boxes.asy. En procédant de cette façon, c'est l'assurance que rotbox se comporte comme box.

On pourrait simplifier le code et cela fonctionnerait probablement pour la plupart des cas, mais si box a été écrite de cette façon, je me dis qu'il y a surement une raison... je ne peux pas t'éclairer davantage, désolé, il faudrait un spécialiste !

Christophe

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

Re: Quel est le type de box ?

Message non lu par maurice » lun. 26 août 2013, 17:24

Bonjour, je reviens à la charge : quelqu'un peut-il m'expliquer cette ligne :

Code : Tout sélectionner

pair h=.5*sign*(max(p)-min(p));


Merci

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: Quel est le type de box ?

Message non lu par GM » lun. 26 août 2013, 17:56

Bonjour,

maurice a écrit :Bonjour, je reviens à la charge : quelqu'un peut-il m'expliquer cette ligne :

Pas moi, après de brefs essais.
En augmentant la valeur de sign (10 et -10), on voit l'incidence visuellement, que l'on devinait d'après le code... mais quel problème particulier est-ce censé régler ?
Je ne sais pas... mais j'avoue que je n'ai pas cherché longtemps, car je suis pris par des préparations personnelles.
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: Quel est le type de box ?

Message non lu par maurice » lun. 26 août 2013, 19:37

Bonsoir, merci pour la réponse.
En fait, la question portait surtout sur min(p) et max(p) où p est de type pen.
En ajoutant

Code : Tout sélectionner

write(p);
  write(min(p), max(p));

dans le code, j'obtiens :

Code : Tout sélectionner

asy -V -wait "rotbox"
(default)
(-0.25,-0.25)   (0.25,0.25)
(default)
(-0.25,-0.25)   (0.25,0.25)
(default)
(-0.25,-0.25)   (0.25,0.25)
(default)
(-0.25,-0.25)   (0.25,0.25)

Merci
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: Quel est le type de box ?

Message non lu par GM » lun. 26 août 2013, 19:56

Image

Rappel : largeur par défaut d'un pen : 0,5bp
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 !

Répondre