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 :
*** 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
size(300);
draw(scale(4)*"Test",(10,1)--(0,0));
dot("nw",point(NW),SE,red);
dot("se",point(SE),NW,red);
dot("NW",truepoint(NW),SE,blue);
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) :
*** 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
///////////////////////////////////////////////////////////
void cotationaccolade(picture pic=currentpicture,
pair pA, pair pB,
Label L = "", bool Lrot=false,
pen p=currentpen)
{
path brace=(0,0).. controls (3,4) and (5,4) ..(10,4)
--(40,4).. controls (45,4) and (48,4) ..(50,6);
brace=brace--reverse(reflect((50,0),(50,10))*brace);
brace=shift(pA)*rotate(degrees(pB-pA))*scale(abs(pB-pA)/100)*brace;
pic.add(new void(frame f, transform t)
{
transform T = Lrot ? rotate(degrees(pB - pA)) : identity();
draw(f,t*brace,p);
if(L.s != "") {
frame fr;
add(fr,T*L);
pair pos=point(t*brace,L.relative()*length(brace));
add(f,fr,pos,align=N);
}
},true);
pic.addPath(brace,p);
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
size(300);
pair z1=(0,0), z2=(10,1);
dot(z1^^z2);
cotationaccolade(z1,z2,L=Label(scale(4)*"Test",Relative(.5),purple));
dot("nw",point(NW),SE,red);
dot("se",point(SE),NW,red);
dot("NW",truepoint(NW),SE,blue);
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 ?
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 ?
*** 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
void cotationaccolade(picture pic=currentpicture,
pair pA, pair pB,
Label L = "", bool Lrot=false,
pen p=currentpen)
{
path brace=(0,0).. controls (3,4) and (5,4) ..(10,4)
--(40,4).. controls (45,4) and (48,4) ..(50,6);
brace=brace--reverse(reflect((50,0),(50,10))*brace);
brace=rotate(degrees(pB-pA))*scale(abs(pB-pA)/100)*brace;
draw(L,brace,p,align=N);
;
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
size(10cm);
pair z1=(0,0), z2=(5,-.25);
dot(z1^^z2);
cotationaccolade(z1,z2,L=Label("Text",Relative(.5),purple),.2bp+green);
dot("sw",point(SE),NW,red);
dot("ne",point(NW),SE,red);
dot("SW",truepoint(SE),NW,blue);
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.
*** 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
void cotationaccolade(picture pic=currentpicture,
pair pA, pair pB,
Label L = "", bool Lrot=false,
pen p=currentpen)
{
path brace=(0,0).. controls (3,4) and (5,4) ..(10,4)
--(40,4).. controls (45,4) and (48,4) ..(50,6);
brace=brace--reverse(reflect((50,0),(50,10))*brace);
brace=shift(pA)*rotate(degrees(pB-pA))*scale(abs(pB-pA)/100)*brace;
draw(pic,L,brace,p,align=LeftSide);
}
unitsize(2cm);
draw((0,0)--(5,2));
picture pic;
pair z1=(0,0), z2=(5,-.25);
dot(pic,z1^^z2);
cotationaccolade(pic,z1,z2,L=Label("Text",Relative(.5),purple),.2bp+green);
add(pic.fit(10cm),(1,-1));
dot("se",point(SE),NW,red);
dot("nw",point(NW),SE,red);
dot("SE",truepoint(SE),NW,blue);
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.
*** 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
unitsize(2cm);
draw((0,0)--(5,2));
picture pic;
pair z1=(0,0), z2=(5,-.25);
dot(pic,z1^^z2);
//cotationaccolade(pic,z1,z2,L=Label("Text",Relative(.5),purple),.2bp+green);
draw(pic,z1--z2,L=Label("Text",Relative(.5),purple),N);
add(pic.fit(10cm),(1,-1));
dot("se",point(SE),NW,red);
dot("nw",point(NW),SE,red);
dot("SE",truepoint(SE),NW,blue);
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));
}