Page 1 sur 1

Tracer un segment de longueur 'fixe'

MessagePosté: Mardi 04 Janvier 2011, 20:54
par MB
Bonsoir à tous,

certains objets (par exemple arrow) ont des dimensions 'fixes' (indiquées en mm par exemple).
Ma question est très simple, la réponse doit l'être aussi, mais je l'ignore : comment faire pour tracer un segment de longueur fixe ?

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Mardi 04 Janvier 2011, 21:12
par OG
Plusieurs façons. Derrière c'est le fameux deferred drawing, certainement le truc un peu difficile à comprendre (je n'ai pas compris en fait).
C'est un peu abordé dans intro.pdf, après il faut voir un peu ici post100831.html#p100831
ou encore fouiller dans le code de plain_arrows.asy.


be12d888fde585d0fb6379e399be2a8d.png

Code: Tout sélectionner
size(100,0);
draw((0,0)--(1,0));
picture pic;
draw(pic,scale(1cm)*((0,0)--(1,0))); // segment de 1cm
add(pic.fit(),(0,1)); //ajouter à la "current picture" position (0,1)


ou encore

0956af18a317bcb2866c29c3ccc7f6b3.png

Code: Tout sélectionner
size(200);
currentpicture.add(new void(frame f, transform t) {
transform it=inverse(t);
draw(it*((0,10)--(4cm,10)));
});

draw((0,0)--(4cm,4cm));


O.G.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Mardi 04 Janvier 2011, 21:25
par Francky
Il y aussi la technique de
Code: Tout sélectionner
unitsize(1cm);

Pour le coup, tout ce que tu entres est fixe.
Code: Tout sélectionner
draw((0,0)--(1,0))

mesurera 1cm, c'est sûr.

Je l'utilise un coup sur deux.
Mais je ne sais pas si ça répond à la question.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Mardi 04 Janvier 2011, 23:07
par MB
@OG : on dirait donc qu'il n'y a pas de commande direct car là c'est un peu une bidouille non ?
Il faudrait que je regarde le code dans plain_arrows.

@Francky : justement, c'était dans le cas ou unitsize est différent de 1cm.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Mardi 04 Janvier 2011, 23:24
par Francky
A-t-on accès au unité em ou ex dans asymptote ?
Si oui, elles devraient être fixe même sans unitsize.
J'ai le souvenir de n'avoir jamais réussi à les utiliser.

On doit pouvoir bidouiller sinon avec une boite de texte (invisible) et un scale.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Mardi 04 Janvier 2011, 23:36
par MB
En tous cas, je cherche une solution indépendante de unitsize ou size.
Je n'ai pas trouvé grand chose dans plain_arrows à ce sujet et je ne trouve pas non plus où sont définies et comment sont gérées les différentes unités (cm, bp, ...) dans asymptote. Il faudra que j'essaye de mieux comprendre aussi le code donné par OG.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Mercredi 05 Janvier 2011, 10:29
par chellier
MB a écrit:En tous cas, je cherche une solution indépendante de unitsize ou size.

