Tracer un segment de longueur 'fixe'

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Tracer un segment de longueur 'fixe'

Messagepar MB » Mardi 04 Janvier 2011, 20:54

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 ?
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6890
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Tracer un segment de longueur 'fixe'

Messagepar OG » Mardi 04 Janvier 2011, 21:12

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.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Tracer un segment de longueur 'fixe'

Messagepar Francky » Mardi 04 Janvier 2011, 21:25

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.
Linux Mint | TeXLive - TexMaker - asymptote | Python3 & C - Geany - Project Euler - SPOJ
Entia non sunt multiplicanda praeter necessitatem
Francky
Giga-utilisateur
 
Messages: 683
Inscription: Dimanche 11 Avril 2010, 13:01
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar MB » Mardi 04 Janvier 2011, 23:07

@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.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6890
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar Francky » Mardi 04 Janvier 2011, 23:24

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.
Linux Mint | TeXLive - TexMaker - asymptote | Python3 & C - Geany - Project Euler - SPOJ
Entia non sunt multiplicanda praeter necessitatem
Francky
Giga-utilisateur
 
Messages: 683
Inscription: Dimanche 11 Avril 2010, 13:01
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar MB » Mardi 04 Janvier 2011, 23:36

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.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6890
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar chellier » Mercredi 05 Janvier 2011, 10:29

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
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar OG » Mercredi 05 Janvier 2011, 14:05

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.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Tracer un segment de longueur 'fixe'

Messagepar GMaths » Mercredi 05 Janvier 2011, 15:33

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é 70 fois
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar MB » Jeudi 06 Janvier 2011, 11:39

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é.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6890
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar GMaths » Jeudi 06 Janvier 2011, 12:06

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));
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar OG » Vendredi 07 Janvier 2011, 12:00

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.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Tracer un segment de longueur 'fixe'

Messagepar OG » Vendredi 07 Janvier 2011, 21:16

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.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Tracer un segment de longueur 'fixe'

Messagepar MB » Vendredi 07 Janvier 2011, 21:27

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é. :)
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6890
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: Tracer un segment de longueur 'fixe'

Messagepar OG » Vendredi 07 Janvier 2011, 21:35

Par contre le plain. est inutile :

Code: Tout sélectionner
arrowsizelimit=1;


suffit.

O.G.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence


Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités