LIGNES, DROITES, SEGMENTS (34)
Liste des figures
Figure fig_aa01_150208_segments
figure 0001
Figure fig_aa02_150208_segments
figure 0002
Figure fig_aa03_190208_segments
figure 0003
Figure fig_ab01_150208_stylos
figure 0004
Figure fig_ab02_010808_stylos
figure 0005
Figure fig_ac01_040409_stylos
figure 0006
Figure fig_da01_220208_droite
figure 0007
Figure fig_da02_220208_droite
figure 0008
Figure fig_da03_080308_droite
figure 0009
Figure fig_db01_080308_droites
figure 0010
Figure fig_db02_080308_droites
figure 0011
Figure fig_db03_080308_droites
figure 0012
Figure fig_db04_090308_droites
figure 0013
Figure fig_ea01_220208_droite_equation
figure 0014
Figure fig_fa01_090308_droite_parallele
figure 0015
Figure fig_ga01_090308_droite_perpendiculaire
figure 0016
Figure fig_ga02_090308_mediatrice
figure 0017
Figure fig_lb01_180208_line_A_B
figure 0018
Figure fig_lb02_090308_line_A_B
figure 0019
Figure fig_lb03_281209_line_A_B_hachures
figure 0020
Figure fig_mb01_180208_line_m_p
figure 0021
Figure fig_na01_060708_droite_graduee
figure 0022
Figure fig_na02_060708_droite_graduee
figure 0023
Figure fig_pa01_010808_path
figure 0024
Figure fig_pa02_010808_path
figure 0025
Figure fig_pa03_010808_path
figure 0026
Figure fig_pa04_010808_path
figure 0027
Figure fig_pb01_291009_path_Bezier
figure 0028
Figure fig_pb02_291009_path_Bezier
figure 0029
Figure fig_pb03_291009_path_Bezier
figure 0030
Figure fig_pb04_291009_path_Bezier
figure 0031
Figure fig_ta01_010808_arctime
figure 0032
Figure fig_tb01_010808_dirtime
figure 0033
Figure fig_tc01_010808_reltime
figure 0034
Asymptote - Figure 0001: fig_aa01_150208_segments.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_aa01_150208_segments
// définition de l'unité de longueur 
unitsize(1cm);

// on trace un segment défini par les coordonnées de ses extrémités
draw ((0,0)--(6,1));

// un deuxième segment d'un trait plus épais
draw ((0,0)--(5,2),linewidth(4bp));

// un troisième vert et d'une épaisseur intermédiaire
draw ((0,0)--(4,4),green+2bp);
Asymptote - Figure 0002: fig_aa02_150208_segments.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_aa02_150208_segments
// On définit la largeur de l'image ;
// la hauteur va s'adapter pour garder les proportions.
size(7cm,0);

// définition de 4 "points" (couples de coordonnées)
// NB : ces couples pourraient aussi caractériser des vecteurs
pair A, B, C, D;
A=(0,0);
B=(2,1);
C=(2,2);
D=(4,0);

// on trace [AB] de couleur rouge
draw(A--B,red);

// et [CD] d'un trait plus épais et bleu
draw(C--D,blue+3bp);
Asymptote - Figure 0003: fig_aa03_190208_segments.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_aa03_190208_segments
// On définit la largeur de l'image ;
// la hauteur va s'adapter pour garder les proportions.
size(6cm,0);

// définition de 4 "points" (couples de coordonnées)
// NB : ces couples pourraient aussi caractériser des vecteurs
pair pA=(0,0),pB=(2,1),pC=(2,2),pD=(4,0);
// on trace deux segments avec le même stylo orange
draw(pA--pB^^pC--pD,orange+3bp);
// on place de gros points bleus :-)
dot(pA--pB^^pC--pD,blue+8bp);
// et on étiquette l'un des points
label("$\Omega$",pA,2S);

// Ajout d'un cadre, distant des bords de l'image de 5mm
shipout(bbox(5mm));
Asymptote - Figure 0004: fig_ab01_150208_stylos.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_ab01_150208_stylos
// définition de l'unité de longueur
unitsize(1cm);

draw ((0,5)--(7,5),solid+blue+1bp);
draw ((0,4)--(7,4),dotted+.5blue+1bp);
draw ((0,3)--(7,3),dashed+red+1bp);
draw ((0,2)--(7,2),longdashed+.5red+1bp);
draw ((0,1)--(7,1),dashdotted+green+1bp);
draw ((0,0)--(7,0),longdashdotted+.5green+1bp);

