Questions sur le module geometry_dev

Tout ce qui concerne le langage Asymptote. Ce langage est supporté sur le forum via les balises asy.

Modérateur : gdm_asy

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

J'ai de nouvelles questions : :mrgreen:

1) Il ne me semble pas avoir vu de structure représentant une demi-droite. J'ai raté quelque chose ou pas ?

2) Est-il possible de récupérer la longueur d'un segment ?

3) Est-il possible de tracer un cercle en donnant son diamètre (sous forme de segment) ?
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

alekhine
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 228
Inscription : samedi 18 août 2007, 21:57
Localisation : Caen

Re: [Asymptote] Questions sur le module geometry_dev

Message par alekhine »

Bonjour
Il ne me semble pas avoir vu de structure représentant une demi-droite. J'ai raté quelque chose ou pas ?

Code : Tout sélectionner

line demidroite=line(a,false,b);
donne la demi-droite $[AB)$.

MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

Merci alekhine ! :D
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

kib2
Utilisateur confirmé
Utilisateur confirmé
Messages : 80
Inscription : samedi 25 novembre 2006, 22:44

Re: [Asymptote] Questions sur le module geometry_dev

Message par kib2 »

MB a écrit : 2) Est-il possible de récupérer la longueur d'un segment ?
Si je ne dis pas de bétise :

Code : Tout sélectionner

point A = (1,-3);
point B = (-2,5);
real longueur=abs(A-B);
devrait faire l'affaire.
MB a écrit : 3) Est-il possible de tracer un cercle en donnant son diamètre (sous forme de segment) ?
Au pire tu peux toujours créer une routine en utilisant midpoint(A,B) pour récupérer le centre...

Alekhine --> Alexander : le champion du monde, gagné ?

MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

Ok je vais tester ça dès que possible.
Pour résumer, si on veut tracer le cercle de diamètre [AB] on fait :

Code : Tout sélectionner

circle((A+B)/2,abs(A-B)/2);
J'ai pas testé mais (A+B)/2 doit bien remplacer midpoint.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

alekhine
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 228
Inscription : samedi 18 août 2007, 21:57
Localisation : Caen

Re: [Asymptote] Questions sur le module geometry_dev

Message par alekhine »

Alekhine --> Alexander : le champion du monde, gagné ?
Gagné.

Ph. Ivaldi
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 267
Inscription : vendredi 12 janvier 2007, 23:27

Re: [Asymptote] Questions sur le module geometry_dev

Message par Ph. Ivaldi »

MB a écrit :Ok je vais tester ça dès que possible.
Pour résumer, si on veut tracer le cercle de diamètre [AB] on fait :

Code : Tout sélectionner

circle((A+B)/2,abs(A-B)/2);
Si tu veux mais un simple circle(A,B); fait l'affaire (voir ici).

Pour répondre à tes autres questions:

je vais ajouter les routines length(segment) et circle(segment).

Le code suivant est quand même assez lisible:

Code : Tout sélectionner

import geometry_dev;
size(10cm);
segment s=segment((0,0),(1,1));
draw(s);
draw(circle(s.A,s.B));
write(abs(s.A-s.B));
Merci beaucoup de tester geometry_dev avant sa sortie !

Ph. Ivaldi
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 267
Inscription : vendredi 12 janvier 2007, 23:27

Re: [Asymptote] Questions sur le module geometry_dev

Message par Ph. Ivaldi »

kib2 a écrit :Au pire tu peux toujours créer une routine en utilisant midpoint(A,B) pour récupérer le centre...
midpoint(un_segment) existe déjà, ainsi que point(un_segment,0.5).
On peut aussi faire (un_point+un_autre_point)/2.
Il est bien possible qu'il manque des routines fondamentales; ne pas hésiter à m'en faire part.

MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

Ph. Ivaldi a écrit :Si tu veux mais un simple circle(A,B); fait l'affaire (voir ici).
En effet, je n'avais pas vu ça !
C'est bien plus simple.
Ph. Ivaldi a écrit :je vais ajouter les routines length(segment) et circle(segment).
Super. :mrgreen:
Ph. Ivaldi a écrit :Merci beaucoup de tester geometry_dev avant sa sortie !
De rien c'est avec plaisir.
Merci à toi pour tout ton travail concernant Asymptote. :wink:
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

kib2
Utilisateur confirmé
Utilisateur confirmé
Messages : 80
Inscription : samedi 25 novembre 2006, 22:44

