http://wiki.noordover.org, un wiki dont l'objectif est modeste : permettre d'écrire facilement, en vrac, à un rythme de sénateur, quelques trucs et astuces divers, pour ne pas les oublier et aider éventuellement d'autres personnes.

Retour au Sommaire de la section du wiki relative Ă  Asymptote

[[ Asymptote : fonction DIR ]]

Cette page n'est pas achevée… mais je pense qu'elle peut déjà aider à comprendre quelques subtilités de la fonction DIR..

Fonction DIR : de type pair

Fonction DIR : syntaxe n°1

pair dir(real angle)

définit le point (le vecteur unitaire) de coordonnées $(\cos\theta ; \sin\theta)$ si l'angle est $\theta$ en degrés.

/*---------------------------------------------*/
 
import markers;
size(4cm,0);
pair A=0, B=(1.5,0), C=dir(45), D=dir(-30);
draw(A--B);
draw(Label("dir(45)", EndPoint),
     A--C, .5bp+red, Arrow);
draw(Label("dir(-30)", EndPoint),
     A--D, .5bp+blue, Arrow);
markangle("$45°$",radius=40,B,A,C,
                  ArcArrow(2mm),.5mm+red);
markangle("$-30°$",radius=-30,B,A,D,
                   ArcArrow(2mm),.5mm+blue);
 
/*---------------------------------------------*/


import markers;
size(4cm,0);
pair A=0, B=(1.5,0), C=dir(45), D=dir(-30);
draw(A--B);
draw(Label("dir(45)", EndPoint),
     A--C, .5bp+red, Arrow);
draw(Label("dir(-30)", EndPoint),
     A--D, .5bp+blue, Arrow);
markangle("$45°$",radius=40,B,A,C,
                  ArcArrow(2mm),.5mm+red);
markangle("$-30°$",radius=-30,B,A,D,
                   ArcArrow(2mm),.5mm+blue);
pair expi(real angle)

est la fonction analogue avec l'angle en radians.

Fonction DIR : syntaxe n°2

pair dir(path p, int t, int sign=0);