// Ajout d'un cadre, distant des bords de l'image de 3mm
shipout(bbox(3mm));
Asymptote - Figure 0005: fig_ab02_010808_stylos.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_ab02_010808_stylos
/* Styles prédéfinis
pen solid=linetype("");
pen dotted=linetype("0 4");
pen dashed=linetype("8 8");
pen longdashed=linetype("24 8");
pen dashdotted=linetype("8 8 0 8");
pen longdashdotted=linetype("24 8 0 8");
pen Dotted=dotted+1.0;
pen Dotted(pen p=currentpen) {return dotted+2*linewidth(p);}
*/

unitsize(1cm);

// définir ses propres styles de traits

draw ((0,5)--(7,5),linetype(""));
draw ((0,4)--(7,4),linetype("0 4"));
draw ((0,3)--(7,3),linetype("8 8"));
draw ((0,2)--(7,2),linetype("24 8"));
draw ((0,1)--(7,1),linetype("8 8 0 8"));
draw ((0,0)--(7,0),Dotted);

pen dotteddash=linetype("0 4 4 4");
draw ((0,-1)--(7,-1),linetype("0 4 4 4"));

// Ajout d'un cadre, distant des bords de l'image de 3mm
shipout(bbox(3mm));
Asymptote - Figure 0006: fig_ac01_040409_stylos.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_ac01_040409_stylos
unitsize(1cm);

transform t=shift(0,-1);

path p=(0,0)--(1,1)--(2,0)--(3,1)--(4,0);

draw(p,10bp+squarecap); // pen squarecap=linecap(0);
draw(t*p,10bp+roundcap); // pen roundcap=linecap(1);
draw(t^2*p,10bp+extendcap); // pen extendcap=linecap(2);

draw(t^4*p,10bp+miterjoin); // pen miterjoin=linejoin(0);
draw(t^5*p,10bp+roundjoin); // pen roundjoin=linejoin(1);
draw(t^6*p,10bp+beveljoin); // pen beveljoin=linejoin(2);

shipout(bbox(5mm));
Asymptote - Figure 0007: fig_da01_220208_droite.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_da01_220208_droite
// On définit la largeur de l'image ;
// la hauteur va s'adapter pour garder les proportions.
size(7cm,0);

// définition de 2 couples de coordonnées
pair pA=(1,1),pB=(4,0);
// Construction des points correspondants
dot("$A$",pA,N);
dot("$B$",pB,N);

// On trace la droite (AB)
draw(interp(pA,pB,-.5)--interp(pA,pB,1.25));
// interp(pA,pB,-.5) désigne le point M de (AB)\[AB)
// vec{AM}=-0,5 vec{AB}
// interp(pA,pB,1.25) désigne le point N de (AB)\[BA)
// vec{AN}=1,25 vec{AB}
Asymptote - Figure 0008: fig_da02_220208_droite.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_da02_220208_droite
// la même figure que précédemment en exploitant
// l'extension geometry de Philippe Ivaldi

// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);
// Notez le paramètre suivant, par défaut est à 0, qui permet de définir la
// distance des représentations de droites par rapport aux bords de l'image.
linemargin =-1cm;
// Avec une valeur négative, cela aggrandit la taille de l'image.
// Plus pratique : addmargins, à voir dans des exemples qui suivent.

// définition de 2 points
point pA=(1,1),pB=(4,0);
// Construction des points correspondants
dot("$A$",pA,SW);
dot("$B$",pB,NE);

// On trace la droite (AB)
draw(line(pA,pB));


Asymptote - Figure 0009: fig_da03_080308_droite.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_da03_080308_droite
// Encore la même figure...

// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);
point pA=(1,1),pB=(4,0);
dot("$A$",pA,SW);
dot("$B$",pB,NE);
draw(line(pA,pB));
/* Plus pratique qu'un linemargin négatif utilisé précédemment
   ou que la solution d'un cadre invisible, on pensera à utiliser :
   addMargins(picture pic=currentpicture,
                  real lmargin=0, real bmargin=0,
                  real rmargin=lmargin, real tmargin=bmargin,
                  bool rigid=true, bool allObject=true)
*/
addMargins(1cm,1cm);
// et on peut en plus utiliser linemargin, mais positif cette fois
// pour que les droites n'aillent pas jusqu'aux bords de l'image.
linemargin=2mm;
Asymptote - Figure 0010: fig_db01_080308_droites.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_db01_080308_droites
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);

