Page 1 sur 3

question du forum asy

Posté : dim. 15 avr. 2012, 15:22
par OG
Bonjour Gaëtan

Comme ce sera plus facile de s'exprimer et éventuellement de se comprendre en français
sur ton message concernant l'accolade, pourrais-tu me dire ce qui ne va pas et surtout
ce que tu veux faire ? Truepoint et point m'échappent encore plus que toi, je ne sais pas
si je pourrais aider.

O.G.

Re: question du forum asy

Posté : dim. 15 avr. 2012, 15:57
par GM
Salut Olivier,

Le fonctionnement attendu est, si j'ai bien compris, celui-ci :

Figure asymptote 23750bb582f41d3fdafc4f8b40c0b0b5
*** 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. draw(scale(4)*"Test",(10,1)--(0,0));
  3. dot("nw",point(NW),SE,red);
  4. dot("se",point(SE),NW,red);
  5. dot("NW",truepoint(NW),SE,blue);
  6. dot("SE",truepoint(SE),NW,blue);


truepoint(NW), contrairement à point(NW), tient compte du label.

Si j'ai bien compris Asymptote, à chaque fois que l'on ajoute un élément dans une figure... il y a deux calculs de la taille de l'image : un qui ne tient pas compte des labels, l'autre qui en tient compte... de sorte que ce que renvoient les commandes point(...) et truepoint(...) prennent en compte l'ajout. Pour ce faire, il y a une série de fonctions (addPath, addBox, ...).
Dans ma fonction cotationaccolade, je n'ai pas su les utiliser correctement pour que truepoint(NW)et point(NW) renvoient les bons points après l'ajout d'une accolade avec label.
Et il m'a semblé qu'il y avait plusieurs façons de faire... donc j'aimerais que JCBowman viennent donner un conseil sur quelque chose qui n'est pas du tout documenté et qu'il faut supputer en regardant les fichiers d'origine.

Re: question du forum asy

Posté : dim. 15 avr. 2012, 16:39
par GM
GM a écrit :Dans ma fonction cotationaccolade,


... dont voici le premier jet que j'ai donné sur le forum officiel (j'en ai une version plus évoluée depuis) :

Figure asymptote f8536bfb73a6ee2dcb784dc4932e8d09
*** 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. void cotationaccolade(picture pic=currentpicture,
  3. pair pA, pair pB,
  4. Label L = "", bool Lrot=false,
  5. pen p=currentpen)
  6. {
  7. path brace=(0,0).. controls (3,4) and (5,4) ..(10,4)
  8. --(40,4).. controls (45,4) and (48,4) ..(50,6);
  9. brace=brace--reverse(reflect((50,0),(50,10))*brace);
  10. brace=shift(pA)*rotate(degrees(pB-pA))*scale(abs(pB-pA)/100)*brace;
  11. pic.add(new void(frame f, transform t)
  12. {
  13. transform T = Lrot ? rotate(degrees(pB - pA)) : identity();
  14. draw(f,t*brace,p);
  15. if(L.s != "") {
  16. frame fr;
  17. add(fr,T*L);
  18. pair pos=point(t*brace,L.relative()*length(brace));
  19. add(f,fr,pos,align=N);
  20. }
  21. },true);
  22. pic.addPath(brace,p);
  23. }
  24. ///////////////////////////////////////////////////////////
  25. ///////////////////////////////////////////////////////////
  26.  
  27. size(300);
  28. pair z1=(0,0), z2=(10,1);
  29. dot(z1^^z2);
  30. cotationaccolade(z1,z2,L=Label(scale(4)*"Test",Relative(.5),purple));
  31. dot("nw",point(NW),SE,red);
  32. dot("se",point(SE),NW,red);
  33. dot("NW",truepoint(NW),SE,blue);
  34. dot("SE",truepoint(SE),NW,blue);


GM a écrit :je n'ai pas su les utiliser correctement pour que truepoint(NW)et point(NW) renvoient les bons points après l'ajout d'une accolade avec label.
Et il m'a semblé qu'il y avait plusieurs façons de faire... donc j'aimerais que JCBowman viennent donner un conseil sur quelque chose qui n'est pas du tout documenté et qu'il faut supputer en regardant les fichiers d'origine.


J'ai essayé d'utiliser addPath et addBox... puis j'ai regardé les différentes utilisations dans les fichiers asy d'asymptote... pour m'apercevoir qu'il y a beaucoup de variantes d'utilisation et donc j'ai arrêté de chercher pour que JCBowman me confirme d'abord que j'ai compris ce qu'il fallait faire et la fonction qu'il est préférable d'utiliser. J'ai ma petite idée... mais je préfèrerais qu'elle me soit confirmée afin de ne pas chercher dans la mauvaise direction.

Re: question du forum asy

Posté : dim. 15 avr. 2012, 16:46
par GM
OG a écrit :Comme ce sera plus facile de s'exprimer et éventuellement de se comprendre en français...

Suis-je plus clair en Français ? :mrgreen:

Re: question du forum asy

Posté : dim. 15 avr. 2012, 16:52
par OG
Hy

oui c'est très clair maintenant. Il faut trouver par contre :)

O.G.

Re: question du forum asy

Posté : dim. 15 avr. 2012, 17:13
par GM
OG a écrit :Il faut trouver par contre :)

Oui mais... je n'ai pas douté qu'en tâtonnant, je trouverais comment utiliser addBox(pair userMin, pair userMax, pair trueMin, pair trueMax) pour mon exemple, mais c'est ce que j'ai vu dans les fichiers asy, avec des façons de faire différentes, qui m'a convaincu qu'il y avait probablement des subtilités qui m'échappent. Donc j'ai tenté ma chance, pour voir si JCBowman répondrait pour m'éviter de faire un choix qui ne soit pas adapté à toutes les situations.

