Page 1 sur 2

Quel est le type de box ?

Posté : sam. 17 août 2013, 18:40
par maurice
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

Re: Quel est le type de box ?

Posté : sam. 17 août 2013, 21:47
par chellier
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

Re: Quel est le type de box ?

Posté : dim. 18 août 2013, 05:28
par chellier
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

Re: Quel est le type de box ?

Posté : dim. 18 août 2013, 05:35
par maurice
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

Re: Quel est le type de box ?

Posté : dim. 18 août 2013, 18:59
par maurice
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

Re: Quel est le type de box ?

Posté : dim. 18 août 2013, 20:24
par chellier
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

Re: Quel est le type de box ?

Posté : lun. 26 août 2013, 17:24
par maurice
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

Re: Quel est le type de box ?

Posté : lun. 26 août 2013, 17:56
par GM
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.

Re: Quel est le type de box ?

Posté : lun. 26 août 2013, 19:37
par maurice
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

Re: Quel est le type de box ?

Posté : lun. 26 août 2013, 19:56
par GM
Image

Rappel : largeur par défaut d'un pen : 0,5bp