Je pense que la seule solution est le deferred drawing (auquel je n'ai rien compris non plus), avec le code que t'a donné OG.
Code: Tout sélectionner
currentpicture.add(new void(frame f, transform t) {
transform it=inverse(t);

C'est ce que j'ai utilisé pour mon extension sur les inéquations pour avoir des crochets de taille fixe.

MB a écrit:je ne trouve pas non plus où sont définies et comment sont gérées les différentes unités (cm, bp, ...) dans asymptote.

C'est dans plain_constants.asy (au moins pour la définition).

Sinon, tout dépends de ce que l'on veut faire, mais tracer des éléments dans une picture en ayant fixé l'échelle dans celle-ci peut être une bonne solution :
Dans la figure suivante, les échelles sont les mêmes :

52adc9e51ea5043b5a2f7f1d6451a5c5.png

Code: Tout sélectionner
unitsize(1cm);

picture pic;
unitsize(pic,1cm);
draw(pic,(0,0)--(4,0)--(0,3)--cycle);
draw(pic,(0,0)--(2,1.5));

draw(circle((2,1.5),2.5));
add(pic.fit(),(0,0));

Dans celle ci, l'échelle n'est pas la même, le triangle garde les mêmes dimensions (3, 4 et 5cm), mais pas le cercle :

5b20fba54630fe6e6399e7c1d632140a.png

Code: Tout sélectionner
size(6cm);

picture pic;
unitsize(pic,1cm);
draw(pic,(0,0)--(4,0)--(0,3)--cycle);
draw(pic,(0,0)--(2,1.5));

draw(circle((2,1.5),2.5));
add(pic.fit(),(0,0));


Christophe

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Mercredi 05 Janvier 2011, 14:05
par OG
Francky a écrit:A-t-on accès au unité em ou ex dans asymptote ?
Si oui, elles devraient être fixe même sans unitsize.
J'ai le souvenir de n'avoir jamais réussi à les utiliser.

On doit pouvoir bidouiller sinon avec une boite de texte (invisible) et un scale.


J'avais essayé à la suite de ton message, sans réussir en fait (je n'ai pas persisté).
Il faut voir que d'une part c'est dépendant de la fonte utilisée et d'autre part si tu récupères cette valeur il te faudra faire la solution 1 ou celle du deferred drawing.
Une solution c'est de récupérer les valeurs pour la fonte que tu utilises (tu ne dois pas changer tous les jours), les garder au chaud dans un fichier.

O.G.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Mercredi 05 Janvier 2011, 15:33
par GMaths
Rappel d'un document que j'avais proposé au mois d'avril, avec différents tests :

longueur_independante_de_size_unitsize.pdf
(50.78 Kio) Téléchargé 76 fois

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Jeudi 06 Janvier 2011, 11:39
par MB
Merci pour toutes vos remarques et pour le document.
J'ai également remarqué le code contenu dans plain_arrows et voici ce que j'ai pu en faire :

3cda24bbd2e2f2aea722b84308458775.png

Code: Tout sélectionner
size(5cm,0);
real xmax = 25, ymax = 15;
draw((-1,0)--(xmax,0)^^(0,-1)--(0,ymax));
picture arrowpic;
real myarrowsize = 2mm;
path arrowpath = (0,0)--(2*myarrowsize,0);
arrowpic = arrow(arrowpath,red,myarrowsize);
add(arrowpic.fit(),(xmax,0));
path arrowpath = (0,0)--(0,2*myarrowsize);
arrowpic = arrow(arrowpath,red,myarrowsize);
add(arrowpic.fit(),(0,ymax));


L'objectif était d'ajouter des flèches de taille fixe au bouts de deux axes car je n'arrivais pas à obtenir exactement ce que je voulais avec graph. Il est à noter que arrowsize ne peut pas dépasser la moitié de la longueur du path qui lui est associé.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Jeudi 06 Janvier 2011, 12:06
par GMaths
MB a écrit:Il est à noter que arrowsize ne peut pas dépasser la moitié de la longueur du path qui lui est associé.

Effectivement :

789c3dad60290b349be9ff5be84b18ac.png

Code: Tout sélectionner
size(5cm);
real[] s={.5,1,2,5,10,15,20};
int i=0;
for(real k:s) draw(Label(string(k),Relative(0),S),(++i,0)--(i,2),1bp+blue,Arrow(size=k*mm));

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Vendredi 07 Janvier 2011, 12:00
par OG
Francky a écrit:A-t-on accès au unité em ou ex dans asymptote ?
Si oui, elles devraient être fixe même sans unitsize.
J'ai le souvenir de n'avoir jamais réussi à les utiliser.

On doit pouvoir bidouiller sinon avec une boite de texte (invisible) et un scale.


Il y a ici deux questions, avoir accès et être fixe. Pour le deuxième point, ce n'est pas dans la conception d'asymptote (système de coordonnées de l'utilisateur) : tout comme il n'y a aucune raison que

Code: Tout sélectionner
draw((0,0)--(1cm,0));


ne fasse un trait de longeur 1cm

Code: Tout sélectionner
draw((0,0)--(1em,0));


ne fera pas un trait de longeur 1em. Mais les mécanismes add(pic), deferred drawing permettent tout de même de faire (si on a accès) de faire ce que tu voudras (ou presque).

Je croyais que 1em était exactement la largeur de la lettre M, ce n'est pas tout à fait le cas en TeX, c'est approximativement et plutôt égal à la longueur de quad.
Si tu ne veux pas faire une base de données des longueurs em, ex, voici une façon de faire, code non nettoyé, non optimisév voire elliptique.

d04a63b7f14348697508faec0dc0703b.png

Code: Tout sélectionner
size(200);

defaultpen(fontsize(12));

picture f;
label(f,"\hspace{1em}",(0,0));
picture ff;
label(ff,"\hspace{2em}",(0,0));
real em=size(ff,false).x-size(f,false).x;

add(f,(1,3));

frame fff;
label(fff,"\rule{1em}{1em}",(0,0));
add(fff,(1,1),20N);
currentpicture.add(new void(frame f, transform t) {
transform it=inverse(t);
draw(it*((0,0)--(1em,0)));
});

draw((0,0)--(4,4));
picture pic;
draw(pic,scale(em)*unitsquare);
add(pic.fit(),(1,1),(0,0));
dot((1,1));
label("M",(1,1),2N);


O.G.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Vendredi 07 Janvier 2011, 21:16
par OG
MB a écrit:Il est à noter que arrowsize ne peut pas dépasser la moitié de la longueur du path qui lui est associé.


En faisant un petit effort cela se contourne

8781f7e3228c0ec67acca58fa0bc122f.png

Code: Tout sélectionner
plain.arrowsizelimit=1;
size(5cm);
real[] s={.5,1,2,5,10,15,20};
int i=0;
for(real k:s) draw(Label(string(k),Relative(0),S),(++i,0)--(i,2),1bp+blue,Arrow(size=k*mm));


O.G.

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Vendredi 07 Janvier 2011, 21:27
par MB
OG a écrit:En faisant un petit effort cela se contourne

8781f7e3228c0ec67acca58fa0bc122f.png

Code: Tout sélectionner
plain.arrowsizelimit=1;
size(5cm);
real[] s={.5,1,2,5,10,15,20};
int i=0;
for(real k:s) draw(Label(string(k),Relative(0),S),(++i,0)--(i,2),1bp+blue,Arrow(size=k*mm));


Bien joué. :)

Re: Tracer un segment de longueur 'fixe'

MessagePosté: Vendredi 07 Janvier 2011, 21:35
par OG
Par contre le plain. est inutile :

Code: Tout sélectionner
arrowsizelimit=1;


suffit.

O.G.