Questions sur le module geometry_dev

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
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 non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu par MB »

Merci alekhine ! :D
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
kib2

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
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 non lu par alekhine »

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

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
kib2

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
Ph. Ivaldi

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
Ph. Ivaldi

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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));
Pièces jointes
triangle.png
triangle.png (14.27 Kio) Consulté 1780 fois
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
Ph. Ivaldi

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Re: [Asymptote] Questions sur le module geometry_dev

Message non lu 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. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message