// définition de 4 points
point pA=(1,1),pB=(4,2),pC=(5,4),pD=(2,3);
// ... et construction du quadrilatère
draw(pA--pB--pC--pD--cycle,red);
// On trace la droite passant par pB et pD, en bleu.
draw(line(pB,pD),blue);
// ... et la droite passant par pA et pC, en vert
draw(line(pA,pC),green);
// La boundingbox (fenêtre d'affichage) est définie
// par les coordonnées extrêmes des points...
Asymptote - Figure 0011: fig_db02_080308_droites.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_db02_080308_droites
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);

// même figure que précédemment...
point pA=(1,1),pB=(4,2),pC=(5,4),pD=(2,3);
draw(pA--pB--pC--pD--cycle,red);
draw(line(pB,pD),blue);
draw(line(pA,pC),green);
// mais on définit un cadre invisible
draw(box((0,0),(6,5)), invisible);
Asymptote - Figure 0012: fig_db03_080308_droites.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_db03_080308_droites
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);
// même figure que précédemment...
point pA=(1,1),pB=(4,2),pC=(5,4),pD=(2,3);
draw(pA--pB--pC--pD--cycle,red);
draw(line(pB,pD),blue);

// cette fois, avec l'indication false suivant pA
// on obtient une demi-droite.
draw(line(pA,false,pC),green);
// un point noir pour indiquer pA
dot(pA);
// On définit un cadre invisible
draw(box((0,0),(6,5)), invisible);
Asymptote - Figure 0013: fig_db04_090308_droites.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_db04_090308_droites
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);
// même figure que précédemment...
point pA=(1,1),pB=(4,2),pC=(5,4),pD=(2,3);
draw(pA--pB--pC--pD--cycle,red);
draw(line(pB,pD),blue);
draw(line(pA,false,pC),green);
dot(pA);
// ... mais plus pratique qu'un linemargin négatif utilisé précédemment
// ou que la solution d'un cadre invisible, on pensera à utiliser :
// addMargins(picture pic=currentpicture,
//                      real lmargin=0, real bmargin=0,
//                      real rmargin=lmargin, real tmargin=bmargin,
//                      bool rigid=true, bool allObject=true)
addMargins(1cm,1cm);
// et on pourra en plus utiliser linemargin, mais positif cette fois
// pour que les droites n'aillent pas jusqu'aux bords de l'image.
linemargin=2mm;
Asymptote - Figure 0014: fig_ea01_220208_droite_equation.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_ea01_220208_droite_equation
/* Droite définie par équation cartésienne ax+by+c=0  dans le repère R
   Syntaxe : line line(coordsys R=currentcoordsys, real a, real b, real c)
   ou
   Droite définie par équation réduite y=mx+p dans le repère R
   Syntaxe : line line(coordsys R=currentcoordsys, real slope, real origin)
*/

// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);

// Affichage du repère courant
show(currentcoordsys);
// Tracé de la droite d'équation x + 2y - 3 = 0
line d1=line(1,3,-3);
draw(d1,blue);
// Tracé de la droite d'équation y = 2x - 3
line d2=line(2,-3);
draw(d2,.8green);
// Point d'intersection des deux droites
dot("I",intersectionpoint(d1,d2),N,.7red);

draw(box((-2,-2),(5,4)),invisible);
Asymptote - Figure 0015: fig_fa01_090308_droite_parallele.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_fa01_090308_droite_parallele
/* Droite parallèle à une droite donnée
   passant par un point donné
*/

// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);

// Affichage du repère courant
show(currentcoordsys);
// Tracé de la droite d'équation y = 2x - 3
line d1=line(2,-3);
draw(d1,.8blue);
// Point A de coordonnées (4,1)
point pA=(4,1);
dot("A",pA);
// Parallèle à d1 passant par A
line d2=parallel(pA,d1);
draw(d2,.8green);

draw(box((-2,-2),(5,4)),invisible);
Asymptote - Figure 0016: fig_ga01_090308_droite_perpendiculaire.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_ga01_090308_droite_perpendiculaire
/* Droite perpendiculaire à une droite donnée
   passant par un point donné
*/
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);

// Affichage du repère courant
show(currentcoordsys);
// Tracé de la droite d'équation y = 2x - 3
line d1=line(2,-3);
draw(d1,.8blue);
// Point A de coordonnées (4,1)
point pA=(4,1);
dot("A",pA,NE);
// Perpendiculaire à d1 passant par A
line d2=perpendicular(pA,d1);
draw(d2,.8green);
// Codage de l'angle droit
perpendicularmark(d1,d2);