Re: [Asymptote] Questions sur le module geometry_dev

Message par kib2 »

Tiens, c'est marrant ça...

je n'avais jamais fais attention au fait qu'Asymptote n'utilise pas les primitives usuelles de C/C++ pour afficher à l'écran avec "write()".
"cout" ne fonctionne pas apparement: bizarre.

Alekhine : c'était pas très dur en tant que joueur d'échecs :)

Ph. Ivaldi
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 267
Inscription : vendredi 12 janvier 2007, 23:27

Re: [Asymptote] Questions sur le module geometry_dev

Message par Ph. Ivaldi »

MB a écrit :
Ph. Ivaldi a écrit :je vais ajouter les routines length(segment) et circle(segment).
Super. :mrgreen:
Ça y est, c'est fait.
En revanche pour markangle je laisse la routine avec les "pair".
Autrement dit un markangle((1,1),(0,0),(-1,-1)) ne tient pas compte du repère courant.
Je pense qu'en général on marque un angle formé par des points nommés.

Bien sur le code suivant ne pose pas de problème grace au «casting point to pair»:

Code : Tout sélectionner

import geo_dev;
size(10cm);
currentcoordsys=cartesiansystem((1,1),(1,1),(-1,1));
show(currentcoordsys);
point A=(1,1), B=(-1,1);
draw(origin()--A^^origin()--B);
markangle(A,origin(),B);

MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

Ph. Ivaldi a écrit :Ça y est, c'est fait.
Merci. Il faut que je télécharge la dernière version alors maintenant.
Au fait, il est prévu que John Bowman intègre ce module à la version officielle d'Asymptote ? en remplacement de geometry.asy ?
Ph. Ivaldi a écrit :En revanche pour markangle je laisse la routine avec les "pair".
Autrement dit un markangle((1,1),(0,0),(-1,-1)) ne tient pas compte du repère courant.
Je pense qu'en général on marque un angle formé par des points nommés.
Ok, pas de problème.
Il est vrai qu'en général je nomme toujours les points. :D
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

Ph. Ivaldi
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 267
Inscription : vendredi 12 janvier 2007, 23:27

Re: [Asymptote] Questions sur le module geometry_dev

Message par Ph. Ivaldi »

MB a écrit :Au fait, il est prévu que John Bowman intègre ce module à la version officielle d'Asymptote ? en remplacement de geometry.asy ?
A priori oui, c'était prévu ainsi au départ mais comme John ne m'a jamais donné son avis sur ce module, je ne peux rien affirmer.
Je pense qu'il attend la documentation...

MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

C'est très pratique le linemargin négatif (voir cet exemple). Ca évite parfois d'utiliser la commande box qui doit se configurer un peu à la main et qui est pénible je trouve lorsqu'on veut augmenter un peu la taille de la figure pour prolonger les droites.
Au départ je n'avais pas pensé à essayé. Donc je le signale.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

Ph. Ivaldi
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 267
Inscription : vendredi 12 janvier 2007, 23:27

Re: [Asymptote] Questions sur le module geometry_dev

Message par Ph. Ivaldi »

MB a écrit :Ca évite parfois d'utiliser la commande box qui doit se configurer un peu à la main et qui est pénible je trouve lorsqu'on veut augmenter un peu la taille de la figure pour prolonger les droites.
Héhééé, j'ai aussi prévu la chose... :-)
Essaye la commande finalbounds();
Elle va te sortir la taille finale de la bounding box. Il te suffit alors de coller le résultat dans un draw(..., invisible) et de modifier à ta convenance les valeurs.

Ph. Ivaldi
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 267
Inscription : vendredi 12 janvier 2007, 23:27

Re: [Asymptote] Questions sur le module geometry_dev

Message par Ph. Ivaldi »

MB a écrit :C'est très pratique le linemargin négatif (voir cet exemple).
Je profite de cet exemple pour montrer comment l'on peut procéder avec la structure "triangle", le code est plus court, les labels du triangle automatiquement placés.

Code : Tout sélectionner

unitsize(1.5cm);
import geometry_dev;
linemargin = -5mm;

triangle T=triangle((3,3),origin,(4,0));
drawline(T);
label(T,alignFactor=5);

point pD = point(T.AB,0.75);
point pE = point(T.BC,0.6);
point pI = intersectionpoint(T.AC,line(pD,pE));