Re: question du forum asy

Posté : dim. 15 avr. 2012, 21:07
par OG
Re

Pourquoi vouloir faire avec le deferred vu que tu connais la transformation qui donne
le chemin de l'accolade entre tes deux points ?
Peut-être pour des choses plus sophistiquées ?

Figure asymptote 27c3993af64ebbb846382ba4f68ef82b
*** 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. void cotationaccolade(picture pic=currentpicture,
  2. pair pA, pair pB,
  3. Label L = "", bool Lrot=false,
  4. pen p=currentpen)
  5. {
  6. path brace=(0,0).. controls (3,4) and (5,4) ..(10,4)
  7. --(40,4).. controls (45,4) and (48,4) ..(50,6);
  8. brace=brace--reverse(reflect((50,0),(50,10))*brace);
  9. brace=rotate(degrees(pB-pA))*scale(abs(pB-pA)/100)*brace;
  10. draw(L,brace,p,align=N);
  11. ;
  12. }
  13. ///////////////////////////////////////////////////////////
  14. ///////////////////////////////////////////////////////////
  15.  
  16. size(10cm);
  17. pair z1=(0,0), z2=(5,-.25);
  18. dot(z1^^z2);
  19. cotationaccolade(z1,z2,L=Label("Text",Relative(.5),purple),.2bp+green);
  20. dot("sw",point(SE),NW,red);
  21. dot("ne",point(NW),SE,red);
  22. dot("SW",truepoint(SE),NW,blue);
  23. dot("NE",truepoint(NW),SE,blue);


O.G.

Re: question du forum asy

Posté : dim. 15 avr. 2012, 21:34
par GM
OG a écrit :Peut-être pour des choses plus sophistiquées ?


On doit pouvoir mettre une accolade dans une picture, ajouter la picture à currentpicture... et avoir point(SE) correct... ce qui ne me semble pas être le cas pour l'exemple suivant.

Figure asymptote 689cadf9134327c9ccb53aef81163ea2
*** 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. void cotationaccolade(picture pic=currentpicture,
  2. pair pA, pair pB,
  3. Label L = "", bool Lrot=false,
  4. pen p=currentpen)
  5. {
  6. path brace=(0,0).. controls (3,4) and (5,4) ..(10,4)
  7. --(40,4).. controls (45,4) and (48,4) ..(50,6);
  8. brace=brace--reverse(reflect((50,0),(50,10))*brace);
  9. brace=shift(pA)*rotate(degrees(pB-pA))*scale(abs(pB-pA)/100)*brace;
  10. draw(pic,L,brace,p,align=LeftSide);
  11. }
  12. unitsize(2cm);
  13.  
  14. draw((0,0)--(5,2));
  15.  
  16. picture pic;
  17. pair z1=(0,0), z2=(5,-.25);
  18. dot(pic,z1^^z2);
  19. cotationaccolade(pic,z1,z2,L=Label("Text",Relative(.5),purple),.2bp+green);
  20. add(pic.fit(10cm),(1,-1));
  21.  
  22. dot("se",point(SE),NW,red);
  23. dot("nw",point(NW),SE,red);
  24. dot("SE",truepoint(SE),NW,blue);
  25. dot("NW",truepoint(NW),SE,blue);

Re: question du forum asy

Posté : dim. 15 avr. 2012, 21:49
par OG
SE semble correct ici. Si tu remplaces accolade par un simple draw le résultat est le même.
?
O.G.

Figure asymptote d0c5eba340998e42ec83080bcc333046
*** 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. unitsize(2cm);
  2.  
  3. draw((0,0)--(5,2));
  4.  
  5. picture pic;
  6. pair z1=(0,0), z2=(5,-.25);
  7. dot(pic,z1^^z2);
  8. //cotationaccolade(pic,z1,z2,L=Label("Text",Relative(.5),purple),.2bp+green);
  9. draw(pic,z1--z2,L=Label("Text",Relative(.5),purple),N);
  10. add(pic.fit(10cm),(1,-1));
  11.  
  12. dot("se",point(SE),NW,red);
  13. dot("nw",point(NW),SE,red);
  14. dot("SE",truepoint(SE),NW,blue);
  15. dot("NW",truepoint(NW),SE,blue);

Re: question du forum asy

Posté : dim. 15 avr. 2012, 21:54
par GM
OG a écrit :Si tu remplaces accolade par un simple draw le résultat est le même.

Bien vu.
Bizarre...

Une source d'inspiration : distance(...) de geometry.asy.

Apparemment Philippe (dont le code a été,j'imagine, validé par JCBowman) y a vu un intérêt dans le deferred drawing :

Code : Tout sélectionner

void distance(picture pic = currentpicture, Label L = "", point A, point B,
              bool rotated = true, real offset = 3mm,
              pen p = currentpen, pen joinpen = invisible,
              arrowbar arrow = Arrows(NoFill))
{
  pair A = A, B = B;
  path g = A--B;
  transform Tp = shift(-offset * unit(B - A) * I);
  pic.add(new void(frame f, transform t) {
      picture opic;
      path G = Tp * t * g;
      transform id = identity();
      transform T = rotated ? rotate(B - A) : id;
      Label L = L.copy();
      L.align(L.align, Center);
      if(abs(ypart((conj(A - B) * L.align.dir))) < epsgeo && L.filltype == NoFill)
        L.filltype = UnFill(1);
      draw(opic, T * L, G, p, arrow, Bars, PenMargins);
      pair Ap = t * A, Bp = t * B;
      draw(opic, (Ap--Tp * Ap)^^(Bp--Tp * Bp), joinpen);
      add(f, opic.fit());
    }, true);
  pic.addBox(min(g), max(g), Tp * min(p), Tp * max(p));
}