draw(box((-2,-2),(5,4)),invisible);
Asymptote - Figure 0017: fig_ga02_090308_mediatrice.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_ga02_090308_mediatrice
/* Médiatrice d'un segment
   en utilisant la fonction bisector de l'extension geometry_dev.
*/
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7cm,0);

// Affichage du repère courant
show(currentcoordsys);
// Définition de deux points A et B
point pA=(4,1), pB=(1,3);
// ... puis de la médiatrice de [AB]
line medAB=bisector(pA,pB);

// On trace le tout :
dot("A",pA,NE);
dot("B",pB,SW);
draw(pA--pB,1bp+blue,StickIntervalMarker(2,2, 0.8*blue));
draw(medAB,dashed+.8bp+red);

// Codage de l'angle droit
perpendicularmark(line(pA,pB),medAB);

draw(box((-2,-2),(5,4)),invisible);
Asymptote - Figure 0018: fig_lb01_180208_line_A_B.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_lb01_180208_line_A_B
/* Un exemple commenté issu de la documentation
   de l'extension geometry de Ph. Ivaldi
   illustrant des emplois possibles
   de la fonction **line**
   (à ne pas confondre avec le type **line**).
*/
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7.5cm,0);
// Pour que les lignes n'aillent pas jusqu'aux bords de l'image : 
linemargin=2mm;
// Définition et placement de 4 points :
point A=(0,0), B=(2, 0), C=(3,1), D=(1,1);
dot("A", A, NW); dot("B", B, SE); 
dot("C", C); dot("D", D, W);
// Définition d'une droite
line AB=line(A, B);
// Définition d'une demi-droite
line CB=line(C, false, B);
// Définition d'un segment
line CD=line(C, false, D, false);
// Définition d'une demi-droite
line AD=line(A, false, D);
// Tracé des lignes précédentes
draw("(AB)", AB); draw("[CB)", CB);
draw(Label("[CD]",Relative(0.5),align=N), CD);
draw("[AD)", AD);
// Un cadre invisible pour définir la zone à afficher.
draw(box((-1,-2),(4,3)),invisible);
Asymptote - Figure 0019: fig_lb02_090308_line_A_B.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_lb02_090308_line_A_B
/* Même figure que précédemment avec 2 différences :
   - des labels au format mathématique de LaTeX
   - utilisation de addMargins pour définir la zone d'affichage.
*/
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

size(7.5cm,0);
point A=(0,0), B=(2, 0), C=(3,1), D=(1,1);
dot("$A$", A, NW); dot("$B$", B, SE); 
dot("$C$", C); dot("$D$", D, W);
line AB=line(A, B);
line CB=line(C, false, B);
line CD=line(C, false, D, false);
line AD=line(A, false, D);

draw("$(AB)$", AB);
draw("$[CB)$", CB);
draw(Label("$[CD]$",Relative(0.5),align=N), CD);
draw("$[AD)$", AD);

// Marge de 1cm à gauche du point le plus à gauche
// Marge de 2cm en dessous du point le plus bas
// Marge de 1.5cm à droite du point le plus à droite
// Marge de 2.5cm au dessus du point le plus haut
addMargins(1cm,2cm,1.5cm,2.5cm);
// et je remets linemargin pour que les droites n'aillent pas
// jusqu'aux bords de l'image
linemargin = 2mm;
Asymptote - Figure 0020: fig_lb03_281209_line_A_B_hachures.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_lb03_281209_line_A_B_hachures
import geometry;
import patterns;
size(7.5cm,0);

// On définit :
point pA=(2,2), pB=(3,1.5), pC=(1.5,-1);

line droite1=line(pA,pB);
segment bord1=segment(relpoint(droite1,-.5),relpoint(droite1,1.5));
path zonehachuree1=bord1.A--bord1.B--(bord1.B.x,bord1.A.y)--cycle;

line droite2=line(pB,pC);
segment bord2=segment(relpoint(droite2,-.2),relpoint(droite2,1.2));
path zonehachuree2=bord2.A--bord2.B--(bord2.A.x,bord2.B.y)--cycle;

// On trace :
show(currentcoordsys);
dot("A",pA,S);
dot("B",pB,W);
dot("C",pC,NW);
draw(droite1^^droite2,red);
add("hachure1",hatch(H=3mm,dir=NE,red));
fill(zonehachuree1,pattern("hachure1"));
add("hachure2",hatch(H=2mm,dir=NW,blue));
fill(zonehachuree2,pattern("hachure2"));