dot(Label("$D$",align=2N),pD);
dot(Label("$E$",align=2S),pE);
dot(Label("$I$",align=NE),pI);

draw(line(pD,pE),dashed);

shipout(bbox(xmargin=1mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

Ah oui, je viens de faire des tests là. C'est vrai que c'est pratique pour pouvoir connaitre les dimensions de la figure. :D
J'avais cherché une fonction de ce genre là avant de penser à tenter un linemargin négatif (même si l'usage du linemargin négatif est plus limité car il ne permet pas d'allonger l'image que d'un seul côté par exemple).

Par contre, je ne comprends pas pourquoi la fonction affiche les coordonnées à l'écran alors qu'elle pourrait les retourner sous forme de tableau non ? (peut être qu'il y a déjà une fonction Asymptote qui fait ça, mais j'avais cherché et je n'ai rien trouvé)

En fait, l'idéal (pour moi) serait une fonction du genre addmargin(top,bottom,left,right) qui permette d'augmenter chacune des dimensions de l'image comme on le souhaite.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

Ph. Ivaldi a écrit :Je profite de cet exemple pour montrer comment l'on peut procéder avec la structure "triangle", le code est plus court, les labels du triangle automatiquement placés.
Oui merci. J'ai pas encore bien testé les structures de type "triangle". :D
Dans cet exemple je voulais surtout utiliser la structure line pour tracer des segments ou des demi-droites. Les figures obtenues sont un peu différentes.
En tout cas c'est bien pratique les labels placés automatiquement. :mrgreen:
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

Ph. Ivaldi
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 267
Inscription : vendredi 12 janvier 2007, 23:27

Re: [Asymptote] Questions sur le module geometry_dev

Message par Ph. Ivaldi »

MB a écrit :J'avais cherché une fonction de ce genre là avant de penser à tenter un linemargin négatif
À la façon Asymptote pur et dur c'est tout simplement :o

Code : Tout sélectionner

currentpicture.addBox(point(SW),point(NE),-(lmargin,bmargin),(rmargin,tmargin));
J'ai bien mis 1h30 pour la trouver celle-là...
MB a écrit :Par contre, je ne comprends pas pourquoi la fonction affiche les coordonnées à l'écran alors qu'elle pourrait les retourner sous forme de tableau non ?
Ben non ce n'est pas possible. Le but de cette routine est de donner la taille finale.
Elle utilise donc un processus qui défère le calcul juste avant le "shipout"; impossible alors de récupérer des valeurs.
MB a écrit :En fait, l'idéal (pour moi) serait une fonction du genre addmargin(top,bottom,left,right) qui permette d'augmenter chacune des dimensions de l'image comme on le souhaite.
Suffit de demander... :wink:
J'ai ajouté la routine suivante:

Code : Tout sélectionner

void addMargins(picture pic=currentpicture,
                real lmargin=0, real bmargin=0,
                real rmargin=lmargin, real tmargin=bmargin)
{/*Add margins to 'pic' with respect to the current bounding box of 'pic'.*/
  pic.addBox(point(pic,SW),point(pic,NE),-(lmargin,bmargin),(rmargin,tmargin));
}
Elle doit être utilisée à la fin du code, juste avant un éventuel "shipout".
Du coup, j'ai envie de supprimer finalbounds...

MB
Administrateur
Administrateur
Messages : 7141
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [Asymptote] Questions sur le module geometry_dev

Message par MB »

Merci c'est super ça.
Je viens de tester et ça fonctionne bien comme je le souhaitais.

Par contre, juste une chose que je ne comprends pas.
Il semblerait que les Labels ne soient pas pris en compte dans la taille de la figure. Car par exemple, si un point est situé sur la gauche de la figure et qu'un label est encore placé à gauche de ce point (qui est disons le point le plus à gauche de la figure) alors la présence de ce Label va augmenter la dimension de la figure pour pouvoir être affiché. Mais, d'après mes tests il semblerait qu'un addMargins visant à augmenter encore la taille de la figure sur la gauche ne soit pas pris en compte à partir du Label mais plutôt à partir du point. Il faut donc augmenter la valeur dans le addMargins afin que la dimension de la figure soit véritablement augmentée.

Je ne sais pas si je suis bien clair ! :|
Ph. Ivaldi a écrit :Du coup, j'ai envie de supprimer finalbounds...
Bah ça je ne sais pas. Ca peut toujours être utile à certains. :D
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.