Page 1 sur 1

Ne pas "étendre" le tracé d'une tangente

Posté : mer. 26 sept. 2012, 17:33
par Fabrice
Bonsoir,
Dans le code ci-après, je souhaiterais que la tangente en M à l'arc BD "s'arrête" au niveau des points d'intersection M et N.

Figure asymptote ae365fafb73d940663b8bdf73fe561ef
*** 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
  1. import geometry;
  2. unitsize(2cm,2cm);
  3. usepackage("kpfonts");
  4. pen p =fontsize(10pt);
  5. pair z0=(0,0), z1=(3,0), z2=(3,3), z3=(0,3);
  6. path g=z0--z1--z2--z3--cycle;
  7. circle c=circle(z1,-z1);
  8. arc a=arc(c,0,90);
  9. pair z4=point(a,22);
  10. line t=tangent(c,z4);
  11. line l1=line(z0,z4);
  12. line l2=line(z2,z3);
  13. line l3=line(z1,z2);
  14. pair z5=intersectionpoint(t,l2);
  15. pair z6=intersectionpoint(t,l3);
  16. pair sommet[]={z0,z1,z2,z3,z4,z5,z6};
  17. string nom[]={"A", "B", "C", "D", "T", "M", "N"};
  18. pair direction[] ={SW,SE,NE,NW,dir(z4-z0),NE,2*E};
  19. draw(g^^z0--z4);
  20. draw(t);
  21. draw(a,red);
  22. for(int k=0; k<nom.length; ++k) label(nom[k],sommet[k],direction[k],p);
  23. perpendicularmark( t, l1,size=0.2cm);
  24. draw(t);

Merci.

Re: Ne pas "étendre" le tracé d'une tangente

Posté : mer. 26 sept. 2012, 18:00
par GM
Bonjour,

Pour avoir un segment au lieu de la ligne... on peut demander le tracé d'un objet de type segment au lieu du type line.

voilà une suggestion... avec quelques modifications supplémentaires.

Notamment... celle d'utiliser le type "point" si on utilise "geometry".

J'en ai profité pour rappeler comment on utilise un "marker".

Figure asymptote 165f29e6a9d5eda8a90e483ac9b90a25
*** 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
  1. import geometry;
  2. unitsize(2cm,2cm);
  3. usepackage("kpfonts");
  4. pen p =fontsize(10pt);
  5. point z0=(0,0), z1=(3,0), z2=(3,3), z3=(0,3);
  6. path g=z0--z1--z2--z3--cycle;
  7. circle c=circle(z1,-z1);
  8. arc a=arc(c,0,90);
  9. point z4=point(a,22);
  10. line t=tangent(c,z4);
  11. line l1=line(z0,z4);
  12. line l2=line(z2,z3);
  13. line l3=line(z1,z2);
  14. point z5=intersectionpoint(t,l2);
  15. point z6=intersectionpoint(t,l3);
  16. point sommet[]={z0,z1,z2,z3,z4,z5,z6};
  17. string nom[]={"A", "B", "C", "D", "T", "M", "N"};
  18. pair direction[] ={SW,SE,NE,NW,unit(z4-z0),N,E};
  19. draw(g^^z0--z4);
  20. marker croix=marker(scale(2)*cross(4),1bp+red);
  21. draw(segment(z5,z6),croix);
  22. draw(a,red);
  23. for(int k=0; k<nom.length; ++k) label(nom[k],sommet[k],direction[k],p);
  24. perpendicularmark( t, l1,size=0.2cm);

Re: Ne pas "étendre" le tracé d'une tangente

Posté : mer. 26 sept. 2012, 18:20
par GM
Suggestion d'éclaircissement du code :

Figure asymptote 522f3db8939d83d91e6c1da34a989f32
*** 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
  1. import geometry;
  2. unitsize(2cm,2cm);
  3. usepackage("kpfonts");
  4. pen p =fontsize(10pt);
  5.  
  6. point z0=(0,0), z1=(3,0), z2=(3,3), z3=(0,3);
  7. path g=box(z0,z2);
  8. circle c=circle(z1,-z1);
  9. arc a=arc(c,0,90);
  10. point z4=point(a,22);
  11. line t=tangent(c,z4),
  12. l1=line(z0,z4),
  13. l2=line(z2,z3),
  14. l3=line(z1,z2);
  15. point z5=intersectionpoint(t,l2),
  16. z6=intersectionpoint(t,l3);
  17.  
  18. draw(g^^z0--z4);
  19. draw(a,red);
  20. marker croix=marker(scale(2)*cross(4),1bp+red);
  21. draw(segment(z5,z6),croix);
  22.  
  23. // Gestion "en tableau" des Labels des points
  24. point sommet[]={z0,z1,z2,z3,z4,z5,z6};
  25. string nom[]={"A", "B", "C", "D", "T", "M", "N"};
  26. pair direction[] ={SW,SE,NE,NW,unit(z4-z0),N,E};
  27. for(int k=0; k<nom.length; ++k) label(nom[k],sommet[k],direction[k],p);
  28.  
  29. perpendicularmark(t, l1,size=0.2cm);

Re: Ne pas "étendre" le tracé d'une tangente

Posté : mer. 26 sept. 2012, 18:25
par Fabrice
Bonsoir Gaëtan,
Merci pour l'amélioration apportée à ce code. J'ai d'ailleurs une petite question par rapport à ceci :

Code : Tout sélectionner

point point(arc a, real x)

Que représente exactement le real x par rapport à l'arc a ?
Merci.

Re: Ne pas "étendre" le tracé d'une tangente

Posté : mer. 26 sept. 2012, 18:44
par GM
Fabrice a écrit :J'ai d'ailleurs une petite question par rapport à ceci :