addMargins(.1cm,.1cm);

Asymptote - Figure 0021: fig_mb01_180208_line_m_p.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_mb01_180208_line_m_p
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

import graph_pi;

unitsize(1.5cm,1.5cm);

scale(false);
real xmin=-2, xmax=3, ymin=-3, ymax=4;
grid(xmin, xmax, ymin, ymax,
     xStep=1, xstep=.5,
     yStep=1, ystep=.5,
     pTick=.7bp+.7white,
     ptick=.7bp+dotted+.7white,
     above=false
     );
draw((xmin,0)--(xmax,0)^^(0,ymin)--(0,ymax),
     1.3bp+0.7*grey);
labeloij(p=1.7bp+.5*red,
         arrow=Arrow(SimpleHead,8bp),
         scale(2)*Mark(5)
         );
line d1=line(2,-2);
draw(Label("$(d_1)$",Relative(.95),align=NW), d1,
     1bp+solid+.5blue);
line d2=line(-1,2);
draw(Label("$(d_2)$",Relative(.95),align=SW), d2,
     1bp+dashed+.8red);
line d3=line(1/5,-1);
draw(Label("$(d_3)$",Relative(.05),align=N), d3,
     1bp+dotted+.8green);
Asymptote - Figure 0022: fig_na01_060708_droite_graduee.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_na01_060708_droite_graduee
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

unitsize(1cm);

// ~~~~~~ DEFINITIONS ~~~~~~~~~~~~~~~~~~~~~~

pair pO=(0,0), pI=(1,0), pJ=rotate(45,pO)*pI;
line d1 = line(pO,pI);
line d2 = line(pO,pJ);

// Définition d'un repère non orthogonal
currentcoordsys = cartesiansystem(pO,i=pI,j=pJ);

int n1min=-2, n1max=5, n2min=-3, n2max=6;

point pA=(2,0), pB=(4,0), pC=(0,3), pD=(0,5);

// ~~~~~~ CONSTRUCTIONS ~~~~~~~~~~~~~~~~~~~~~~

label("$O$",pO,S);
draw(d1^^d2);

for (int i=n1min; i <= n1max; ++i)
  {
   dot(locate((i,0)));write(i);
  }
for (int i=n2min; i <= n2max; ++i)
  {
   dot(locate((0,i)));
  }

dot("$A$",pA,S);
dot("$B$",pB,S);
dot("$C$",pC,NW);
dot("$D$",pD,NW);

shipout(bbox(xmargin = 1mm,invisible));
Asymptote - Figure 0023: fig_na02_060708_droite_graduee.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_na02_060708_droite_graduee
// La même figure que la précédente
// mais en utilisant l'instruction **sequence**
// Rappel d'un extrait de la documentation officielle :
/*
   int[] sequence(int n)
   if n >= 1 returns the array {0,1,...,n-1} (otherwise returns a null array);
*/
/*   
   int[] sequence(int n, int m)
   if m >= n returns an array {n,n+1,...,m} (otherwise returns a null array);
*/
/*
   T[] sequence(T f(int), int n)
   if n >= 1 returns the sequence {f_i :i=0,1,...n-1} given a function T f(int)
   and integer int n (otherwise returns a null array);
*/
// import geometry_dev; // extension devenue l'extension geometry officielle
import geometry;        // le 12/05/09, dans la version 1.71 d'asymptote. :-))

unitsize(1cm);

// ~~~~~~ DEFINITIONS ~~~~~~~~~~~~~~~~~~~~~~

pair pO=(0,0), pI=(1,0), pJ=rotate(45,pO)*pI;
line d1 = line(pO,pI);
line d2 = line(pO,pJ);
currentcoordsys = cartesiansystem(pO,i=pI,j=pJ);
int n1min=-2, n1max=5, n2min=-3, n2max=6;
point pA=(2,0), pB=(4,0), pC=(0,3), pD=(0,5);

// ~~~~~~ CONSTRUCTIONS ~~~~~~~~~~~~~~~~~~~~~~

label("$O$",pO,S);
draw(d1^^d2);

point f(int i){return locate((i+n1min,0));};
point[] pM1=sequence(f,n2max-n2min+1);
dot(pM1);

point g(int i){return locate((0,i+n2min));};
point[] pM2=sequence(g,n2max-n2min+1);
dot(pM2);