Lorsque sign<0, la fonction renvoie la direction (les coordonnées d'un vecteur unitaire) de la demi-tangente “entrante” au noeud t du chemin p.

Dans l'exemple qui suit, avec sign=-1<0 :

  • dir(p,0,-1) est le vecteur nul car $A$ est le noeud 0 du chemin p. (pas de demi-tangente “entrante”)
  • dir(p,1,-1) est le vecteur unitaire $\vec{T_1e}$ qui dirige la demi-tangente “entrante” au noeud 1 (point $B$) du chemin p.
  • dir(p,2,-1) est le vecteur unitaire $\vec{T_2e}$ qui dirige la demi-tangente “entrante” au noeud 2 (point $C$) du chemin p.
/*---------------------------------------------*/
 
size(4cm,0);
pair O=(0,0), A=(-1,3), B=(0,1.5), C=(2,2);
path p=A{dir(-80)}
       ..{dir(-80)}B{dir(10)}
       ..C{dir(-10)};
pair T0e=dir(p,0,-1);
pair T1e=dir(p,1,-1);
pair T2e=dir(p,2,-1);
dot("$A_{(0)}$",A,N);  
dot("$B_{(1)}$",B,S);
dot("$C_{(2)}$",C,N);
draw(Label("$\vec{T_1e}$", 
     MidPoint, fontsize(10pt)),
     (B-T1e)--B, .5bp+red, Arrow);
draw(Label("$\vec{T_2e}$", 
     MidPoint, fontsize(10pt)),
     (C-T2e)--C, .5bp+red, Arrow);
draw(p);
 
/*---------------------------------------------*/


size(4cm,0);
pair O=(0,0), A=(-1,3), B=(0,1.5), C=(2,2);
path p=A{dir(-80)}
       ..{dir(-80)}B{dir(10)}
       ..C{dir(-10)};
pair T0e=dir(p,0,-1);
pair T1e=dir(p,1,-1);
pair T2e=dir(p,2,-1);
dot("$A_{(0)}$",A,N);  
dot("$B_{(1)}$",B,S);
dot("$C_{(2)}$",C,N);
draw(Label("$\vec{T_1e}$", 
     MidPoint, fontsize(10pt)),
     (B-T1e)--B, .5bp+red, Arrow);
draw(Label("$\vec{T_2e}$", 
     MidPoint, fontsize(10pt)),
     (C-T2e)--C, .5bp+red, Arrow);
draw(p);

Lorsque sign>0, la fonction renvoie la direction (les coordonnées d'un vecteur unitaire) de la demi-tangente “sortante” au noeud t du chemin p.

Dans l'exemple qui suit, avec sign=1>0 :

  • dir(p,0,1) est le vecteur unitaire $\vec{T_0s}$ qui dirige la demi-tangente “sortante” au noeud 0 (point $A$) du chemin p.
  • dir(p,1,1) est le vecteur unitaire $\vec{T_1s}$ qui dirige la demi-tangente “sortante” au noeud 1 (point $B$) du chemin p.
  • dir(p,2,1) est le vecteur nul car $C$ est le dernier noeud du chemin p. (pas de demi-tangente “sortante”)
/*---------------------------------------------*/
 
size(4cm,0);
pair O=(0,0), A=(-1,3), B=(0,1.5), C=(2,2);
path p=A{dir(-80)}
       ..{dir(-80)}B{dir(10)}
       ..C{dir(-10)};
pair T0s=dir(p,0,1);
pair T1s=dir(p,1,1);
pair T2s=dir(p,2,1);
dot("$A_{(0)}$",A,N);  
dot("$B_{(1)}$",B,S);
dot("$C_{(2)}$",C,N);
draw(Label("$\vec{T_0s}$", 
     MidPoint, fontsize(10pt)),
     A--A+T0s, .5bp+blue, Arrow);
draw(Label("$\vec{T_1s}$", 
     MidPoint, fontsize(10pt)),
     B--B+T1s, .5bp+blue, Arrow);
draw(p);
 
/*---------------------------------------------*/


size(4cm,0);
pair O=(0,0), A=(-1,3), B=(0,1.5), C=(2,2);
path p=A{dir(-80)}
       ..{dir(-80)}B{dir(10)}
       ..C{dir(-10)};
pair T0s=dir(p,0,1);
pair T1s=dir(p,1,1);
pair T2s=dir(p,2,1);
dot("$A_{(0)}$",A,N);  
dot("$B_{(1)}$",B,S);
dot("$C_{(2)}$",C,N);
draw(Label("$\vec{T_0s}$", 
     MidPoint, fontsize(10pt)),
     A--A+T0s, .5bp+blue, Arrow);
draw(Label("$\vec{T_1s}$", 
     MidPoint, fontsize(10pt)),
     B--B+T1s, .5bp+blue, Arrow);
draw(p);

Lorsque sign=0, la fonction renvoie la direction de la bissectrice de l'angle défini par les demi-tangentes “entrante” et “sortante” au noeud t du chemin p. Pour le premier noeud du chemin et pour le dernier, c'est particulier : la fonction renvoie la direction de la demi-tangente “sortante” pour le noeud 0 et celle de la demi-tangente “entrante” pour le dernier noeud.

Dans l'exemple qui suit, avec sign=0 :

  • dir(p,0,0) est le vecteur unitaire $\vec{T_0}$ qui dirige la demi-tangente “sortante” au noeud 0 (point $A$) du chemin p.
  • dir(p,1,0) est le vecteur unitaire $\vec{T_1}$ qui dirige la bissectrice de l'angle $(\vec{T_1e},\vec{T_1s})$ dĂ©fini par les demi-tangentes “entrante” et “sortante” au noeud 1 (point $B$) du chemin p.
  • dir(p,2,0) est le vecteur unitaire $\vec{T_2}$ qui dirige la demi-tangente “entrante” au noeud 2 (point $C$) du chemin p.
/*---------------------------------------------*/
 
size(4cm,0);
pair O=(0,0), A=(-1,3), B=(0,1.5), C=(2,2);
path p=A{dir(-80)}
       ..{dir(-80)}B{dir(10)}
       ..C{dir(-10)};
pair T0=dir(p,0,0);
pair T1=dir(p,1,0);
pair T2=dir(p,2,0);
dot("$A_{(0)}$",A,N);  
dot("$C_{(2)}$",C,N);
draw(Label("$\vec{T_0}$", 
     MidPoint, fontsize(10pt)),
     A--A+T0, .5bp+green, Arrow);
draw(Label("$\vec{T_1e}$", 
     EndPoint, fontsize(10pt)),
     B--B+dir(p,1,-1), .5bp+red, Arrow);
draw(Label("$\vec{T_1s}$", 
     EndPoint, fontsize(10pt)),
     B--B+dir(p,1,1), .5bp+blue, Arrow);
draw(Label("$\vec{T_1}$", 
     EndPoint, fontsize(10pt)),
     B--B+T1, .5bp+green, Arrow);
draw(Label("$\vec{T_2}$", 
     MidPoint, fontsize(10pt)),
     C--C+T2, .5bp+green, Arrow);
draw(p);
 
/*---------------------------------------------*/


size(4cm,0);
pair O=(0,0), A=(-1,3), B=(0,1.5), C=(2,2);
path p=A{dir(-80)}
       ..{dir(-80)}B{dir(10)}
       ..C{dir(-10)};
pair T0=dir(p,0,0);
pair T1=dir(p,1,0);
pair T2=dir(p,2,0);
dot("$A_{(0)}$",A,N);  
dot("$C_{(2)}$",C,N);
draw(Label("$\vec{T_0}$", 
     MidPoint, fontsize(10pt)),
     A--A+T0, .5bp+green, Arrow);
draw(Label("$\vec{T_1e}$", 
     EndPoint, fontsize(10pt)),
     B--B+dir(p,1,-1), .5bp+red, Arrow);
draw(Label("$\vec{T_1s}$", 
     EndPoint, fontsize(10pt)),
     B--B+dir(p,1,1), .5bp+blue, Arrow);
draw(Label("$\vec{T_1}$", 
     EndPoint, fontsize(10pt)),
     B--B+T1, .5bp+green, Arrow);
draw(Label("$\vec{T_2}$", 
     MidPoint, fontsize(10pt)),
     C--C+T2, .5bp+green, Arrow);
draw(p);

Lorsque le chemin p ne contient qu'un seul point, la valeur retournée est (0,0).

Un nouvel exemple pour résumer les différents cas :

/*---------------------------------------------*/
 
size(7cm,0);
pair O=(0,0);
path p=(0,0){dir(0)}
     ..{dir(45)}(2,2){dir(-15)}
     ..{dir(-25)}(3,.75){dir(15)}
     ..{dir(-60)}(4,0);
pair T0=dir(p, 0, 0);
pair T1e=dir(p, 1, -1);
pair T1=dir(p, 1, 0);
pair T1s=dir(p, 1, 1);
pair T2e=dir(p, 2, -1);
pair T2=dir(p, 2, 0);
pair T2s=dir(p, 2, 1);
pair T3=dir(p, 3, 0);
draw(p);
draw(Label("dir(p,0,0)", 
     EndPoint, fontsize(10pt)),
     point(p,0)--point(p,0)+T0, green, Arrow);
draw(Label("dir(p,1,-1)", 
     EndPoint, fontsize(10pt)),
     point(p,1)--point(p,1)+T1e, red, Arrow);
draw(Label("dir(p,1,0)", 
 
     EndPoint, fontsize(10pt)),
     point(p,1)--point(p,1)+T1, green, Arrow);
draw(Label("dir(p,1,1)", 
     EndPoint, fontsize(10pt)),
     point(p,1)--point(p,1)+T1s, blue, Arrow);
draw(Label("dir(p,2,-1)", 
     EndPoint, fontsize(10pt)),
     point(p,2)--point(p,2)+T2e, red, Arrow);
draw(Label("dir(p,2,0)", 
     EndPoint, fontsize(10pt)),
     point(p,2)--point(p,2)+T2, green, Arrow);
draw(Label("dir(p,2,1)", 
     EndPoint, fontsize(10pt)),
     point(p,2)--point(p,2)+T2s, blue, Arrow);
draw(Label("dir(p,3,0)", 
     EndPoint, fontsize(10pt)),
     point(p,3)--point(p,3)+T3, green, Arrow);
 
/*---------------------------------------------*/


size(7cm,0);
pair O=(0,0);
path p=(0,0){dir(0)}
     ..{dir(45)}(2,2){dir(-15)}
     ..{dir(-25)}(3,.75){dir(15)}
     ..{dir(-60)}(4,0);
pair T0=dir(p, 0, 0);
pair T1e=dir(p, 1, -1);
pair T1=dir(p, 1, 0);
pair T1s=dir(p, 1, 1);
pair T2e=dir(p, 2, -1);
pair T2=dir(p, 2, 0);
pair T2s=dir(p, 2, 1);
pair T3=dir(p, 3, 0);
draw(p);
draw(Label("dir(p,0,0)", 
     EndPoint, fontsize(10pt)),
     point(p,0)--point(p,0)+T0, green, Arrow);
draw(Label("dir(p,1,-1)", 
     EndPoint, fontsize(10pt)),
     point(p,1)--point(p,1)+T1e, red, Arrow);
draw(Label("dir(p,1,0)", 
     EndPoint, fontsize(10pt)),
     point(p,1)--point(p,1)+T1, green, Arrow);
draw(Label("dir(p,1,1)", 
     EndPoint, fontsize(10pt)),
     point(p,1)--point(p,1)+T1s, blue, Arrow);
draw(Label("dir(p,2,-1)", 
     EndPoint, fontsize(10pt)),
     point(p,2)--point(p,2)+T2e, red, Arrow);
draw(Label("dir(p,2,0)", 
     EndPoint, fontsize(10pt)),
     point(p,2)--point(p,2)+T2, green, Arrow);
draw(Label("dir(p,2,1)", 
     EndPoint, fontsize(10pt)),
     point(p,2)--point(p,2)+T2s, blue, Arrow);
draw(Label("dir(p,3,0)", 
     EndPoint, fontsize(10pt)),
     point(p,3)--point(p,3)+T3, green, Arrow);

Fonction DIR : syntaxe n°3

pair dir(path p, real t);

This returns the direction of the tangent to path p at the point between node floor(t) and floor(t)+1 corresponding to the cubic spline parameter t-floor(t) (see Bezier). If p contains only one point, (0,0) is returned.

/*---------------------------------------------*/
 
size(7cm,0);
pair A=(0,0), B=(3,0), C=(4,-1);
dot(A);dot(B);dot(C);
path p=A{dir(-30)}..{dir(-80)}B{dir(20)}..{dir(-45)}C;
draw(p);
for (real t=0; t <= 2; t += .2) {
  draw(Label(format("%f",t),
       EndPoint, fontsize(8pt)),
       point(p,t)--point(p,t)+dir(p,t), 
       .8bp+red, Arrow);
}
 
/*---------------------------------------------*/


size(7cm,0);
pair A=(0,0), B=(3,0), C=(4,-1);
dot(A);dot(B);dot(C);
path p=A{dir(-30)}..{dir(-80)}B{dir(20)}..{dir(-45)}C;
draw(p);
for (real t=0; t <= 2; t += .2) {
  draw(Label(format("%f",t),
       EndPoint, fontsize(8pt)),
       point(p,t)--point(p,t)+dir(p,t), 
       .8bp+red, Arrow);
}

Important ! Dans la révision 3190, de la version SVN en date du 25/06/08 est intervenue une modification de cette syntaxe. Sur les prochaines versions (à partir de la probable 1.44), on aura la syntaxe :

pair dir(path p, real t, int sign=0);
  • lorsque sign<0, cela retournera (et je traduirai plus tard) : the direction of the incoming tangent to path p at the point between node floor(t) and floor(t)+1 corresponding to the cubic spline parameter t-floor(t) (BĂ©zier).
  • lorsque sign>0, cela retournera (et je traduirai plus tard) : the direction of the outgoing tangent to path p at the point between node floor(t) and floor(t)+1 corresponding to the cubic spline parameter t-floor(t) (BĂ©zier).
  • lorsque sign=0, cela retournera la moyenne des deux directions prĂ©cĂ©dentes.
  • Lorsque p sera restreint Ă  un point, (0,0) sera retournĂ©.

Fonction DIR : syntaxe n°4 (non présente dans la documentation)

pair dir(path p);

est l'équivalent de

dir(p,length(p));

et retourne la direction de la demi-tangente *à la fin* du chemin “p”

/*---------------------------------------------*/
 
size(4cm,0);
pair A=(0,3), B=(1,1.5), C=(2,2);
path p=A{dir(-80)}
       ..{dir(-80)}B{dir(10)}
       ..C{dir(-30)};
draw(Label("$\vec{T}$", 
     MidPoint, fontsize(10pt)),
     C--C+dir(p), .8bp+green, Arrow);
draw(p);
 
/*---------------------------------------------*/


size(4cm,0);
pair A=(0,3), B=(1,1.5), C=(2,2);
path p=A{dir(-80)}
       ..{dir(-80)}B{dir(10)}
       ..C{dir(-30)};
draw(Label("$\vec{T}$", 
     MidPoint, fontsize(10pt)),
     C--C+dir(p), .8bp+green, Arrow);
draw(p);

Fonction DIR : syntaxe n°5 (non présente dans la documentation)

pair dir(path g, path h);

est l'équivalent de

0.5*(dir(g)+dir(h));

et retourne la demi-somme des directions des demi-tangentes.

/*---------------------------------------------*/
 
size(4cm,0);
pair F=(3,3);
path p1=(0,0)..(2,1)..F;
path p2=(0,3)..(2,2.5)..F;
draw(p1);
draw(p2);
draw(F--F+dir(p1), .8bp+red, Arrow);
draw(F--F+dir(p2), .8bp+blue, Arrow);
draw(Label("$\vec{T}$", 
     MidPoint, fontsize(10pt)),
     F--F+dir(p1,p2), 1bp+green, Arrow);
 
/*---------------------------------------------*/


size(4cm,0);
pair F=(3,3);
path p1=(0,0)..(2,1)..F;
path p2=(0,3)..(2,2.5)..F;
draw(p1);
draw(p2);
draw(F--F+dir(p1), .8bp+red, Arrow);
draw(F--F+dir(p2), .8bp+blue, Arrow);
draw(Label("$\vec{T}$", 
     MidPoint, fontsize(10pt)),
     F--F+dir(p1,p2), 1bp+green, Arrow);

Fonction DIR : de type triple

Fonction DIR : syntaxe n°6

triple dir(real colatitude, real longitude)

returns a unit triple in the direction (colatitude,longitude) measured in degrees.


Outils personnels