Code : Tout sélectionner

point point(arc a, real x)


Que représente exactement le real x par rapport à l'arc a ?


Est-ce que cette explication en anglais est suffisante ?

http://www.piprime.fr/files/asymptote/geometry/modules/geometry.asy.html#point(arc,real)

Ta question m'a fait réaliser que tu as écrit :

Code : Tout sélectionner

z4=point(a,22);


Quelle meilleure explication que cette figure ?

Figure asymptote b6fdb944787dc80bfbe41a6d7f50468c
*** 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
  1. import geometry;
  2. unitsize(2cm,2cm);
  3. usepackage("kpfonts");
  4. pen p =fontsize(10pt);
  5.  
  6. point z0=(0,0), z1=(3,0), z2=(3,3), z3=(0,3);
  7. path g=box(z0,z2);;
  8. circle c=circle(z1,-z1);
  9. arc a=arc(c,0,90);
  10. point z4=point(a,22);
  11. line t=tangent(c,z4),
  12. l1=line(z0,z4),
  13. l2=line(z2,z3),
  14. l3=line(z1,z2);
  15. point z5=intersectionpoint(t,l2),
  16. z6=intersectionpoint(t,l3);
  17.  
  18. draw(g^^z0--z4);
  19. draw(a,red,dot());
  20. marker croix=marker(scale(2)*cross(4),1bp+red);
  21. draw(segment(z5,z6),croix);
  22.  
  23. // Gestion "en tableau" des Labels des points
  24. point sommet[]={z0,z1,z2,z3,z4,z5,z6};
  25. string nom[]={"A", "B", "C", "D", "T", "M", "N"};
  26. pair direction[] ={SW,SE,NE,NW,unit(z4-z0),N,E};
  27. for(int k=0; k<nom.length; ++k) label(nom[k],sommet[k],direction[k],p);
  28.  
  29. perpendicularmark(t, l1,size=0.2cm);

L'ajout d'un dot() dans le tracé de l'arc montre bien à quoi correspond le 22.

Maintenant, il est vrai qu'il vaudrait mieux changer de méthode pour décider de la place du point T... si l'idée d'afficher préalablement les noeuds qui ont défini le path de l'arc ne te plait pas. Je suppose que tu avais tâtonné pour trouver le 22. Non ?

Re: Ne pas "étendre" le tracé d'une tangente

Posté : mer. 26 sept. 2012, 19:24
par GM
Histoire d'être complet sur le sujet... et pour expliquer le nodabscissa que tu auras remarqué en suivant le lien que j'ai donné :

Je rappelle que l'extension geometry définit le type abscissa.
On peut créer donc des variables qui soient des instances de ce type, pour désigner des abscisses sur un objet de type line, segment, conic ou arc.

Dans la structure d’un objet de type abscissa, on notera notamment deux attributs importants :

Code : Tout sélectionner

real x;
int system;


x est évidemment la valeur de l'abscisse.

system est le type d'abscisse !
  • 0 pour une abscisse comme fraction de la longueur d’un chemin ;
  • 1 pour une abscisse curviligne ;
  • 2 pour une abscisse angulaire ;
  • 3 pour une abscisse relative aux noeuds du chemin.
Il y a donc beaucoup de fonctions pour définir une abscisse puisqu'il y a plusieurs types d'abscisses.

Une fois une abscisse définie, on peut récupérer le point d’un objet à cette abscisse par la routine :

Code : Tout sélectionner

point(objet,abscisse)


On va avoir :
  • Code : Tout sélectionner

    abscissa relabscissa(real x)
    pour retourner l’abscisse x comme fraction de la longueur d’un chemin.
    On notera que le code point(objet,relabscissa(x)) est équivalent à relpoint(objet,x).

  • Code : Tout sélectionner

    abscissa curabscissa(real x)
    pour retourner l’abscisse curviligne x.
    On notera que le code point(objet,curabscissa(x)) est équivalent à curpoint(objet,x).

  • Code : Tout sélectionner

    abscissa angabscissa(real x, polarconicroutine polarconicroutine=currentpolarconicroutine)
    pour retourner l’abscisse angulaire x.
    On notera que le code point(objet,angabscissa(x)) est équivalent à angpoint(objet,x).

  • Code : Tout sélectionner

    abscissa nodabscissa(real x)
    pour retourner l’abscisse x relative aux noeuds d’un chemin.
    On notera que le code point(objet,nodabscissa(x)) est équivalent à point(objet,x).

Et donc......... si le second attribut de la notation

Code : Tout sélectionner

point(objet,abscisse)
n'est pas de type abscissa mais s'il est de type real, l'explication en anglais du lien t'a montré qu'il sera considéré comme une abscisse relative aux noeuds du chemin.


Beaucoup d'autres choses à découvrir dans la documentation de l'extension geometry ! ;-)

Re: Ne pas "étendre" le tracé d'une tangente

Posté : mer. 26 sept. 2012, 19:31
par GM
Et donc je finis en suggérant de remplacer :

Code : Tout sélectionner

point  z4=point(a,22);
par

Code : Tout sélectionner

point  z4=relpoint(a,1/3);


Le tiers de l'arc... c'est plus clair que le noeud indicé 22 sur un arc dont on ne sait pas exactement combien il a de noeuds au moment où on le définit.

Re: Ne pas "étendre" le tracé d'une tangente

Posté : jeu. 27 sept. 2012, 16:11
par Fabrice
Bonjour,
GM a écrit :Je suppose que tu avais tâtonné pour trouver le 22. Non ?

Euh, oui ...
GM a écrit :Histoire d'être complet sur le sujet

Merci beaucoup, j'ai pris le temps de tout comprendre.
@+ Fabrice