dot("$A$",pA,S); dot("$B$",pB,S);
dot("$C$",pC,NW); dot("$D$",pD,NW);

shipout(bbox(xmargin = 1mm,invisible));
Asymptote - Figure 0024: fig_pa01_010808_path.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pa01_010808_path
size(7.5cm,0);

path ligne=(-3,1)..(-1,2)..(4,0);

draw(ligne,blue);
dot(ligne,red);

shipout(bbox(3mm,white));
Asymptote - Figure 0025: fig_pa02_010808_path.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pa02_010808_path
size(7.5cm,0);

path ligne=(-3,1){right}..(-1,2)..(4,0);

draw(ligne,blue);
dot(ligne,red);

shipout(bbox(3mm,white));
Asymptote - Figure 0026: fig_pa03_010808_path.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pa03_010808_path
size(7.5cm,0);

path ligne=(-3,1)..{dir(-45)}(-1,2)..{right}(4,0);

draw(ligne,blue);
dot(ligne,red);

shipout(bbox(3mm,white));
Asymptote - Figure 0027: fig_pa04_010808_path.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pa04_010808_path
size(7.5cm,0);

path ligne=(-3,1)..{dir(45)}(-1,2){dir(-45)}..(4,0);

draw(ligne,blue);
dot(ligne,red);

shipout(bbox(3mm,white));
Asymptote - Figure 0028: fig_pb01_291009_path_Bezier.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pb01_291009_path_Bezier
unitsize(1cm);

pair z0=(0,0), z1=(7,0),
     c0=(1,2), c1=(5,3);

// Courbe (spline) de Bézier ...
// ... cubique (définie par 4 points).
path CourbeBezier = z0 .. controls c0 and c1 .. z1;
// Pour info : la forme paramétrique de la courbe est 
// z(t) = z0 (1-t)^3 + 3 c0 t(1-t)^2 + 3 c1 t^2(1-t) + z1 t^3
// avec t compris entre 0 et 1.

draw(CourbeBezier,2bp+blue);

path lignebrisee = z0 -- c0 -- c1 -- z1;
draw(lignebrisee,dashed); // en pointillés...
dot(lignebrisee,5bp+red); // ... et les points en rouge.

// Pour finir, on ajoute le nom des points.
label("$z_0$",z0,S);
label("$z_1$",z1,S);
label("$c_0$",c0,N);
label("$c_1$",c1,N);

shipout(bbox(3mm,white));
Asymptote - Figure 0029: fig_pb02_291009_path_Bezier.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pb02_291009_path_Bezier
// La figure précédente avec cette fois c1 confondu avec c0.

unitsize(1cm);

pair z0=(0,0), z1=(7,0), c=(1,2);

// Courbe (spline) de Bézier (cubique), 
// dans le cas où les deux points de contrôle sont confondus.
path CourbeBezier = z0 .. controls c .. z1;
// Pour info : la forme paramétrique de la courbe est 
// z(t) = z0 (1-t)^3 + 3 c t(1-t) + z1 t^3
// avec t compris entre 0 et 1.

draw(CourbeBezier,2bp+blue);

path lignebrisee = z0 -- c -- z1;
draw(lignebrisee,dashed); // en pointillés...
dot(lignebrisee,5bp+red); // ... et les points en rouge.

// Pour finir, on ajoute le nom des points.
label("$z_0$",z0,S);
label("$z_1$",z1,S);
label("$c$",c,N);

shipout(bbox(3mm,white));
Asymptote - Figure 0030: fig_pb03_291009_path_Bezier.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pb03_291009_path_Bezier
unitsize(1cm);

pair z0=(0,0), z1=(7,0),
     c0=(1,3), c1=(5,5);
         
// On déduit du quadruplet de points précédents (z0, c0, c1, z1)
// (par construction de 6 milieux) le point z2 sur la courbe de bézier.
// En procédant de même pour les quadruplets (z0, m0, m3, z2)
// et (z2, m4, m2, z1), on obtiendrait deux nouveaux points de la courbe,
// et c'est en continuant ainsi, par récursivité, que la courbe est construite.

pair m0=(z0+c0)/2,
         m1=(c0+c1)/2,
         m2=(c1+z1)/2,
         m3=(m0+m1)/2,
         m4=(m1+m2)/2,
         z2=(m3+m4)/2;   

// Courbe (spline) de Bézier cubique (définie par 4 points).
path CourbeBezier = z0 .. controls c0 and c1 .. z1;
draw(CourbeBezier,2bp+blue);

// Les traits et points de construction
path lignebrisee = z0 -- c0 -- c1 -- z1;
draw(lignebrisee^^m0--m1--m2^^m3--m4,dashed);
dot(lignebrisee^^m0--m1--m2^^m3--m4^^z2,5bp+red);

// Pour finir, on ajoute le nom des points.
label("$z_0$",z0,S); label("$z_1$",z1,S);
label("$c_0$",c0,N); label("$c_1$",c1,N);
label("$m_0$",m0,NW); label("$m_1$",m1,N);
label("$m_2$",m2,NE); label("$m_3$",m3,N);
label("$m_4$",m4,N); label("$z_2$",z2,N);

shipout(bbox(3mm,white));

Asymptote - Figure 0031: fig_pb04_291009_path_Bezier.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pb04_291009_path_Bezier
// Le même exemple que celui ci-dessus,
// avec des instructions de l'extension geometry.

import geometry;
unitsize(1cm);

point z0=(0,0), c0=(1,3), c1=(5,5), z1=(7,0);
segment z0c0=segment(z0,c0), c0c1=segment(c0,c1), c1z1=segment(c1,z1);
point m0=midpoint(z0c0), m1=midpoint(c0c1), m2=midpoint(c1z1);
segment m0m1=segment(m0,m1), m1m2=segment(m1,m2);
point m3=midpoint(m0m1), m4=midpoint(m1m2);
segment m3m4=segment(m3,m4);
point z2=midpoint(m3m4);

// Courbe (spline) de Bézier cubique (définie par 4 points).
path CourbeBezier = z0 .. controls c0 and c1 .. z1;
draw(CourbeBezier,2bp+blue);

// Les traits de construction.
draw(z0c0^^c0c1^^c1z1^^m0m1^^m1m2^^m3m4,dashed);

// Pour finir, on place les points en les étiquetant.
dot("$z_0$",z0,S,red); dot("$z_1$",z1,S,red);
dot("$c_0$",c0,N,green); dot("$c_1$",c1,N,green);
dot("$m_0$",m0,NW); dot("$m_1$",m1,N);
dot("$m_2$",m2,NE); dot("$m_3$",m3,N);
dot("$m_4$",m4,N); dot("$z_2$",z2,N,purple);

shipout(bbox(3mm,white));

Asymptote - Figure 0032: fig_ta01_010808_arctime.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_ta01_010808_arctime
/* Trois fonctions à connaitre : arctime, dirtime, reltime.
   Illustrons dans cet exemple l'utilisation de arctime.

   real arctime(path p, real L);
   returns the path "time", a real number between 0 and the length
   of the path in the sense of point(path p, real t), at which the
   cumulative arclength (measured from the beginning of the path)
   equals L.
*/
size(7.5cm,0);

path ligne=(-3,1){dir(45)}..(-1,2)..{dir(10)}(4,0);
real at1=arctime(ligne,0),
     at2=arctime(ligne,1.156),
     at3=arctime(ligne,2.292208),
     at4=arctime(ligne,5.068),
     at5=arctime(ligne,7.810541);

draw(ligne,blue);

label(format("nombre de noeuds du chemin = %i",size(ligne)),(0,7));
label(format("nombre de sections du chemin = %i",length(ligne)),(0,6));
label(format("longueur du chemin = %f",arclength(ligne)),(0,5));
label(format("longueur de la section 1 = %f",arclength(subpath(ligne,0,1))),(0,4));
label(format("longueur de la section 2 = %f",arclength(subpath(ligne,1,2))),(0,3));

label(format("arctime(ligne,0) = %f",at1),(0,-1));
label(format("arctime(ligne,1.156) = %f",at2),(0,-2));
label(format("arctime(ligne,2.292208) = %f",at3),(0,-3));
label(format("arctime(ligne,5.068) = %f",at4),(0,-4));
label(format("arctime(ligne,7.810541) = %f",at5),(0,-5));

pen p1,p2=blue;

for (real k=0; k<=length(ligne); k+=0.5) {
   real absc=arclength(subpath(ligne,0,k));
   if (k == floor(k)) {
     p1=4bp+red;
   } else {  
     p1=2bp+green;
   }     
   dot(Label(format("%.3f",absc)),point(ligne,k),2N,p1);
   label(Label(format("%.3f",arctime(ligne,absc))),point(ligne,k),2S,p2);
}

shipout(bbox(3mm,white));
Asymptote - Figure 0033: fig_tb01_010808_dirtime.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_tb01_010808_dirtime
/* Trois fonctions à connaitre : arctime, dirtime, reltime
   Illustrons dans cet exemple l'utilisation de dirtime.
   
   real dirtime(path p, pair z);
   returns the first "time", a real number between 0 and the length of
   the path in the sense of point(path, real), at which the tangent
   to the path has the direction of pair z, or -1 if this never happens.
*/
size(7.5cm,0);

path ligne=(-3,1){dir(45)}..(-1,2)..{dir(10)}(4,0);
real dt1=dirtime(ligne,(2,-2)),
     dt2=dirtime(ligne,(2,-1)),
     dt3=dirtime(ligne,(2,0)),
     dt4=dirtime(ligne,(2,1)),
     dt5=dirtime(ligne,(2,2));

draw(ligne,blue);

label(format("nombre de noeuds du chemin = %i",size(ligne)),(0,6));
label(format("nombre de sections du chemin = %i",length(ligne)),(0,5));
label(format("longueur du chemin = %f",arclength(ligne)),(0,4));

label(format("dirtime(ligne,(2,-2)) = %f",dt1),(0,-1));
label(format("dirtime(ligne,(2,-1)) = %f",dt2),(0,-2));
label(format("dirtime(ligne,(2,0)) = %f",dt3),(0,-3));
label(format("dirtime(ligne,(2,1)) = %f",dt4),(0,-4));
label(format("dirtime(ligne,(2,2)) = %f",dt5),(0,-5));

draw(Label("(2,-1)",EndPoint),point(ligne,dt2)--point(ligne,dt2)+(2,-1),red,Arrow);
draw(Label("(2,0)",EndPoint),point(ligne,dt3)--point(ligne,dt3)+(2,0),blue,Arrow);
draw(Label("(2,1)",EndPoint),point(ligne,dt4)--point(ligne,dt4)+(2,1),green,Arrow);
draw(Label("(2,2)",EndPoint),point(ligne,dt5)--point(ligne,dt5)+(2,2),purple,Arrow);
dot(Label(format("%.3f",dt2)),point(ligne,dt2),2S);
dot(Label(format("%.3f",dt3)),point(ligne,dt3),2S);
dot(Label(format("%.3f",dt4)),point(ligne,dt4),2S);
dot(Label(format("%.3f",dt5)),point(ligne,dt5),2S);

shipout(bbox(3mm,white));
Asymptote - Figure 0034: fig_tc01_010808_reltime.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_tc01_010808_reltime
/* Trois fonctions à connaitre : arctime, dirtime, reltime
   Illustrons dans cet exemple l'utilisation de reltime.

   real reltime(path p, real l);
   returns the time on path p at the relative fraction l of its arclength.
*/
size(7.5cm,0);

path ligne=(-3,1){dir(45)}..(-1,2)..{dir(10)}(4,0);
real rt1=reltime(ligne,0),
     rt2=reltime(ligne,.25),
     rt3=reltime(ligne,.50),
     rt4=reltime(ligne,.75),
     rt5=reltime(ligne,1);

draw(ligne,blue);

label(format("nombre de noeuds du chemin = %i",size(ligne)),(0,7));
label(format("nombre de sections du chemin = %i",length(ligne)),(0,6));
label(format("longueur du chemin = %f",arclength(ligne)),(0,5));
label(format("longueur de la section 1 = %f",arclength(subpath(ligne,0,1))),(0,4));
label(format("longueur de la section 2 = %f",arclength(subpath(ligne,1,2))),(0,3));

label(format("reltime(ligne,0) = %f",rt1),(0,-1));
label(format("reltime(ligne,0.25) = %f",rt2),(0,-2));
label(format("reltime(ligne,0.5) = %f",rt3),(0,-3));
label(format("reltime(ligne,0.75) = %f",rt4),(0,-4));
label(format("reltime(ligne,1) = %f",rt5),(0,-5));

pen p1=.9green,p2=blue;

for (real k=0; k<=1; k+=0.25) {
   dot(Label(format("%.3f",k)),relpoint(ligne,k),2N,p1);
   label(Label(format("%.3f",reltime(ligne,k))),relpoint(ligne,k),2S,p2);
   label(Label(format("%.3f",reltime(ligne,k))),relpoint(ligne,k),2S,p2);
}

dot(ligne,4bp+red);

shipout(bbox(3mm,white));

Dernière modification le Sat May 22 21:59:05 CEST 2010 par G.Marris       Valide XHTML