warningcheck:=0;

input rboxes;
input sarith;
input graph;

verbatimtex
\documentclass[a4paper,12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\begin{document}
etex

vardef TEX primary s =
 write "verbatimtex"                    to "mptextmp.mp";
 write "\documentclass[12pt]{article}"  to "mptextmp.mp";
 write "\usepackage[T1]{fontenc}"       to "mptextmp.mp";
 write "\usepackage{amsmath,amssymb}"   to "mptextmp.mp";
 write "\begin{document}"               to "mptextmp.mp";
 write "etex"                           to "mptextmp.mp";
 write "btex "&s&" etex"                to "mptextmp.mp";
 write EOF                              to "mptextmp.mp";
 scantokens "input mptextmp"
enddef;

vardef longueur(expr p) =
 save l,i;
 numeric l;
 l:=0;
 for i=0 step .01 until length(p):
   l:=l+abs( (point i of p) - (point(i+.01) of p) );
 endfor;
 l % Pas de point-virgule
enddef;

vardef milieu(expr p) =
 save l,i,tot,A,B;
 numeric l,tot,i;
 pair A,B;
 tot := longueur(p);
 l:=0;
 B := point 0 of p;
 for i:=0 step .01 until length(p):
   A := B;
   B := point i of p;
   l := l+abs(B-A);
   exitif l > 1/2 tot;
 endfor;
 show l; show tot;
 1/2[A,B]
enddef;

vardef milieu_time(expr p) =
 save l,i,tot,A,B,t;
 numeric l,tot,i,t;
 pair A,B;
 tot := longueur(p);
 l:=0;
 B := point 0 of p;
 for i:=0 step .01 until length(p):
   t:=i;
   A := B;
   B := point i of p;
   l := l+abs(B-A);
   exitif l > 1/2 tot;
 endfor;
 t
enddef;

beginfig(1)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   draw A--B--C;

endfig;
beginfig(2)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   draw A--B--C--cycle;

endfig;
beginfig(3)
 pair A[];
 A[0]:=(-1cm, -1cm);
 A[1]:=( 1cm, -1cm);
 A[2]:=( 1cm,  1cm);
 A[3]:=(-1cm,  1cm);
 draw A[0]--A[1]--A[2]--A[3]--cycle;
 draw A[0]--A[2];
 draw A[1]--A[3];
endfig;
beginfig(4)
   pair A;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   draw A withpen pencircle scaled 4bp;

endfig;
beginfig(5)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 draw A--B--C--cycle;
 draw A withpen pencircle scaled 4bp;
 draw B withpen pencircle scaled 4bp;
 draw C withpen pencircle scaled 4bp;
endfig;
beginfig(6)
 pair A, B, C, D;
 A:=(0,0); B:=(1cm,0);
 C:=(1cm,1cm); D:=(0,1cm);
 draw A--B--C--D--cycle;
 draw A--C;
 draw B--D;
 draw A withpen pencircle scaled 4bp;
 draw B withpen pencircle scaled 4bp;
 draw C withpen pencircle scaled 4bp;
 draw D withpen pencircle scaled 4bp;
endfig;
beginfig(7)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 draw A--B--C--cycle;
 draw 1/2[A,B] -- C;
 draw 1/2[B,C] -- A;
 draw 1/2[C,A] -- B;
endfig;
beginfig(8)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 draw A--B--C--cycle;
 draw 1/2[A,B] -- C;
 draw 1/2[B,C] -- A;
 draw 1/2[C,A] -- B;
 draw 1/3 A + 1/3 B + 1/3 C
      withpen pencircle scaled 4bp;
endfig;
beginfig(9)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   draw A--B--C--cycle;
   draw A--B withpen pencircle scaled 2bp;

endfig;
beginfig(10)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   draw A--B--C--cycle;
   draw A--B withcolor (green + red);

endfig;
beginfig(11)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   draw A--B;
   draw B--C dashed evenly;
   draw C--A dashed withdots;

endfig;
beginfig(12)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   draw A--B withpen pencircle scaled 2bp withcolor .8white;
   draw B--C withpen pencircle scaled 2bp withcolor .6white;
   draw C--A withpen pencircle scaled 2bp withcolor .4white;

endfig;
beginfig(13)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 draw A--B--C--cycle;
 draw 1/2[A,B] -- C dashed evenly;
 draw 1/2[B,C] -- A dashed evenly;
 draw 1/2[C,A] -- B dashed evenly;
 draw 1/3 A + 1/3 B + 1/3 C
      withpen pencircle scaled 4bp
      withcolor red;
endfig;
beginfig(14)
   draw (0,0)--(3cm,0) dashed evenly scaled 2;
   draw (0,-5mm)--(3cm,-5mm) dashed evenly;

endfig;
beginfig(15)
   draw (0,0)--(3cm,0)
     dashed dashpattern(on 2bp off 3bp);

endfig;
beginfig(16)
 draw (0,0)--(3cm,0) dashed dashpattern(on 1bp off 2bp on 10bp off 2bp);
endfig;
beginfig(17)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   drawarrow C--B--A;
   drawarrow A--C withpen pencircle scaled 2bp;

endfig;
beginfig(18)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   draw C--B--A--cycle;
   drawdblarrow A--C withpen pencircle scaled 2bp;

endfig;
beginfig(19)
 draw (-1.5cm,0)--(1.5cm,0);
 draw (0,-1.5cm)--(0,1.5cm);
 drawarrow (0,0)--(1cm,0)
           withpen pencircle scaled 2bp;
 drawarrow (0,0)--(0,1cm)
           withpen pencircle scaled 2bp;
endfig;
beginfig(20)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   fill A--B--C--cycle withcolor .8 white;

endfig;
beginfig(21)
   pair A, B, C;
   A:=(0,0); B:=(1cm,0); C:=(0,1cm);
   fill A--B--C--cycle withcolor .8 white;
   draw A--B--C--cycle;

endfig;
beginfig(22)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 fill A--B--C--cycle withcolor .8 white;
 draw A--B--C--cycle withpen pencircle scaled 2bp;
endfig;
beginfig(23)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 draw A--B--C--cycle withpen pencircle scaled 2bp;
 fill A--B--C--cycle withcolor .8 white;
endfig;
beginfig(24)
 pair A, B, C, D;
 A:=(0,0); B:=(1cm,0);
 C:=(1cm,1cm); D:=(0,1cm);
 fill A--C--B--D--cycle withcolor .8white;
endfig;
beginfig(25)
 pair A, B, C, D;
 A:=(0,0); B:=(1cm,0);
 C:=(1cm,1cm); D:=(0,1cm);
 path p;
 p := A--C--B--D--cycle;
 fill p withcolor .8white;
 draw p;
endfig;
beginfig(26)
 pair A, B, C, D;
 A:=(-1.5cm,-1.5cm); B:=(1.5cm,-1.5cm);
 C:=(1.5cm,1.5cm);   D:=(-1.5cm,1.5cm);
 fill A--C--B--D--cycle withcolor .8white;
 draw (-1.5cm,0)--(1.5cm,0);
 draw (0,-1.5cm)--(0,1.5cm);
 drawarrow (0,0)--(1cm,0)
           withpen pencircle scaled 2bp;
 drawarrow (0,0)--(0,1cm)
           withpen pencircle scaled 2bp;
endfig;
beginfig(27)
   pair A;
   A := (0,0);
   draw A withpen pencircle scaled 4bp;
   label.top(btex Au dessus  etex, A);
   label.bot(btex En dessous etex, A);
   label.rt (btex � droite   etex, A);
   label.lft(btex � gauche   etex, A);

endfig;
beginfig(28)
   pair A;
   A := (0,0);
   draw A withpen pencircle scaled 4bp;
   label.ulft(btex En haut � gauche etex, A);
   label.urt (btex En haut � droite etex, A);
   label.llft(btex En bas � gauche  etex, A);
   label.lrt (btex En bas � droite  etex, A);

endfig;
beginfig(29)
   pair A;
   A := (0,0);
   dotlabel.urt(btex $A$ etex, A);

endfig;
beginfig(30)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 draw A--B--C--cycle;
 dotlabel.llft(btex $A$ etex, A);
 dotlabel.lrt(btex $B$ etex, B);
 dotlabel.top(btex $C$ etex, C);
endfig;
beginfig(31)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 draw A--B--C--cycle;
 label.bot(btex $1$ etex, 1/2[A,B]);
 label.lft(btex $1$ etex, 1/2[A,C]);
 label.urt(btex $\sqrt 2$ etex, 1/2[B,C]);
endfig;
beginfig(32)
 u:=1cm;
 pair A,B,C,D,E,F,G;
 A := (-u,u);
 B := (0,u);
 C := (u,u);
 D := (-u,0);
 E := (0,0);
 F := (u,0);
 draw A--D; draw A--E; draw A--F;
 draw B--D; draw B--E; draw B--F;
 draw C--D; draw C--E; draw C--F;
 dotlabel.top(btex $a$ etex, A);
 dotlabel.top(btex $b$ etex, B);
 dotlabel.top(btex $c$ etex, C);
 dotlabel.bot(btex $a'$ etex, D);
 dotlabel.bot(btex $b'$ etex, E);
 dotlabel.bot(btex $c'$ etex, F);
endfig;
beginfig(33)
   draw fullcircle;

endfig;
beginfig(34)
   draw (0,0) withpen pencircle scaled 4bp;
   draw fullcircle scaled 1cm;

endfig;
beginfig(35)
   draw (0,0) withpen pencircle scaled 4bp;
   draw fullcircle scaled 1cm shifted (1cm,1cm);

endfig;
beginfig(36)
 pair A, B, C;
 A:=(0,0); B:=(1cm,0); C:=(0,1cm);
 draw A--B--C--cycle;
 fill fullcircle scaled 4bp shifted A withcolor white;
 fill fullcircle scaled 4bp shifted B withcolor white;
 fill fullcircle scaled 4bp shifted C withcolor white;
 draw fullcircle scaled 4bp shifted A;
 draw fullcircle scaled 4bp shifted B;
 draw fullcircle scaled 4bp shifted C;
endfig;
beginfig(37)
   draw (0,0) .. (0,1cm) .. (1cm,0) .. (1cm,1cm);
   draw (0,0)     withpen pencircle scaled 4bp;
   draw (0,1cm)   withpen pencircle scaled 4bp;
   draw (1cm,0)   withpen pencircle scaled 4bp;
   draw (1cm,1cm) withpen pencircle scaled 4bp;

endfig;
beginfig(38)
   draw (0,0) -- (0,1cm) .. (1cm,0) .. (1cm,1cm);

endfig;
beginfig(39)
   draw (0,0) --- (0,1cm) .. (1cm,0) .. (1cm,1cm);

endfig;
beginfig(40)
   draw (0,0) .. (0,1cm) .. (1cm,0) .. (1cm,1cm)
        .. cycle;

endfig;
beginfig(41)
 pair A, B, C, D;
 A:=(0,0); B:=(1cm,0);
 C:=(1cm,1cm); D:=(0,1cm);
 draw A..B..C..D..cycle;
endfig;
beginfig(42)
 draw (0,0) .. (1cm,1cm) .. cycle;
endfig;
beginfig(43)
   draw (0,0){(0,1)} .. (2cm,0){(1,0)};

endfig;
beginfig(44)
   draw (0,0){dir 90} .. (2cm,0){dir 0};

endfig;
beginfig(45)
   draw (0,0){up} .. (2cm,0){right};

endfig;
beginfig(46)
 draw (0,0){up} .. (2cm,0){up};
endfig;
beginfig(47)
 draw (0,0){up} .. (2cm,0){up} .. cycle;
endfig;
beginfig(48)
 alpha := 30;
 draw (0,0) -- 2cm*dir 0;
 draw (0,0) -- 2cm*dir alpha;
 draw 1cm * dir 0 {dir 90} ..
      1cm * dir alpha {dir(90+alpha)};
endfig;
beginfig(49)
 alpha := 30;
 draw (0,0) -- 2cm*dir 0;
 draw (0,0) -- 2cm*dir alpha;
 draw 1cm * dir 0 {dir 90} ..
      1cm * dir alpha {dir(90+alpha)};
 draw 1.1cm * dir 0 {dir 90} ..
      1.1cm * dir alpha {dir(90+alpha)};
endfig;
beginfig(50)
     def draw_angle(expr A, O, B, n) =
   draw_angle_(A,O,B,5mm);
   if n>1 : draw_angle_(A,O,B,4.5mm); fi;
   if n>2 : draw_angle_(A,O,B,4mm);   fi;
   if n>3 : draw_angle_(A,O,B,5.5mm); fi;
 enddef;
 def draw_angle_(expr A,O,B,d) =
   draw (O + d*unitvector(A-O))
        { d*unitvector(A-O) rotated 90 }
        ..
        { d*unitvector(B-O) rotated 90 }
        (O + d*unitvector(B-O));
 enddef;
 pair A, B, C;
 A := (0,0);
 B := (3cm,0);
 C := (1cm,2cm);
 draw A--B--C--cycle;
 draw_angle(B,A,C,1);
 draw_angle(C,B,A,2);
 draw_angle(A,C,B,3);
endfig;
beginfig(51)
 u:=1cm;
 path p;
 p := (u,0){up}..(-u,0){down}--cycle;
 fill p withcolor .8*white;
 draw p withpen pencircle scaled 1bp;
endfig;
beginfig(52)
 u:=1cm;
 path p;
 p := (u,0){up} ..
      (-u,0){down} --
      (-.2u,0){up} ..
      (.2u,0){down} --
      cycle;
 fill p withcolor .8*white;
 draw p withpen pencircle scaled 1bp;
endfig;
beginfig(53)
 u:=1cm;
 pair A,AA,B,BB,C,D;
 A  := ( .2u,  .05u);
 AA := ( .2u, -.05u);
 B  := (   u,  .05u);
 BB := (   u, -.05u);
 C  := (-.2u,     0);
 D  := (  -u,     0);
 path p;
 p:= B{up}    .. D{down} .. BB{up}  --
     AA{down} .. C{up}   .. A{down} -- cycle;
 fill p withcolor .8*white;
 draw p withpen pencircle scaled 1bp;
endfig;
beginfig(54)
 u:=1cm;
 pair A,B,C,D;
 A:=(0,0);
 B:=u*dir 60;
 C:=u*dir -60;
 D:=(2u,0);
 draw A withpen pencircle scaled 4bp;
 draw B withpen pencircle scaled 4bp;
 draw C withpen pencircle scaled 4bp;
 draw D withpen pencircle scaled 4bp;
 draw A--D--B--D--C;
 draw A{up}..B;
 draw A{down}..C;
 draw A{dir 30}..B;
 draw A{dir -30}..C;
endfig;
beginfig(55)
   draw (0,0) .. (1cm,1cm) .. (2cm,0);

endfig;
beginfig(56)
   draw (0,0) .. tension 2 ..
        (1cm,1cm) .. (2cm,0);

endfig;
beginfig(57)
 draw (0,u)         {right}    ..
      ( u*dir -150 ){dir 120}  ..
      ( u*dir -30  ){dir -120} ..
 cycle;
endfig;
beginfig(58)
 draw (0,u)         {right}    .. tension 2 ..
      ( u*dir -150 ){dir 120}  .. tension 2 ..
      ( u*dir -30  ){dir -120} .. tension 2 ..
 cycle;
endfig;
beginfig(59)
 draw (0,u)         {right}    .. tension 4 ..
      ( u*dir -150 ){dir 120}  .. tension 4 ..
      ( u*dir -30  ){dir -120} .. tension 4 ..
 cycle;
endfig;
beginfig(60)
   u:=.5cm;
   pair A,B,C,D;
   A:=(0,0);   B:=(-u,2u);
   C:=(4u,3u); D:=(3u,0);
   draw A.. controls B and C .. D
        withpen pencircle scaled 2pt;
   draw B--C dashed evenly;
   drawarrow A--B;
   drawarrow D--C;

endfig;
beginfig(61)
 pair A, B, C, D;
 A = (0,0);
 D = (2u,0);
 B = (-u,2u);
 C = (3u,3u);

 draw A withpen pencircle scaled 4bp;
 draw B withpen pencircle scaled 4bp;
 draw C withpen pencircle scaled 4bp;
 draw D withpen pencircle scaled 4bp;
 draw A .. controls B and C .. D;

 pair a[];
 a[1] := A;
 a[2] := B;
 a[3] := C;
 a[4] := D;

 a[12]   := 1/2 [ a[1],   a[2]   ];
 a[23]   := 1/2 [ a[2],   a[3]   ];
 a[34]   := 1/2 [ a[3],   a[4]   ];
 a[123]  := 1/2 [ a[12],  a[23]  ];
 a[234]  := 1/2 [ a[23],  a[34]  ];
 a[1234] := 1/2 [ a[123], a[234] ];

 draw a[1234] withpen pencircle scaled 4bp;
endfig;
beginfig(62)
vardef bezier(expr n,A,B,C,D) =
 save a;
 pair a[];
 a[1] := A;
 a[2] := B;
 a[3] := C;
 a[4] := D;

 a[12]   := 1/2 [ a[1],   a[2]   ];
 a[23]   := 1/2 [ a[2],   a[3]   ];
 a[34]   := 1/2 [ a[3],   a[4]   ];
 a[123]  := 1/2 [ a[12],  a[23]  ];
 a[234]  := 1/2 [ a[23],  a[34]  ];
 a[1234] := 1/2 [ a[123], a[234] ];

 if n>0:
   bezier(n-1, a[1], a[12], a[123], a[1234]);
   bezier(n-1, a[1234], a[234], a[34], a[4]);
 else:
   draw a[1234] withpen pencircle scaled 2bp;
 fi;
enddef;

 pair A, B, C, D;
 A = (0,0);
 D = (2u,0);
 B = (-u,2u);
 C = (3u,3u);

 draw A withpen pencircle scaled 4bp;
 draw B withpen pencircle scaled 4bp;
 draw C withpen pencircle scaled 4bp;
 draw D withpen pencircle scaled 4bp;

 bezier(5,A,B,C,D);
endfig;
beginfig(63)
   draw (0,0){up} .. (1cm, 1mm) .. (2cm,0){down};

endfig;
beginfig(64)
   draw (0,0){up} ... (1cm, 1mm) ... (2cm,0){down};

endfig;
beginfig(65)
   draw (0,0){curl 0} .. (0,1cm)..(1cm,0)..(1cm,1cm);

endfig;
beginfig(66)
   draw (0,0){curl 1} .. (0,1cm)..(1cm,0)..(1cm,1cm);

endfig;
beginfig(67)
   draw (0,0){curl 2} .. (0,1cm)..(1cm,0)..(1cm,1cm);

endfig;
beginfig(68)
 pair A,B,C,D;
 xpart A = ypart A = ypart B = xpart C = 0;
 xpart B = ypart C = xpart D = ypart D = 2cm;
 draw A--B--C--D--cycle withpen pencircle scaled 2bp;
endfig;
beginfig(69)
   pair A,B,C,D,M;
   numeric lambda, mu;
   A=(0,0); B=(2cm,3cm);
   C=(1cm,0); D=(-1cm,2cm);
   M = lambda [A,B];
   M = mu     [C,D];
   draw A--B;
   draw C--D;
   draw M withpen pencircle scaled 4bp;

endfig;
beginfig(70)
   pair A,B,C,D,M;
   A=(0,0); B=(2cm,3cm);
   C=(1cm,0); D=(-1cm,2cm);
   M = whatever [A,B];
   M = whatever [C,D];
   draw A--B;
   draw C--D;
   draw M withpen pencircle scaled 4bp;

endfig;
beginfig(71)
 pair A,B,C,AA,BB,CC,G;
 A=(0,0); B=(3cm,0); C=(1cm,2cm);
 AA = 1/2 [B,C];
 BB = 1/2 [C,A];
 CC = 1/2 [A,B];
 G = whatever [A,AA];
 G = whatever [B,BB];
 draw A--B--C--cycle;
 draw A--AA dashed withdots;
 draw B--BB dashed withdots;
 draw C--CC dashed withdots;
 draw G withpen pencircle scaled 4bp;
endfig;
beginfig(72)
   path p;
   p := fullcircle scaled 5mm;
   draw p;
   draw p shifted  (1mm,2mm);
   draw p shifted 2(1mm,2mm);
   draw p shifted 3(1mm,2mm);
   draw p shifted 4(1mm,2mm);
   draw p shifted 5(1mm,2mm);

endfig;
beginfig(73)
   path p;
   p := (5mm,-5mm) {right} .. (2cm,0);
   draw p;
   draw p rotated 10;
   draw p rotated 20;
   draw p rotated 30;
   draw p rotated 40;
   draw p rotated 50;
   draw p rotated 60;
   draw p rotated 70;
   draw p rotated 80;
   draw p rotated 90;

endfig;
beginfig(74)
   path p;
   p := fullcircle scaled 5mm;
   draw p;
   draw p xscaled 2;
   draw p xscaled 3;
   draw p xscaled 4;

endfig;
beginfig(75)
 pair A,B,C,D,E;
 A := (1cm,0);
 B := A rotated 72;
 C := B rotated 72;
 D := C rotated 72;
 E := D rotated 72;
 draw A--B--C--D--E--cycle;
endfig;
beginfig(76)
 pair A,B,C,D,E;
 A := (1cm,0);
 B := A rotated 72;
 C := B rotated 72;
 D := C rotated 72;
 E := D rotated 72;
 draw A--C--E--B--D--cycle;
endfig;
beginfig(77)
 pair A,B,C,D,E;
 A := (1cm,0);
 B := A rotated 72;
 C := B rotated 72;
 D := C rotated 72;
 E := D rotated 72;
 pair AA, BB, CC, DD, EE;
 AA = whatever [A, C];
 AA = whatever [B, D];
 BB = whatever [B, D];
 BB = whatever [C, E];
 CC = whatever [C, E];
 CC = whatever [D, A];
 DD = whatever [D, A];
 DD = whatever [E, B];
 EE = whatever [E, B];
 EE = whatever [A, C];
 fill A--C--E--B--D--cycle withcolor .8white;
 fill AA--BB--CC--DD--EE--cycle withcolor white;
 draw A--C--E--B--D--cycle;
endfig;
beginfig(78)
   path p;
   p := (0,0) -- (1cm,0);
   drawarrow p withpen pencircle scaled 2bp;
   drawarrow p zscaled (1,2);

endfig;
beginfig(79)
 u:=1cm;
 path p;     p := (0,0) -- (u,0);
 pair A;     A := (u,-u);
 numeric a;  a := 90;
 drawarrow p withpen pencircle scaled 1bp;
 drawarrow p rotatedaround( A, a );
 drawarrow p shifted -A rotated a shifted A
   withpen pencircle scaled 1bp dashed withdots;
endfig;
beginfig(80)
 path p;     p := (0,0) -- (u,0);
 pair A;     A := (u,-u);
 numeric a;  a := 90;
 drawarrow p withpen pencircle scaled 1bp;
 draw A withpen pencircle scaled 4bp;
 label ulft ( btex $A$ etex, A );
 draw (0,0) withpen pencircle scaled 4bp;
 label bot ( btex $O$ etex, (0,0) );
 for i=0 upto 10:
   drawarrow p shifted -(i*A/10) withcolor red;
 endfor;
 for i=0 upto 10:
   drawarrow p shifted -A rotated (i*a/10) withcolor green;
 endfor;
 for i=0 upto 10:
   drawarrow p shifted -A rotated a shifted (i*A/10) withcolor blue;
 endfor;
endfig;
beginfig(81)
 pair A,B,C,AA,BB,CC,H;
 A=(0,0); B=(3cm,0); C=(1cm,2cm);
 AA - A = whatever * (B-C) rotated 90;
 AA = whatever [B,C];
 BB - B = whatever * (A-C) rotated 90;
 BB = whatever [A,C];
 CC - C = whatever * (A-B) rotated 90;
 CC = whatever [A,B];
 H = whatever [A,AA];
 H = whatever [B,BB];
 draw A--B--C--cycle;
 draw A--AA;
 draw B--BB;
 draw C--CC;
 draw H withpen pencircle scaled 4bp;
endfig;
beginfig(82)
 pair A,B,C,H;
 A=(0,0); B=(3cm,0); C=(1cm,2cm);
 H - A = whatever * (B-C) rotated 90;
 H - B = whatever * (A-C) rotated 90;
 draw A--B--C--cycle;
 draw H withpen pencircle scaled 4bp;
endfig;
beginfig(83)
 pair A,B,C,O;
 A=(0,0); B=(3cm,0); C=(1cm,2cm);
 O - 1/2[B,C] = whatever * (B-C) rotated 90;
 O - 1/2[A,B] = whatever * (A-B) rotated 90;
 draw A--B--C--cycle;
 draw O withpen pencircle scaled 4bp;
 draw fullcircle scaled 2abs(O-A) shifted O;
endfig;
beginfig(84)
   pair A,B,C,D;
   u:=2cm;
   A=(0,0); B=(u,0); C=(u,u); D=(0,u);

   transform T;
   A transformed T = 1/5[A,B];
   B transformed T = 1/5[B,C];
   C transformed T = 1/5[C,D];

   path p;
   p = A--B--C--D--cycle;
   draw p;
   draw p transformed T;

endfig;
beginfig(85)
   pair A,B,C,D;
   u:=2cm;
   A=(0,0); B=(u,0); C=(u,u); D=(0,u);

   transform T;
   A transformed T = 1/5[A,B];
   B transformed T = 1/5[B,C];
   C transformed T = 1/5[C,D];

   path p;
   p = A--B--C--D--cycle;
   for i=0 upto 100:
     draw p;
     p:= p transformed T;
   endfor;

endfig;
beginfig(86)
 u:=1cm;
 pair A,B,C,D,E;
 A := (0,u);
 B := A rotated 72;
 C := B rotated 72;
 D := C rotated 72;
 E := D rotated 72;
 transform T;
 A transformed T = 1/5[A,B];
 B transformed T = 1/5[B,C];
 C transformed T = 1/5[C,D];
 path p;
 p := A--B--C--D--E--cycle;
 draw p;
 p := p transformed T; draw p;
 p := p transformed T; draw p;
 p := p transformed T; draw p;
endfig;
beginfig(87)
 u:=3mm;
 fill fullcircle scaled 2u withcolor .8white;
 fill fullcircle scaled u shifted (u*dir30)
      withcolor .8white;
 fill fullcircle scaled u shifted (u*dir150)
      withcolor .8white;
endfig;
beginfig(88)
 u:=3mm;
 transform T;
 (0,0) transformed T = (0,0);
 (1,0) transformed T = (1,1);
 (0,1) transformed T = (1,0);

 fill fullcircle scaled 2u transformed T withcolor .8white;
 fill fullcircle scaled u shifted (u*dir30) transformed T
      withcolor .8white;
 fill fullcircle scaled u shifted (u*dir150) transformed T
      withcolor .8white;
endfig;
beginfig(89)
 u:=3mm;
 transform T;
 xpart T = ypart T = 0;
 xxpart T = 1;
 yxpart T = 2;
 xypart T = 3;
 yypart T = 4;

 fill fullcircle scaled 2u transformed T withcolor .8white;
 fill fullcircle scaled u shifted (u*dir30) transformed T
      withcolor .8white;
 fill fullcircle scaled u shifted (u*dir150) transformed T
      withcolor .8white;
endfig;
beginfig(90)
   draw fullcircle scaled 1cm;
   draw fullcircle scaled 5mm shifted (1cm*dir45);
   draw fullcircle scaled 5mm shifted (1cm*dir135);
   picture mypicture;
   mypicture := currentpicture;
   currentpicture := nullpicture;
   draw mypicture;
   draw mypicture shifted (1mm,1mm);
   draw mypicture shifted (2mm,2mm);

endfig;
beginfig(91)
   picture pic;
   pic := nullpicture;
   addto pic contour fullcircle scaled 1cm
     withcolor .8white;
   addto pic doublepath fullcircle scaled 1cm
     withpen pencircle scaled .5bp;
   addto pic also pic shifted (1mm,1mm);
   draw pic;

endfig;
beginfig(92)
 u:=3mm;
 picture mickey;
 mickey := nullpicture;
 addto mickey contour fullcircle scaled 2u
       withcolor .8white;
 addto mickey contour fullcircle scaled u
       shifted (u*dir30) withcolor .8white;
 addto mickey contour fullcircle scaled u
       shifted (u*dir150)
       withcolor .8white;
 draw mickey;
endfig;
beginfig(93)
 u:=3mm;
 picture mickey;
 mickey := nullpicture;
 addto mickey contour fullcircle scaled 2u
       withcolor .8white;
 addto mickey contour fullcircle scaled u
       shifted (u*dir30) withcolor .8white;
 addto mickey contour fullcircle scaled u
       shifted (u*dir150) withcolor .8white;

 transform T;
 (0,0) transformed T = (0,0);
 (1,0) transformed T = (1,1);
 (0,1) transformed T = (1,0);

 draw mickey transformed T;
endfig;
beginfig(94)
 u:=3mm;
 picture mickey;
 fill fullcircle scaled 2u withcolor .8white;
 fill fullcircle scaled u shifted (u*dir30)
      withcolor .8white;
 fill fullcircle scaled u shifted (u*dir150)
      withcolor .8white;
 mickey := currentpicture;
 currentpicture := nullpicture;

 transform T;
 (0,0) transformed T = (0,0);
 (1,0) transformed T = (1,1);
 (0,1) transformed T = (1,0);

 draw mickey transformed T;
endfig;
beginfig(95)
 pair A,B;
 path p;
 A = (0,1cm);
 B = A rotated 120;
 p = A{dir 0} .. tension 2 .. B{dir 120};
 draw p;
 draw p rotated 120;
 draw p rotated -120;
endfig;
beginfig(96)
 pair A,B;
 path p;
 numeric n;
 n:=5;
 A = (0,1cm);
 B = A rotated (2*360/n);
 p = A{dir 180} .. tension 4 .. B{dir (180+2*360/n)};
 draw p withcolor red;
 draw p rotated (1*360/n);
 draw p rotated (2*360/n);
 draw p rotated (3*360/n);
 draw p rotated (4*360/n);
endfig;
beginfig(97)
 path c[], l[];
 c[0] = fullcircle xscaled 1cm yscaled .5cm
        shifted (0,1cm);
 c[1] = c[0] rotated 120;
 c[2] = c[1] rotated 120;
 pair A;
 A = (-.5cm,1cm);
 l[0] = A{down} ..
        (A xscaled -1 rotated 120){-down rotated 120};
 l[1] = l[0] rotated 120;
 l[2] = l[1] rotated 120;
 draw c[0]; draw c[1]; draw c[2];
 draw l[0]; draw l[1]; draw l[2];
endfig;
beginfig(98)
 path c[], l[];
 c[0] = fullcircle xscaled 1cm yscaled .5cm
                   shifted (0,1cm);
 c[1] = c[0] rotated (360/4);
 c[2] = c[1] rotated (360/4);
 c[3] = c[2] rotated (360/4);
 pair A;
 A = (-.5cm,1cm);
 l[0] = A{down} ..
        (A xscaled -1 rotated (360/4))
        {-down rotated (360/4)};
 l[1] = l[0] rotated (360/4);
 l[2] = l[1] rotated (360/4);
 l[3] = l[2] rotated (360/4);
 draw c[0]; draw c[1]; draw c[2]; draw c[3];
 draw l[0]; draw l[1]; draw l[2]; draw l[3];
endfig;
beginfig(99)
   pair A, B;
   A := (0,0); B := (2cm,1cm);
   draw A withpen pencircle scaled 4bp;
   draw B withpen pencircle scaled 4bp;
   draw fullcircle scaled abs(B-A) shifted 1/2[A,B];

endfig;
beginfig(100)
   pair A;
   A:=(2cm,2cm);
   drawarrow origin--A;
   drawarrow (origin--A) rotated -1/3 angle(A);
   drawarrow (origin--A) rotated -2/3 angle(A);
   drawarrow (origin--A) rotated -angle(A);

endfig;
beginfig(101)
 pair A,B;
 A:=(1cm,2cm); B:=(2cm,1cm);
 numeric alpha;
 alpha = angle(A) - angle(B);
 drawarrow origin--A;
 drawarrow origin--B;
 drawarrow (origin--A) rotated -1/3 alpha;
 drawarrow (origin--A) rotated -2/3 alpha;
 drawarrow (origin--A) rotated -alpha;
endfig;
beginfig(102)
 pair A,B,C;
 A=(0,0); B=(3cm,0); C=(1cm,2cm);
 draw A--B--C--cycle;
 label.llft(TEX decimal(angle(C-A)-angle(B-A)), A);
 label.lrt(TEX decimal(angle(A-B)-angle(C-B)), B);
 label.urt(TEX decimal(angle(B-C)-angle(A-C)), C);
endfig;
beginfig(103)
 pair A,AA,B,BB,C,CC,O,H;
 A=(0,0); B=(3cm,0); C=(1cm,2cm);
 AA = 1/2[B,C];
 BB = 1/2[A,C];
 CC = 1/2[A,B];
 O - 1/2[BB,CC] = whatever * (BB-CC) rotated 90;
 O - 1/2[AA,BB] = whatever * (AA-BB) rotated 90;
 draw A--B--C--cycle;
 draw AA withpen pencircle scaled 4bp;
 draw BB withpen pencircle scaled 4bp;
 draw CC withpen pencircle scaled 4bp;
 draw fullcircle scaled 2abs(O-AA) shifted O;
 % Il faut aussi tracer les hauteurs
 pair AA,BB,CC;
 AA - A = whatever * (B-C) rotated 90;
 AA = whatever [B,C];
 BB - B = whatever * (A-C) rotated 90;
 BB = whatever [A,C];
 CC - C = whatever * (A-B) rotated 90;
 CC = whatever [A,B];
 draw A--AA; draw B--BB; draw C--CC;
 draw AA withpen pencircle scaled 4bp;
 draw BB withpen pencircle scaled 4bp;
 draw CC withpen pencircle scaled 4bp;
 % Il passe aussi par le milieu de HA, HB, HC
 H = whatever [A,AA];
 H = whatever [B,BB];
 draw 1/2 [A,H] withpen pencircle scaled 4bp;
 draw 1/2 [B,H] withpen pencircle scaled 4bp;
 draw 1/2 [C,H] withpen pencircle scaled 4bp;
endfig;
beginfig(104)
 pair A,B,C,M,h;
 u:=2cm;
 A=(0,0); B=(2u,-.5u); C=(u,u);
 draw A--B--C--cycle;
 (M-A) = whatever * (
   (A-C) rotated 1/2( angle(B-A) - angle(C-A)) );
 (M-B) = whatever * (
   (B-A) rotated 1/2( angle(C-B) - angle(A-B)) );
 draw M--A; draw M--B; draw M--C;
 M-h = whatever * (B-C) rotated 90;
 h = whatever[B,C];
 draw fullcircle scaled 2 abs(M-h) shifted M;
endfig;
beginfig(105)
   path p;
   p = (0,0){up} .. (2cm,0){down};
   draw p;
   draw point 0  of p withpen pencircle scaled 4bp;
   draw point .5 of p withpen pencircle scaled 4bp;
   draw point 1  of p withpen pencircle scaled 4bp;

endfig;
beginfig(106)
   path p;
   p = (0,0){up} .. (2cm,0){down};
   draw p;
   pair A;
   A := point 0  of p;
   B := A + 1cm*unitvector(direction 0  of p);
   drawarrow A--B withpen pencircle scaled 1bp;
   A := point .5 of p;
   B := A + 1cm*unitvector(direction .5 of p);
   drawarrow A--B withpen pencircle scaled 1bp;
   A := point 1  of p;
   B := A + 1cm*unitvector(direction 1  of p);
   drawarrow A--B withpen pencircle scaled 1bp;

endfig;
beginfig(107)
 u:=5mm;
 path p;
 p = (0,0) {curl 0} .. (u,2u) .. (2u,1.5u)
     .. (3u,2u) .. {curl 0} (4u,0);
 draw subpath(0,1) of p withcolor red;
 draw subpath(1,2) of p withcolor green;
 draw subpath(2,3) of p withcolor blue;
 draw subpath(3,3.5) of p dashed evenly;
 draw subpath(3.5,4) of p dashed withdots;

endfig;
beginfig(108)
 u:=1cm;
 path p,q;
 p := (0,0){up} .. (u,2u){up};
 q := (u,0){up} .. (0,2u){up};
 draw p;
 draw subpath(0,.4) of q withpen pencircle scaled 1bp;
 draw subpath(.6,1) of q withpen pencircle scaled 1bp;
endfig;
beginfig(109)
 u:=1cm;
 path a,b,c,d;
 a = (-u,-.2u){up} .. tension 1.2 .. (u,-.2u){down};
 b = a rotated 90;
 c = b rotated 90;
 d = c rotated 90;
 fill buildcycle(a,b,c,d) withcolor .8white;
 draw a; draw b; draw c; draw d;

endfig;
beginfig(110)
 u:=1cm;
 path c[];
 c[1] := fullcircle scaled u;
 c[2] := c[1] shifted (0,.5u);
 draw c[1] dashed evenly;
 draw c[2] dashed evenly;
 draw buildcycle(c[1],c[2]) withpen pencircle scaled 1bp;
endfig;
beginfig(111)
 path a,b,c;
 a = fullcircle scaled 2u shifted (.5u,0);
 b = a rotated (360/3);
 c = b rotated (360/3);
 fill a withcolor red;
 fill b withcolor green;
 fill c withcolor blue;
 fill buildcycle(a,b) withcolor red + green;
 fill buildcycle(b,c) withcolor green + blue;
 fill buildcycle(c,a) withcolor blue + red;
 fill buildcycle(a,b,c) withcolor white;
 draw a; draw b; draw c;
endfig;
beginfig(112)
   def compute_curve(suffix f)(expr xmin, xmax, xinc) =
   ( (xmin,f(xmin))
   for x=xmin+xinc step xinc until xmax:
     .. (x,f(x))
   endfor )
 enddef;
 vardef f(expr x) = x**2 + 1 enddef;
 vardef g(expr x) = 2 - (x-1)**2 enddef;
 path p, q;
 p := compute_curve(f, -1, 1.5, .1) scaled 1cm;
 q := compute_curve(g, -.5, 2, .1) scaled 1cm;
 fill buildcycle(p,reverse q) withcolor red+green;
 draw p withpen pencircle scaled 1bp;
 draw q withpen pencircle scaled 1bp;
 draw (-1cm,0) -- (2cm,0);
 draw (0,g(-.5)*1cm) -- (0,f(1.5)*1cm);
endfig;
beginfig(113)
   path p, q;
   p = (0,0){up} .. (2cm,0){up};
   q = (0,1cm){dir -60}..(1cm,-1cm)..{dir 60}(2cm,1cm);
   draw p; draw q;
   draw p intersectionpoint q withpen pencircle scaled 4bp;

endfig;
beginfig(114)
   path p, q;
   p = (0,0){up} .. (2cm,0){up};
   q = (0,1cm){dir -60}..(1cm,-1cm)..{dir 60}(2cm,1cm);
   draw p; draw q;
   numeric a,b;
   (a,whatever) = p intersectiontimes q;
   draw point a of p withpen pencircle scaled 4bp;

endfig;
beginfig(115)
 pair A,B;
 path p;
 A = (0,1cm);
 B = A rotated 120;
 p = A{dir 0} .. tension 2 .. B{dir 120};
 numeric a;
 (a,whatever) = p intersectiontimes (p rotated 120);
 draw subpath(0,a-.02) of p;
 draw subpath(a+.02,1) of p;
 draw subpath(0,a-.02) of p rotated 120;
 draw subpath(a+.02,1) of p rotated 120;
 draw subpath(0,a-.02) of p rotated -120;
 draw subpath(a+.02,1) of p rotated -120;
endfig;
beginfig(116)
 u:=2cm;
 pair A[], B[], C[], D[], E[];
 path p[];

 A[0] = u*up;
 for i=1 upto 10:
   A[i] := A[i-1] rotated 72;
 endfor;
 for i=0 upto 4:
   p[i] := A[i]--A[i+1];
   draw p[i];
   draw (point 1 of p[i]) --
   ( (point 1 of p[i]) + 4mm*unitvector(direction 1 of p[i]));
   draw (point 0 of p[i]) --
   ( (point 0 of p[i]) - 4mm*unitvector(direction 0 of p[i]));
 endfor

 for i=0 upto 9:
   B[i] := 1/2[ A[i], A[i+1] ];
 endfor;
 B[5]:=B[0];

 for i=0 upto 9:
   C[i] := .8*B[i];
 endfor;

 for i=0 upto 4:
   p[i] := B[i] --- C[i] .. C[i+2]{dir 72i};
   draw p[i];
   draw (point 2 of p[i]) --
   ( (point 2 of p[i]) + 4mm*unitvector(direction 2 of p[i]));
   draw (point 0 of p[i]) --
   ( (point 0 of p[i]) - 4mm*unitvector(direction 0 of p[i]));
 endfor;
 for i=0 upto 4:
   draw subpath(1,1.4) of p[i] withpen pencircle scaled 4bp withcolor white;
   draw subpath(0,1.5) of p[i];
 endfor;

 for i=0 upto 4:
   draw A[i] withpen pencircle scaled 4bp;
   draw B[i] withpen pencircle scaled 4bp;
   draw C[i] withpen pencircle scaled 4bp;
 endfor;
endfig;
beginfig(117)
 u:=2cm;
 pair A, B, C, D, E;
 path p, q, r;

 A = u*up;
 p := (-.2)[ A, A rotated 72 ] -- (1.2)[ A, A rotated 72 ];
 for i=0 upto 5:
   draw p rotated 72i;
 endfor;
 B := 1/2[ A, A rotated 72 ];
 C := .8*B;

 p := B --- C .. (C rotated (2*72)){right};
 % On allonge le chemin p
 p := ( (point 0 of p) - 4mm*unitvector(direction 0 of p))
      --
      (point 0 of p)
      & p &
      (point 2 of p)
      --
      ( (point 2 of p) + 4mm*unitvector(direction 2 of p));

 E = p intersectionpoint (p rotated 72);
 q := p cutbefore fullcircle scaled -2mm shifted E;
 r := p cutafter fullcircle scaled  2mm shifted E;

 for i=0 upto 4:
   draw q rotated 72i;
   draw r rotated 72i;
   draw A rotated 72i withpen pencircle scaled 4bp;
   draw B rotated 72i withpen pencircle scaled 4bp;
   draw C rotated 72i withpen pencircle scaled 4bp;
 endfor;
endfig;
beginfig(118)
   for i=0 step 1 until 3:
     draw 1cm*right rotated (i*90)
          withpen pencircle scaled 4bp;
   endfor;

endfig;
beginfig(119)
   draw for i=0 step 1 until 3:
       1cm*right rotated (i*90) --
     endfor cycle;

endfig;
beginfig(120)
 n:=5;
 draw for i=0 step 1 until n-1:
     1cm*up rotated (i*360/n) --
   endfor cycle;
endfig;
beginfig(121)
 n:=7;
 draw for i=0 step 1 until n-1:
     1cm*up rotated (i*360/n) --
   endfor cycle;
endfig;
beginfig(122)
 path p;
 p = (0,0) .. (-1cm,2cm) .. (2cm,1cm) .. (1cm,0);
 draw p;
 n:=10;
 for i=0 step 1 until n:
   draw point (i/n*length(p)) of p
        withpen pencircle scaled 4bp;
 endfor;
endfig;
beginfig(123)
 path p;
 p = (0,0) .. (-1cm,2cm) .. (2cm,1cm) .. (1cm,0);
 draw p;
 n:=10;
 for i=0 step length(p)/n until length(p):
   drawarrow (point i of p) --
             1cm * unitvector(direction i of p)
             shifted point i of p;
 endfor;
endfig;
beginfig(124)
 u:=1cm;
 draw (-2u,0)--(2u,0);
 draw (0,-2u)--(0,2u);
 for i=-2u step u until 2u:
   draw (i,u/20)--(i,-u/20);
   draw (u/20,i)--(-u/20,i);
 endfor;
endfig;
beginfig(125)
 u:=1cm;
 draw (-2u,0)--(2u,0);
 draw (0,-2u)--(0,2u);
 for i=-2u step u until 2u:
   draw (i,u/10)--(i,-u/10);
   draw (u/10,i)--(-u/10,i);
 endfor;
 for i=-2u step u/5 until 2u:
   draw (i,u/20)--(i,-u/20);
   draw (u/20,i)--(-u/20,i);
 endfor;
endfig;
beginfig(126)
 u:=1cm;
 draw (-2u,0)--(2u,0);
 draw (0,-2u)--(0,2u);
 for i=-2u step u until 2u:
   draw (i,2u)--(i,-2u);
   draw (2u,i)--(-2u,i);
 endfor;
endfig;
beginfig(127)
 u:=1cm;
 draw (-2u,0)--(2u,0);
 draw (0,-2u)--(0,2u);
 for i=-2u step u until 2u:
   draw (i,2u)--(i,-2u);
   draw (2u,i)--(-2u,i);
 endfor;
 for i=-2u step u/5 until 2u:
   draw (i,2u)--(i,-2u) withpen pencircle scaled .2bp;
   draw (2u,i)--(-2u,i) withpen pencircle scaled .2bp;
 endfor;
endfig;
beginfig(128)
 u := 5mm;
 % vardef est n�cessaire pour pouvoir passer f en argument
 vardef f(expr x) = x**2 -.1 enddef;
 def axes(expr xmin,xmax,ymin,ymax) =
   draw ( (xmin,0) -- (xmax,0) ) scaled u;
   draw ( (0,ymin) -- (0,ymax) ) scaled u;
 enddef;
 def courbe(suffix f)(expr xmin, xmax, M) =
   draw ( ( xmin, f(xmin) )
   for i=1 upto M:
   -- ( xmin + (i/M)*(xmax - xmin), f( xmin + (i/M)*(xmax - xmin) ))
   endfor ) scaled u;
 enddef;
 vardef newton(suffix f)(expr y, h, M) =
   save x,t;
   numeric x,t; x:=y;
   for i=1 upto M:
     t := x - f(x)/(  (f(x+h) - f(x))/h );
     draw ( (x,f(x)) -- (t,0) -- (t,f(t)) ) scaled u;
     x := t;
   endfor;
 enddef;
 axes(-.5,2,-.5,4);
 courbe(f,-.5,2, 100);
 newton(f, 2, .01, 10);
endfig;
beginfig(129)
 transform T;
 u:=1cm;
 z0=(0,0); z1=(2u,0); z3 = z1 rotated 90; z2 = z1+z3;
 z0 transformed T = .1[z0,z1];
 z1 transformed T = .1[z1,z2];
 z2 transformed T = .1[z2,z3];
 path p;
 p = z0--z1--z2--z3--cycle;
 fill p withcolor .8*white;
 fill p transformed T withcolor white;
endfig;
beginfig(130)
 transform T;
 u:=1cm;
 z0=(0,0); z1=(2u,0); z3 = z1 rotated 90; z2 = z1+z3;
 z0 transformed T = .1[z0,z1];
 z1 transformed T = .1[z1,z2];
 z2 transformed T = .1[z2,z3];
 path p;
 p = z0--z1--z2--z3--cycle;
 for i=0 upto 100:
   fill p withcolor .8*white;
   p := p transformed T;
   fill p withcolor white;
   p := p transformed T;
 endfor;
endfig;
beginfig(131)
 transform T;
 u:=1cm;
 z1=(0,2u);
 n := 5;
 for i=1 upto n-1:
   z[i+1] = z1 rotated (360*i/n);
 endfor;
 z1 transformed T = .1[z1,z2];
 z2 transformed T = .1[z2,z3];
 z3 transformed T = .1[z3,z4];
 path p;
 p = for i=1 upto n: z[i] -- endfor cycle;
 for i=0 upto 100:
   fill p withcolor .8*white;
   p := p transformed T;
   fill p withcolor white;
   p := p transformed T;
 endfor;
endfig;
beginfig(132)
 u:=1cm;
 pair A[];
 numeric n; n:=7;
 A[0] = (u,0);
 for i=1 upto n-1:
   A[i] = A[0] rotated (360/n*i);
 endfor;
 for i=0 upto n-1:
   draw A[i] withpen pencircle scaled 4bp;
   for j=0 upto n-1:
     if i<>j: draw A[i]--A[j] fi;
   endfor;
 endfor;
endfig;
beginfig(133)
 u:=2cm;
 numeric n,m; n:=4; m:=5;
 pair A[], B[];
 for i=1 upto n-1: A[i+1]-A[i] = (0,.2u); endfor;
 for j=1 upto m-1: B[j+1]-B[j] = (0,.2u); endfor;
 (0,0) for i=1 upto n: + A[i] endfor  = (0,0);
 (0,0) for j=1 upto m: + B[j] endfor  = (4u,0);
 for i=1 upto n:
   draw A[i] withpen pencircle scaled 4bp;
 endfor;
 for j=1 upto m:
   draw B[j] withpen pencircle scaled 4bp;
 endfor;
 for i=1 upto n:
   for j=1 upto m:
     draw A[i]--B[j];
   endfor;
 endfor;
endfig;
beginfig(134)
 u:=1cm;
 numeric n,m; n:=3; m:=3;
 pair A[], B[];
 for i=1 upto n-1: A[i+1]-A[i] = (.5u,0); endfor;
 for j=1 upto m-1: B[j+1]-B[j] = (.5u,0); endfor;
 (0,0) for i=1 upto n: + A[i] endfor  = (0,0);
 (0,0) for j=1 upto m: + B[j] endfor  = (0,4u);
 for i=1 upto n:
   draw A[i] withpen pencircle scaled 4bp;
 endfor;
 for j=1 upto m:
   draw B[j] withpen pencircle scaled 4bp;
 endfor;
 for i=1 upto n:
   for j=1 upto m:
     draw A[i]--B[j];
   endfor;
 endfor;
endfig;
beginfig(135)
 pair A[], B[];
 numeric n; n:=6;
 for i=0 upto n-1:
   A[i] = 1cm * right rotated (i*360/n);
   B[i] = 2cm * right rotated (i*360/n);
 endfor;
 A[n] = A[0]; B[n] = B[0];
 for i=0 upto n-1:
   draw A[i] -- A[i+1] -- B[i+1] -- B[i];
   draw A[i] withpen pencircle scaled 4bp;
   draw B[i] withpen pencircle scaled 4bp;
 endfor;
endfig;
beginfig(136)
 numeric n; n:=5;
 pair O,A,B,C,D;
 O = (0,0);
 A = 1cm*up;
 B = 2cm*up rotatedabout(A,30);
 C = 2cm*up;
 D = 2cm*up rotatedabout(A,-30);
 for i=0 upto n-1:
   draw (O--A--C) rotated (i*360/n);
   draw (B--A--D) rotated (i*360/n);
   draw A rotated (i*360/n) withpen pencircle scaled 4bp;
   draw B rotated (i*360/n) withpen pencircle scaled 4bp;
   draw C rotated (i*360/n) withpen pencircle scaled 4bp;
   draw D rotated (i*360/n) withpen pencircle scaled 4bp;
 endfor;
 draw O withpen pencircle scaled 4bp;
endfig;
beginfig(137)
 path p; u:=1cm;
 p = fullcircle xscaled -u yscaled 3u;
 draw p;
 for i=2 step .5 until 6:
   draw (point 2 of p){down} .. (point i of p);
 endfor;
endfig;
beginfig(138)
 pair P[], Q[], R[], S[];
 u:=.5cm;
 for i=0 upto 4:
   P[i] = u* down rotated (i*360/5);
 endfor;
 P[5] = P[0];
 for i=0 upto 4:
   Q[i] = 3*( 1/2[ P[i], P[i+1] ] );
 endfor;
 Q[5] = Q[0];
 for i=0 upto 4:
   R[i] = 1/3( Q[i] + Q[i+1] + P[i+1] );
 endfor;
 R[5] = R[0];
 for i=0 upto 5:
   S[i] = 1.5*Q[i];
 endfor;
 for i=0 upto 4:
   draw P[i]   -- P[i+1];
   draw P[i+1] -- R[i];
   draw Q[i]   -- R[i];
   draw R[i]   -- Q[i+1];
   draw Q[i]   -- S[i];
   draw S[i]   -- S[i+1];
 endfor;
endfig;
beginfig(139)
 pair P[], Q[], R[], S[];
 u:=.5cm;
 for i=0 upto 4:
   P[i] = u* down rotated (i*360/5);
 endfor;
 P[5] = P[0];
 for i=0 upto 4:
   Q[i] = 3*( 1/2[ P[i], P[i+1] ] );
 endfor;
 Q[5] = Q[0];
 for i=0 upto 4:
   R[i] = 1/3( Q[i] + Q[i+1] + P[i+1] );
 endfor;
 R[5] = R[0];
 for i=0 upto 5:
   S[i] = 1.5*Q[i];
 endfor;
 for i=0 upto 4:
   draw P[i]   -- P[i+1];
   draw P[i+1] -- R[i];
   draw Q[i]   -- R[i];
   draw R[i]   -- Q[i+1];
   draw Q[i]   -- S[i];
   draw S[i]   -- S[i+1];
 endfor;
 draw P[2] -- P[3] -- P[4] -- P[0] -- P[1] --
      R[0] -- Q[0] -- R[4] -- Q[4] -- R[3]
           -- Q[3] -- R[2] -- Q[2] --
      S[2] -- S[3] -- S[4] -- S[0] -- S[1] --
      Q[1] -- R[1] -- cycle
      withpen pencircle scaled 2bp;
endfig;
beginfig(140)
 for i=1 step -.01 until 0:
   fill fullcircle scaled (i*2cm) withcolor i*white;
 endfor;
 draw fullcircle scaled 2cm withpen pencircle scaled 2bp;
endfig;
beginfig(141)
 u:=5mm;
 path p;
 p = (0,0) .. (-1,1) .. (2,0) .. (0,-3) .. cycle;
 p := p shifted (-1,0);
 for i=1 step -.01 until 0:
   fill p scaled (i*u) withcolor i*white;
 endfor;
 draw p scaled u withpen pencircle scaled 2bp;
endfig;
beginfig(142)
 z0 = (50,50);
 z1 = z0 rotated 90;
 z2 = z1 rotated 90;
 z3 = z2 rotated 90;
 path carre;
 carre = z0--z1--z2--z3--cycle;
 s := .01;
 path rect;
 z4 = s [z2,z3]; z5 = s [z1,z0];
 rect = z1--z2--z4--z5--cycle;
 for i=0 step s until 1:
   fill rect shifted (i*(z0-z1)) withcolor i*white;
 endfor;
 draw carre withpen pencircle scaled 2bp;
endfig;
beginfig(143)
 z0 = (50,50);
 z1 = z0 rotated 90;
 z2 = z1 rotated 90;
 z3 = z2 rotated 90;
 path carre;
 carre = z0--z1--z2--z3--cycle;
 s := .01;
 for i=1 step -s until s:
   fill carre scaled i withcolor i*white;
 endfor;
endfig;
beginfig(144)
 u:=1cm;
 vardef degrade(expr p,q,M,N) =
   save a,b;
   numeric a,b;
   a := length(p);
   b := length(q);
   for i=0 upto M:
     draw (i/M) [ point 0 of p, point 0 of q ]
     for j=1 upto N:
       .. (i/M) [ point (j/N*a) of p, point (j/N*b) of q ]
     endfor;
   endfor;
 enddef;
 degrade(
   (-.1u,-.1u) .. (.1u,.1u) .. cycle,
   (-u,-u) -- (u,-u) -- (u,u) -- (-u,u) -- cycle,
   10,
   100);
endfig;
beginfig(145)
 u:=1cm;
 def couleur(expr c) = c*white enddef;
 vardef degrade(expr p,q,M,N) =
   save a,b;
   numeric a,b;
   a := length(p);
   b := length(q);
   for i=0 upto M:
     draw (i/M) [ point 0 of p, point 0 of q ]
     for j=1 upto N:
       .. (i/M) [ point (j/N*a) of p, point (j/N*b) of q ]
     endfor
     withcolor couleur(i/M);
   endfor;
 enddef;
 degrade(
   (-.5u,-.5u) .. (.5u,.5u) .. cycle,
   (-u,-u) -- (u,-u) -- (u,u) -- (-u,u) -- cycle,
   255,
   100);
endfig;
beginfig(146)
 def degrade(expr p, q, N) =
   begingroup
     save n, m, M;
     numeric n, m, M;
     n := length(p);
     m := length(q);
     M := n*m; % Il faudrait prendre le ppcm
     for i=0 upto N:
       draw
       (i/N)[ point 0 of p, point 0 of q ]
       { (i/N)[ direction 0 of p, direction 0 of q ] }
       for j=1 upto M-1:
         ..
         { (i/N) [ direction 1 of subpath((j-1)*n/M,j*n/M) of p,
                   direction 1 of subpath((j-1)*m/M,j*m/M) of q  ] }
         (i/N)[ point (j*n/M) of p, point (j*m/M) of q ]
         { (i/N) [ direction 0 of subpath(j*n/M,(j+1)*n/M) of p,
                   direction 0 of subpath(j*m/M,(j+1)*m/M) of q  ] }
       endfor
       ..
       { (i/N)[ direction n of p, direction m of q ] }
       (i/N)[ point n of p, point m of q ]
       ;
     endfor;
   endgroup;
 enddef;
 numeric u;
 u := 2cm;
 path p, q;
 p := fullcircle scaled u;
 q := (-u,-u)--(u,-u)--(u,u)--(-u,u)--cycle;
 degrade(p,q,10);
endfig;
beginfig(147)
 draw for i=0 step 10 until 360:
   2cm* (sind(2*i), cosd(3*i)) ..
 endfor cycle;
endfig;
beginfig(148)
 for i=0 step .1 until 360:
   col := i/360;
   draw 2cm* (sind(2*i), cosd(3*i))
   withpen pencircle scaled 2bp
   withcolor
     if col>.5: (2*(1-col)) [red, blue]
     else:    (1-2col) [blue, red]
     fi;
 endfor;
endfig;
beginfig(149)
 def couleur(expr x) =
   if x>.5: (2*(1-x)) [red, blue];
   else:    (1-2x) [blue, red]
   fi
 enddef;
 for i=0 step .1 until 360:
   draw 2cm* (sind(2*i), cosd(3*i))
   withpen pencircle scaled 2bp
   withcolor couleur(i/360);
 endfor;
endfig;
beginfig(150)
 for i=0 step 1 until 360:
   pair P;
   P = 2cm* (sind(2*i), cosd(3*i));
   fill fullcircle scaled 4mm shifted P withcolor white;
   draw fullcircle scaled 4mm shifted P;
 endfor;
endfig;
beginfig(151)
 for i=0 step 1 until 360:
   pair P;
   P = 2cm* (sind(2*i), cosd(3*i));
   fill fullcircle scaled 4mm shifted P withcolor white;
   draw fullcircle scaled 4mm shifted P;
 endfor;
 picture p;
 p:=nullpicture;
 for i=-180 step 1 until 180:
   pair P;
   P = 2cm* (sind(2*i), cosd(3*i));
   addto p contour fullcircle scaled 4mm shifted P withcolor white;
   addto p doublepath fullcircle scaled 4mm shifted P
     withpen pencircle scaled .5bp;
 endfor;
 clip p to (.5cm,2.5cm) -- (.5cm,1.5cm)--
           (-.5cm,1.5cm) -- (-.5cm,2.5cm)--cycle;
 draw p;
endfig;
beginfig(152)
 u:=5mm;
 vardef project(expr x,y,z) =
   x*(-1,-1) + y*(1,0) + z*(0,1)
 enddef;
 vardef f(expr x,y) = sind(x/u*180)*sind(y/u*180)*u enddef;
 numeric m,M;
 m:=-2u; M:=2u;
 for i=m step .1u until M:
   path p;
   p =
     for j=m step .1u until M:
       project(i,j,f(i,j)) --
     endfor
     project(i,M,f(i,M));
   fill (project(i,m,f(i,m)) - (0,3u)) -- p --
        (project(i,M,f(i,M)) - (0,3u)) -- cycle
        withcolor white;
   draw (project(i,m,f(i,m)) - (0,3u)) -- p --
        (project(i,M,f(i,M)) - (0,3u)) -- cycle;
   draw p;
 endfor;
endfig;
beginfig(153)
 vardef project(expr x,y,z) =
   x*(-1,-1) + y*(1,0) + z*(0,1)
 enddef;
 vardef f(expr x,y) = sind(x/u*180)*sind(y/u*180)*u enddef;
 m:=-2u; M:=2u; inc:=.1u;
 for i=m step inc until M:
   for j=m step inc until M:
     path p;
     p = project(i,j,f(i,j)) --
         project(i,j+inc,f(i,j+inc)) --
         project(i+inc,j+inc,f(i+inc,j+inc)) --
         project(i+inc,j,f(i+inc,j)) --
         cycle;
     fill p withcolor white;
     draw p;
   endfor
 endfor;
endfig;
beginfig(154)
 vardef project(expr x,y,z) =
   x*(-1,-1) + y*(1,0) + z*(0,1)
 enddef;
 vardef f(expr x,y) = sind(x/u*180)*sind(y/u*180)*u enddef;
 numeric m,M,inc,couleur;
 m:=-2u; M:=2u; inc:=.1u;
 for i=m step inc until M:
   for j=m step inc until M:
     path p;
     p = project(i,j,f(i,j)) --
         project(i,j+inc,f(i,j+inc)) --
         project(i+inc,j+inc,f(i+inc,j+inc)) --
         project(i+inc,j,f(i+inc,j)) --
         cycle;
     dfdx := (f(i,j) - f(i+inc,j))/inc;
     dfdy := (f(i,j) - f(i,j+inc))/inc;
     couleur := 1/sqrt( dfdx**2 + dfdy**2 + 1);
     fill p withcolor couleur*(red+green);
   endfor
 endfor;
endfig;
beginfig(155)
vardef f(expr x,y) = sind(x/u*180)*sind(y/u*180)*u enddef;

boolean dessine_fil_de_fer;  dessine_fil_de_fer := false;
color   dessine_couleur;     dessine_couleur    := red+green;

vardef dessine(suffix f)(expr xmin, xmax, xinc, ymin, ymax, yinc) =
 save i,j,p,dfdx,dfdy,project;
 vardef project(expr x,y,z) =
   x*(-1,-1) + y*(1,0) + z*(0,1)
 enddef;
 for i=m step inc until M:
   for j=m step inc until M:
     path p;
     p = project(i,j,f(i,j)) --
         project(i,j+inc,f(i,j+inc)) --
         project(i+inc,j+inc,f(i+inc,j+inc)) --
         project(i+inc,j,f(i+inc,j)) --
         cycle;
     dfdx := (f(i,j) - f(i+inc,j))/inc;
     dfdy := (f(i,j) - f(i,j+inc))/inc;
     couleur := 1/sqrt( dfdx**2 + dfdy**2 + 1);
     fill p withcolor couleur*dessine_couleur;
     if dessine_fil_de_fer: draw p fi;
   endfor
 endfor;
enddef;

 % Il faudrait pouvoir choisir diff�rents
 % types d'� �clairage �.
 vardef f(expr x,y) = sind(x/u*180)*sind(y/u*180)*u enddef;
 dessine(f,-2u,2u,.1u, -2u,2u,.1u);
endfig;
beginfig(156)
 vardef random_path (expr n) =
   save i, A ; numeric i; pair A[];
   for i=0 upto n:
     A[i] = (uniformdeviate(2u), uniformdeviate(2u));
   endfor;
   A[0]
   for i=1 upto n:
     .. A[i]
   endfor
 enddef;

 vardef intersections(expr p,q) =
   save a,b,N,i,j;
   numeric N,i,j;
   N:=10;
   for i=0 step length(p)/N until length(p):
     for j=0 step length(q)/N until length(p):
       numeric a,b;
       pair A;
       (a,b) = (subpath(i,i+length(p)/N) of p)
               intersectiontimes
               (subpath(j,j+length(q)/N) of q);
       if a <> -1:
         A = point a of subpath(i,i+length(p)/N) of p;
         show A;
         draw A withpen pencircle scaled 4bp;
       fi;
     endfor;
   endfor;
 enddef;

 path p,q;
 p:=random_path(4);
 q:=random_path(4);
 draw p withcolor red;
 draw q withcolor blue;
 intersections(p,q);
endfig;
beginfig(157)
 vardef auto_intersections(expr p) =
   save a,b,N,i,j;
   numeric N,i,j;
   N:=100;
   for i=0 step length(p)/N until length(p):
     for j=i+2*length(p)/N
         step length(p)/N
         until length(p):
       numeric a,b;
       pair A;
       (a,b) = (subpath(i,i+length(p)/N) of p)
               intersectiontimes
               (subpath(j,j+length(p)/N) of p);
       if a <> -1:
         A = point a of subpath(i,i+length(p)/N) of p;
         show A;
         draw A withpen pencircle scaled 4bp;
       fi;
     endfor;
   endfor;
 enddef;

 u:=2cm;
 path p,q;
 p:=random_path(12);
 draw p;
 auto_intersections(p);
endfig;
beginfig(158)
 path p;
 p := (0,0){up} .. (1cm,1cm) .. (1cm,0);
 draw p;
 draw point 1/2length(p) of p
   withpen pencircle scaled 4bp withcolor red;
 draw point (arctime (1/2 arclength(p)) of p) of p
   withpen pencircle scaled 4bp;

endfig;
beginfig(159)
 vardef milieu(expr p) =
   save l,i,tot,A,B;
   numeric l,tot,i;
   pair A,B;
   tot := longueur(p);
   l:=0;
   B := point 0 of p;
   for i:=0 step .01 until length(p):
     A := B;
     B := point i of p;
     l := l+abs(B-A);
     exitif l > 1/2 tot;
   endfor;
   1/2[A,B]
 enddef;

 path p;
 p := (0,0){up} .. (1cm,1cm) .. (1cm,0);
 draw p;
 draw point 1/2length(p) of p withpen pencircle scaled 4bp withcolor red;
 draw milieu(p) withpen pencircle scaled 4bp;
endfig;
beginfig(160)
 vardef milieu_time(expr p) =
   save l,i,tot,A,B,t;
   numeric l,tot,i,t;
   pair A,B;
   tot := longueur(p);
   l:=0;
   B := point 0 of p;
   for i:=0 step .01 until length(p):
     t:=i;
     A := B;
     B := point i of p;
     l := l+abs(B-A);
     exitif l > 1/2 tot;
   endfor;
   t % Pas de point-virgule
 enddef;

 save arrowhead;
 vardef arrowhead expr p =
   save A,u; pair A,u;
   A := milieu(p);
   u := unitvector(direction milieu_time(p) of p);
   A -- (A - ahlength*u rotated 15) --
   (A - ahlength*u rotated -15) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(161)
 save arrowhead;
 vardef arrowhead expr p =
   save A,B,u; pair A,B,u;
   A := milieu(p);
   B := p intersectionpoint
        (fullcircle scaled ahlength shifted A);
   u := unitvector(direction milieu_time(p) of p);
   A -- (A - ahlength*u rotated 30) -- B --
   (A - ahlength*u rotated -30) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(162)
 save arrowhead;
 vardef arrowhead expr p =
   save A,u; pair A,u;
   A := milieu(p);
   u := unitvector(direction milieu_time(p) of p);
   A -- (A - ahlength*u rotated 30) -- A --
   (A - ahlength*u rotated -30) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(163)
 save arrowhead;
 vardef arrowhead expr p =
   save A,u,a,b; pair A,u; path a,b;
   A := milieu(p);
   u := unitvector(direction milieu_time(p) of p);
   a := A{-u} .. (A - ahlength*u rotated 30);
   b := A{-u} .. (A - ahlength*u rotated -30);
   ( a & reverse(a) & b & reverse(b) ) --cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(164)
 pair A,B,C;
 C = 3mm*up;
 A = C rotated 120;
 B = C rotated -120;
 picture pic ;
 pic:=nullpicture;
 addto pic doublepath A--B--C--cycle withpen currentpen;
 addto pic doublepath A withpen pencircle scaled 4bp;
 addto pic doublepath B withpen pencircle scaled 4bp;
 addto pic doublepath C withpen pencircle scaled 4bp;
 for i=-3 upto 3:
   for j=-3 upto 3:
     draw pic shifted( i*(B-A) + j*(C-A) );
   endfor;
 endfor;
 clip currentpicture to (-2cm,-2cm)--(2cm,-2cm)--(2cm,2cm)--(-2cm,2cm)--cycle;
endfig;
beginfig(165)
 pair A,B,C;
 C = 3mm*up;
 A = C rotated 120;
 B = C rotated -120;
 picture pic ;
 pic:=nullpicture;
 path p;
 p := A{(C-A) rotated 30} .. C{(C-A) rotated 30};
 addto pic doublepath p withpen currentpen;
 addto pic doublepath p rotated 120 withpen currentpen;
 addto pic doublepath p rotated -120 withpen currentpen;
 for i=-3 upto 3:
   for j=-3 upto 3:
     draw pic shifted( i*(B-A) + j*(C-A) );
   endfor;
 endfor;
 clip currentpicture to (-2cm,-2cm)--(2cm,-2cm)--(2cm,2cm)--(-2cm,2cm)--cycle;
endfig;
beginfig(166)
 ux:=2mm;
 uy:=5mm;
 numeric xmin, xmax, ymin, ymax, M;
 xmin := -6.3; xmax := 12.6;
 ymin := -2;   ymax := 2;
 M := 100;
 draw (ux*xmin,0) -- (ux*xmax,0);
 draw (0,uy*ymin) -- (0,uy*ymax);
 pair a[];
 for i=0 upto M:
   a[i] := (
     xmin + (i/M)*(xmax-xmin),
     sind(180/3.14*( xmin + (i/M)*(xmax-xmin) ))
   ) xscaled ux yscaled uy;
 endfor;
 draw a[0] for i=1 upto M: --a[i] endfor;
endfig;
beginfig(167)
 ux:=5mm;
 uy:=2mm;
 numeric xmin, xmax, ymin, ymax, M;
 xmin := -2; xmax := 2;
 ymin := -.1;   ymax := 8;
 M := 100;
 draw (ux*xmin,0) -- (ux*xmax,0);
 draw (0,uy*ymin) -- (0,uy*ymax);
 pair a[];
 for i=0 upto M:
   a[i] := (
     xmin + (i/M)*(xmax-xmin),
     mexp(256*( xmin + (i/M)*(xmax-xmin) ))
   ) xscaled ux yscaled uy;
 endfor;
 draw a[0] for i=1 upto M: --a[i] endfor;
endfig;
beginfig(168)
 ux:=5mm;
 uy:=5mm;
 numeric xmin, xmax, ymin, ymax, M;
 xmin := .2; xmax := 3;
 ymin := -1.6;   ymax := 1.2;
 M := 100;
 draw (ux*-.1,0) -- (ux*xmax,0);
 draw (0,uy*ymin) -- (0,uy*ymax);
 pair a[];
 for i=0 upto M:
   a[i] := (
     xmin + (i/M)*(xmax-xmin),
     (1/256)*mlog(( xmin + (i/M)*(xmax-xmin) ))
   ) xscaled ux yscaled uy;
 endfor;
 draw a[0] for i=1 upto M: --a[i] endfor;
endfig;
beginfig(169)
 path p;
 p  = fullcircle scaled 2cm;
 z0 = (-1cm,0);
 draw p;
 draw z0 withpen pencircle scaled 2pt;

 pair A[];
 for i=0 step length(p)/100 until length(p):
   pair M,N;
   M = point i of p;
   N-M = whatever * direction i of p;
   N-z0 = whatever * direction i of p rotated 90;
   A[i] := N;
 endfor;
 draw for i=0 step length(p)/100 until length(p):
   A[i] ..
 endfor cycle;
endfig;
beginfig(170)
vardef cardiodide(expr p, O) =
 save i,M,N;
 numeric i;
 for i=0 step length(p)/100 until length(p):
   hide(
     pair M,N;
     M = point i of p;
     N-M = whatever * direction i of p;
     N-O = whatever * direction i of p rotated 90;
   )
   N ..
 endfor cycle
enddef;

 path p;
 p  = fullcircle scaled 2cm;
 z0 = (-1cm,0);
 draw p;
 draw z0 withpen pencircle scaled 2pt;
 draw cardiodide(p,z0);
endfig;
beginfig(171)
vardef cardiodide(expr p, O) =
 save i,M,N;
 numeric i;
 for i=0 step length(p)/100 until length(p):
   hide(
     pair M,N;
     M = point i of p;
     N-M = whatever * direction i of p;
     N-O = whatever * direction i of p rotated 90;
   )
   N ..
 endfor cycle
enddef;

 path p;
 p  = fullcircle scaled 2cm;
 z0 = (-1cm,0);
 pickup pencircle scaled 1pt
 draw p;
 draw z0 withpen pencircle scaled 3pt;
 draw cardiodide(p,z0);
 pickup pencircle scaled .4pt
 pair M,N;
 i:=1.5;
 M = point i of p;
 N-M  = whatever * direction i of p;
 N-z0 = whatever * direction i of p rotated 90;
 draw z0--N;
 draw (-1/2)[N,M]--(3/2)[N,M];
 draw N withpen pencircle scaled 3pt;
 draw M withpen pencircle scaled 3pt;
endfig;
beginfig(172)
 path p;
 p := (-1cm,0) .. (1cm,-1cm) .. (8mm,0)
      .. (1cm,1cm) .. (-1cm,1cm) .. cycle;
 z0 = (-2cm,0);
 draw p withpen pencircle scaled 1bp;
 draw z0 withpen pencircle scaled 3pt;
 draw cardiodide(p,z0);
endfig;
beginfig(173)
vardef inversion (expr O,k,M) =
 if pair M:
   (O + k*unitvector(M-O)/abs(M-O))
 elseif path M:
   for i=0 step length(M)/100 until length(M):
     inversion(O,k,point i of M) ..
   endfor
   cycle
 fi
enddef;

 u:=4cm;
 path p[],A,B;

 z0 = (5u,0) rotated 10;

 A = fullcircle scaled 2u;
 B = A scaled 3;
 draw inversion( z0, 2 (u**2), A )
      withpen pencircle scaled 1pt;
 draw inversion( z0, 2 (u**2), B )
      withpen pencircle scaled 1pt;

 p0 = fullcircle scaled 2u shifted (2u,0);
 for i=0 upto 5:
   if i<>0:
     p[i] = p[i-1] rotated (360/6);
   fi;
   draw inversion( z0, 2 (u**2), p[i] );
 endfor;
endfig;
beginfig(174)
 def curve(expr p,i,q,j,t) =
   point i of p {direction i of p} ..
   tension t ..
   point j of q {direction j of q}
 enddef;

 vardef sphere_with_holes (expr n) =
   save i;
   c[0] = fullcircle xscaled u yscaled 2u
                     shifted (4u,0) rotated (360/(2n)) ;
   draw c[0];
   for i=1 upto n-1:
     c[i] = c[i-1] rotated (360/n);
     draw c[i];
   endfor;
   l[0] = curve(c[0], 2, c[1], -2, 1);
   draw l[0];
   for i=1 upto n-1:
     l[i] = l[i-1] rotated (360/n);
     draw l[i];
   endfor;
 enddef;

 u:=3mm;
 path c[], l[];
 sphere_with_holes(5);
endfig;
beginfig(175)
 def curve(expr p,i,q,j,t) =
   point i of p {direction i of p} ..
   tension t ..
   point j of q {direction j of q}
 enddef;

 vardef sphere_with_holes (expr n) =
   save i;
   c[0] = fullcircle xscaled u yscaled 2u
                     shifted (4u,0) rotated (360/(2n)) ;
   for i=1 upto n-1:
     c[i] = c[i-1] rotated (360/n);
   endfor;
   l[0] = curve(c[0], 2, c[1], -2, 1);
   for i=1 upto n-1:
     l[i] = l[i-1] rotated (360/n);
   endfor;
   fill for i=0 upto n-1:
     ( reverse subpath(2,6) of c[i] ) &
     l[i] &
   endfor
   % To turn it into a cycle (ugly)
   point length(l[n-1]) of l[n-1] -- cycle
   withcolor .8white;
   for i=0 upto n-1:
     draw c[i]; draw l[i];
   endfor;
 enddef;

 u:=3mm;
 path c[], l[];
 sphere_with_holes(5);
endfig;
beginfig(176)
 path c[], l[];
 sphere_with_holes(6);
 def ellipse(expr a,b,c,d,e) =
   draw curve(a,b,c,d,e) ;
   draw curve(c,d,a,b,e) dashed evenly;
 enddef;

 ellipse (l[0], 2/3, l[2], 1/3, 4);
 ellipse (l[1], 2/3, l[3], 1/3, 4);
 ellipse (l[2], 2/3, l[4], 1/3, 4);
 ellipse (l[3], 2/3, l[5], 1/3, 4);
 ellipse (l[4], 2/3, l[0], 1/3, 4);
 ellipse (l[5], 2/3, l[1], 1/3, 4);
endfig;
beginfig(177)
 vardef bar(expr m,a,b,c) =
   m = 1/3a + 1/3b + 1/3c
 enddef;
 vardef dbar(expr m,a,b,c) =
   draw m--a; draw m--b; draw m--c;
   draw m withpen pencircle scaled 4bp;
 enddef;

 pair P[], A,B,C;
 for i=0 upto 4:
   P[i] = 1cm * up rotated (i*360/5);
   draw P[i] withpen pencircle scaled 4bp;
 endfor;
 bar(A, P[0], P[4], B);
 bar(B, A,    P[1], C);
 bar(C, B,    P[2], P[3]);
 draw fullcircle scaled 2cm dashed evenly;
 dbar(A, P[0], P[4], B);
 dbar(B, A,    P[1], C);
 dbar(C, B,    P[2], P[3]);
endfig;
beginfig(178)
% M est sur la bissectrice de l'angle A
vardef bissectrice(expr M,A,B,C) =
 (M-A) = whatever * (
   (A-C) rotated 1/2(angle(B-A) - angle(C-A)))
enddef;

% Le cercle inscrit
vardef cercle_inscrit(expr A,B,C) =
 save M, h; pair M, h;
 bissectrice(M,A,B,C);
 bissectrice(M,B,C,A);
 M-h = whatever * (B-C) rotated 90;
 h = whatever[B,C];
 fullcircle scaled 2 length(M-h) shifted M
enddef;

 pair A,B,C,M;
 u:=2cm;
 A=(0,0); B=(2u,-.5u); C=(u,u);
 draw A--B--C--cycle;
 bissectrice(M, A,B,C);
 bissectrice(M, B,C,A);
 draw M--A; draw M--B; draw M--C;
 draw cercle_inscrit(A,B,C);
endfig;
beginfig(179)
vardef premiere_trisectrice (expr M, A,B,C) =
 (M-A) = whatever * ( (A-B) rotated 1/3 (angle(C-A) - angle(B-A)) )
enddef;

vardef deuxieme_trisectrice (expr M, A,B,C) =
 (M-A) = whatever * ( (A-B) rotated 2/3 (angle(C-A) - angle(B-A)) )
enddef;

 pair A,B,C,M[];
 u:=2cm;
 A=(0,0); B=(2u,-.5u); C=(u,u);
 draw A--B--C--cycle;

 premiere_trisectrice(M1,A,B,C);
 deuxieme_trisectrice(M1,B,C,A);
 premiere_trisectrice(M2,B,C,A);
 deuxieme_trisectrice(M2,C,A,B);
 premiere_trisectrice(M3,C,A,B);
 deuxieme_trisectrice(M3,A,B,C);

 draw M1--A; draw M1--B;
 draw M2--B; draw M2--C;
 draw M3--C; draw M3--A;

 draw M1--M2--M3--cycle;
endfig;
beginfig(180)
 save arrowhead;
 vardef arrowhead expr p =
   save A,u; pair A,u;
   A := point length(p) of p;
   u := unitvector(direction length(p) of p);
   A -- (A - ahlength*u rotated 15) --
   (A - ahlength*u rotated -15) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(181)
 save arrowhead;
 vardef arrowhead expr p =
   save A,B,u; pair A,B,u;
   A := point length(p) of p;
   B := p intersectionpoint
        (fullcircle scaled ahlength shifted A);
   u := unitvector(direction length(p) of p);
   A -- (A - ahlength*u rotated 30) -- B --
   (A - ahlength*u rotated -30) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(182)
 save arrowhead;
 vardef arrowhead expr p =
   save A,u; pair A,u;
   A := point length(p) of p;
   u := unitvector(direction length(p) of p);
   A -- (A - ahlength*u rotated 30) -- A --
   (A - ahlength*u rotated -30) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(183)
 save arrowhead;
 vardef arrowhead expr p =
   save A,u,a,b; pair A,u; path a,b;
   A := point length(p) of p;
   u := unitvector(direction length(p) of p);
   a := A{-u} .. (A - ahlength*u rotated 30);
   b := A{-u} .. (A - ahlength*u rotated -30);
   ( a & reverse(a) & b & reverse(b) ) --cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(184)
 save arrowhead;
 vardef arrowhead expr p =
   save A,u; pair A,u;
   A := point 1/2length(p) of p;
   u := unitvector(direction 1/2length(p) of p);
   A -- (A - ahlength*u rotated 15) --
   (A - ahlength*u rotated -15) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(185)
 save arrowhead;
 vardef arrowhead expr p =
   save A,B,u; pair A,B,u;
   A := point 1/2length(p) of p;
   B := p intersectionpoint
        (fullcircle scaled ahlength shifted A);
   u := unitvector(direction 1/2length(p) of p);
   A -- (A - ahlength*u rotated 30) -- B --
   (A - ahlength*u rotated -30) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(186)
 save arrowhead;
 vardef arrowhead expr p =
   save A,u; pair A,u;
   A := point 1/2length(p) of p;
   u := unitvector(direction 1/2length(p) of p);
   A -- (A - ahlength*u rotated 30) -- A --
   (A - ahlength*u rotated -30) -- cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(187)
 save arrowhead;
 vardef arrowhead expr p =
   save A,u,a,b; pair A,u; path a,b;
   A := point 1/2length(p) of p;
   u := unitvector(direction 1/2length(p) of p);
   a := A{-u} .. (A - ahlength*u rotated 30);
   b := A{-u} .. (A - ahlength*u rotated -30);
   ( a & reverse(a) & b & reverse(b) ) --cycle
 enddef;

 u:=1cm;
 drawarrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(188)
 def drawwhitearrow expr p = _apth:=p; _finwhitearr enddef;

 def _finwhitearr text t =
   draw _apth t;
   fill arrowhead _apth  t withcolor white;
   draw arrowhead _apth  t
 enddef;

 u:=1cm;
 drawwhitearrow (0,0) .. (-u,u) .. (u,u);
endfig;
beginfig(189)
 def draw_white_arrow expr p = _apth:=p; _fin_white_arr enddef;
 def _fin_white_arr text t =
   draw _apth t;
   fill arrowhead _apth withcolor white;
   draw arrowhead _apth  t
 enddef;

 def draw_middle_arrow expr p = _apth:=p; _fin_middle_arr enddef;
 def _fin_middle_arr text t =
   draw _apth t;
   filldraw arrowhead_middle _apth  t
 enddef;
 vardef arrowhead_middle expr p =
   save A,u; pair A,u;
   A := point (arctime (.5arclength p) of p) of p;
   u := unitvector(direction (arctime (.5arclength p) of p) of p);
   A -- (A - ahlength*u rotated (.5ahangle) ) --
   (A - ahlength*u rotated (-.5ahangle) ) -- cycle
 enddef;

 def draw_middle_white_arrow expr p = _apth:=p; _fin_middle_white_arr enddef;
 let draw_white_middle_arrow = draw_middle_white_arrow;
 def _fin_middle_white_arr text t =
   draw _apth t;
   fill arrowhead_middle _apth  t withcolor white;
   draw arrowhead_middle _apth  t
 enddef;

 def draw_other_arrow expr p = _apth:=p; _fin_other_arr enddef;
 def _fin_other_arr text t =
   draw _apth t;
   draw arrowhead_other _apth  t
 enddef;
 vardef arrowhead_other expr p =
   save A,u,a,b; pair A,u; path a,b;
   A := point (length p) of p;
   u := unitvector(direction (length p) of p);
   a := A{-u} .. (A - ahlength*u rotated 30);
   b := A{-u} .. (A - ahlength*u rotated -30);
   ( a & reverse(a) & b & reverse(b) ) --cycle
 enddef;

 def draw_other_middle_arrow expr p = _apth:=p; _fin_other_middle_arr enddef;
 let draw_middle_other_arrow = draw_other_middle_arrow;
 def _fin_other_middle_arr text t =
   draw _apth t;
   draw arrowhead_other_middle _apth  t
 enddef;
 vardef arrowhead_other_middle expr p =
   save A,u,a,b; pair A,u; path a,b;
   A := point (arctime (.5arclength p) of p) of p;
   u := unitvector(direction (arctime (.5arclength p) of p) of p);
   a := A{-u} .. (A - ahlength*u rotated 30);
   b := A{-u} .. (A - ahlength*u rotated -30);
   ( a & reverse(a) & b & reverse(b) ) --cycle
 enddef;

 path p;
 p := halfcircle scaled 2cm;
 p := (0,0) .. (3cm,1cm) .. (-1cm,3cm);
 p := p scaled .3;
 draw_middle_arrow p;
 draw_white_arrow p scaled 1.3 withpen pencircle scaled 1bp;
 draw_white_middle_arrow p scaled 1.6;
 draw_other_middle_arrow p scaled 1.8 withpen pencircle scaled 1bp;
 draw_other_arrow p scaled 2 withpen pencircle scaled 1bp;
endfig;
beginfig(190)
 vardef mylabel(expr pic, p, t) =
   save A; pair A;
   A = point t of p +
       8bp * unitvector(direction t of p) rotated 90;
   label(pic, A);
 enddef;
 path p; u:=1cm;
 p = (0,0)..(-u,u)..(u,u);
 draw p;
 for i=0 step .2 until length(p):
   draw point i of p withpen pencircle scaled 4bp;
   mylabel(btex $A$ etex,p,i);
 endfor;
endfig;
beginfig(191)
 vardef mylabel(expr pic, p, t) =
   save A; pair A;
   A = point t of p +
       8bp * unitvector(direction t of p) rotated 90;
   label(pic, A);
 enddef;
 path p; u:=1cm;
 p = (0,0)..(-u,u)..(u,u);
 draw p;
 for i=0 step .2 until length(p):
   draw point i of p withpen pencircle scaled 4bp;
   mylabel(TEX decimal(i),p,i);
 endfor;
endfig;
beginfig(192)
 vardef mylabel(expr pic, p, t) =
   save A,a; pair A; numeric a;
   a := angle(direction t of p rotated 90);
   show(a);
   a := a + 45/2;
   if a>180: a := a - 360 fi;
   save ll, lr, ul, ur;
   pair ul,ur,ll,lr;
   ll := llcorner pic;
   lr := lrcorner pic;
   ul := ulcorner pic;
   ur := urcorner pic;
   A = point t of p +
       8bp * unitvector(direction t of p) rotated 90;
   label(pic shifted ll, A +
     if     (a >=    0) and (a <=   45): 1/2(ur-ul)
     elseif (a >=   45) and (a <=   90): 1/2(ur-ul) + 1/2(ur-lr)
     elseif (a >=   90) and (a <=  135): 1/2(ur-lr)
     elseif (a >=  135) and (a <=  180): 1/2(ll-lr) + 1/2(ur-lr)
     elseif (a >= -180) and (a <= -135): 1/2(ll-lr)
     elseif (a >= -135) and (a <=  -90): 1/2(ll-ul) + 1/2(ll-lr)
     elseif (a >=  -90) and (a <=  -45): 1/2(ll-ul)
     elseif (a >=  -45) and (a <=    0): 1/2(ll-ul) - 1/2(ll-lr)
     else: hide(show "BUG") (0,0)
     fi);
   draw A withpen pencircle scaled 2bp withcolor red;
 enddef;
 path p; u:=1cm;
 p = (0,0)..(-u,u)..(u,u);
 p := reverse fullcircle scaled 2u;
 draw p;
 for i=0 step length(p)/10 until length(p):
   draw point i of p withpen pencircle scaled 4bp;
   mylabel(TEX decimal(i),p,i);
 endfor;
endfig;
beginfig(193)
 n:=8;
 u:=5mm;
 for i=0 upto n-1:
   for j=0 upto n-1:
     if odd(i+j):
       fill (0,0)--(u,0)--(u,u)--(0,u)--cycle
            shifted (i*u,j*u) withcolor .8white;
     fi;
   endfor;
 endfor;
 for i=0 upto n:
   draw (0,i*u)--(n*u,i*u);
   draw (i*u,0)--(i*u,n*u);
 endfor;
endfig;
beginfig(194)
 n:=8;
 u:=5mm;
 for i=0 upto n-1:
   for j=0 upto n-1:
     if odd(i+j):
       for k=0 step u/5 until u:
         draw ( (k,0)--(u,u-k) )
              shifted (i*u,j*u);
         draw ( (0,k)--(u-k,u) )
              shifted (i*u,j*u);
       endfor;
     fi;
   endfor;
 endfor;
 for i=0 upto n:
   draw (0,i*u)--(n*u,i*u);
   draw (i*u,0)--(i*u,n*u);
 endfor;
endfig;
beginfig(195)
 n:=8;
 u:=5mm;
 for i=0 upto n-1:
   for j=0 upto n-1:
     if odd(i+j):
       for k=0 step u/5 until 4/5 u:
         if odd(k*5/u):
           fill ( (k,0)--(u,u-k)--(u,u-k-u/5)--
                  (k+u/5,0)--cycle )
                shifted (i*u,j*u) withcolor .8white;
         else:
           fill ( (0,k)--(u-k,u)--(u-k-u/5,u)--
                  (0,k+u/5)--cycle )
                shifted (i*u,j*u) withcolor .8white;
         fi;
       endfor;
     fi;
   endfor;
 endfor;
 for i=0 upto n:
   draw (0,i*u)--(n*u,i*u);
   draw (i*u,0)--(i*u,n*u);
 endfor;
endfig;
beginfig(196)
 vardef trace (suffix f)(expr a,b,inc) =
   save i; numeric i;
   for i=a step inc until b:
     (i*1cm, f(i)*1cm) ..
   endfor (b*1cm, f(b)*1cm)
 enddef;

 vardef axes =
   save p; picture p;
   p:=nullpicture;
   addto p doublepath (-infinity,0)--(infinity,0) withpen currentpen;
   addto p doublepath (0,-infinity)--(0,infinity) withpen currentpen;
   clip p to bbox currentpicture;
   draw p;
 enddef;

 vardef trace_rectangles_left (suffix f)(expr a,b,inc) =
   save i; numeric i;
   for i=a step inc until b-inc:
     path p;
     p = (i,0)--(i+inc,0)--(i+inc,f(i))--(i,f(i))--cycle;
     p := p scaled 1cm;
     fill p withcolor .8*white;
     draw p;
   endfor;
 enddef;

 vardef f(expr x) = 2 ** x enddef;

 trace_rectangles_left(f,-2,2,.5);
 draw trace(f, -2,2,.1);
 axes;
endfig;
beginfig(197)
 vardef trace_trapezes (suffix f)(expr a,b,inc) =
   save i; numeric i;
   for i=a step inc until b-inc:
     path p;
     p = (i,0)--(i+inc,0)--(i+inc,f(i+inc))--(i,f(i))--cycle;
     p := p scaled 1cm;
     fill p withcolor .8*white;
     draw p;
   endfor;
 enddef;

 vardef f(expr x) = 4 - x**2 enddef;

 trace_trapezes(f,-2,2,.5);
 draw trace(f, -2,2,.1);
 axes;
endfig;
beginfig(198)
 vardef trace_rectangles_right (suffix f)(expr a,b,inc) =
   save i; numeric i;
   for i=a step inc until b-inc:
     path p;
     p = (i,0)--(i+inc,0)--(i+inc,f(i+inc))--(i,f(i+inc))--cycle;
     p := p scaled 1cm;
     fill p withcolor .8*white;
     draw p;
   endfor;
 enddef;

 trace_rectangles_right(f,-2,2,.5);
 draw trace(f, -2,2,.1);
 axes;
endfig;
beginfig(199)
 vardef maxf(suffix f)(expr a,b) =
   save m,i; numeric m,i;
   m:=f(a);
   for i=a step (b-a)/100 until b:
     if m<f(i): m:=f(i); fi;
   endfor;
   m
 enddef;

 vardef trace_rectangles_max (suffix f)(expr a,b,inc) =
   save i; numeric i;
   for i=a step inc until b-inc:
     path p; numeric m;
     m:=maxf(f,i,i+inc);
     p = (i,0)--(i+inc,0)--(i+inc,m)--(i,m)--cycle;
     p := p scaled 1cm;
     fill p withcolor .8*white;
     draw p;
   endfor;
 enddef;

 vardef f(expr x) = 4 - x**2 enddef;

 trace_rectangles_max(f,-2,2,.5);
 draw trace(f, -2,2,.1);
 axes;
endfig;
beginfig(200)
 vardef minf(suffix f)(expr a,b) =
   save m,i; numeric m,i;
   m:=f(a);
   for i=a step (b-a)/100 until b:
     if m>f(i): m:=f(i); fi;
   endfor;
   m
 enddef;

 vardef trace_rectangles_min (suffix f)(expr a,b,inc) =
   save i; numeric i;
   for i=a step inc until b-inc:
     path p; numeric m;
     m:=minf(f,i,i+inc);
     p = (i,0)--(i+inc,0)--(i+inc,m)--(i,m)--cycle;
     p := p scaled 1cm;
     fill p withcolor .8*white;
     draw p;
   endfor;
 enddef;

 vardef f(expr x) = 4 - x**2 enddef;

 trace_rectangles_min(f,-2,2,.5);
 draw trace(f, -2,2,.1);
 axes;
endfig;
beginfig(201)
 u:=2cm;
 vardef koch(expr A,B,n) =
   save C; pair C;
   C = A rotatedaround(1/3[A,B], 120);
   if n>0:
     koch( A,        1/3[A,B], n-1);
     koch( 1/3[A,B], C,        n-1);
     koch( C,        2/3[A,B], n-1);
     koch( 2/3[A,B], B,        n-1);
   else:
     draw A--1/3[A,B]--C--2/3[A,B]--B;
   fi;
 enddef;
 z0=(u,0);
 z1=z0 rotated 120;
 z2=z1 rotated 120;
 koch( z0, z1, 4 );
 koch( z1, z2, 4 );
 koch( z2, z0, 4 );
endfig;
beginfig(202)
 u:=2cm;
 vardef koch(expr A,B,n) =
   save C; pair C;
   C = A rotatedaround(1/3[A,B], -120);
   if n>0:
     koch( A,        1/3[A,B], n-1);
     koch( 1/3[A,B], C,        n-1);
     koch( C,        2/3[A,B], n-1);
     koch( 2/3[A,B], B,        n-1);
   else:
     draw A--1/3[A,B]--C--2/3[A,B]--B;
   fi;
 enddef;
 z0=(u,0);
 z1=z0 rotated 120;
 z2=z1 rotated 120;
 koch( z0, z1, 4 );
 koch( z1, z2, 4 );
 koch( z2, z0, 4 );
endfig;
beginfig(203)
 pair A,B,C,D;
 u := 3cm;
 A := (0,0);
 B := (u,0);
 D := B rotated 72;
 C := (u,0) + D;
 draw A--B--C--D--cycle;
 draw A--C;
 draw btex $B'$ etex shifted 1/3 (A+B+C);
 draw btex $B$ etex shifted 1/3 (A+D+C);

endfig;
beginfig(204)
 pair A,B,C,D,E,F;
 numeric d[];
 u := 3cm;
 A := (0,0);
 B := (u,0);
 D := B rotated 72;
 C := (u,0) + D;
 d[0] := 1;
 d[1] := sqrt( 2*(1+cosd(72)) );
 d[2] := sqrt( 2*(1-cosd(36)) );
 A := A;
 B := C;
 C := D;
 draw A--B--C--cycle;
       E := (d1/(d0+d1)) [A,C];
       F := (d0/(d0+d2)) [A,B];
 draw E--C--F--cycle;
 draw btex $A$ etex shifted 1/3(E+C+F);
 draw B--C--F--cycle;
 draw btex $B$ etex shifted 1/3(B+C+E);
 draw E--F--A--cycle;
 draw btex $B'$ etex shifted 1/3(E+F+A);
endfig;
beginfig(205)
 pair A,B,C,D,E,F;
 numeric d[];
 u := 3cm;
 A := (0,0);
 B := (u,0);
 D := B rotated 72;
 C := (u,0) + D;
 draw A--B--C--cycle;
 d[0] := 1;
 d[1] := sqrt( 2*(1+cosd(72)) );
 d[2] := sqrt( 2*(1-cosd(36)) );
 E := (d1/(d0+d1)) [A,C];
 F := (d0/(d0+d2)) [A,B];
 draw E--F--B--cycle;
 draw btex $A'$ etex shifted 1/3(E+F+B);
 draw E--A--F--cycle;
 draw btex $B$ etex shifted 1/3(E+A+F);
 draw C--E--B--cycle;
 draw btex $B'$ etex shifted 1/3(C+E+B);
endfig;
beginfig(206)
 pair A,B,C,D,E,F;
 numeric d[];
 u := 3cm;
 A := (0,0);
 B := (u,0);
 D := B rotated 72;
 C := (u,0) + D;
 d[0] := 1;
 d[1] := sqrt( 2*(1+cosd(72)) );
 d[2] := sqrt( 2*(1-cosd(36)) );
 A := A;
 B := C;
 C := D;
       E := (d1/(d0+d1)) [A,C];
       F := (d0/(d0+d2)) [A,B];
 B := 3*(C-E);
 C := 3*(F-E);

 draw A--B--C--cycle;

 D := (d0/(d0+d2)) [C,A];
 draw B--C--D--cycle;
 draw btex $A$ etex shifted 1/3(B+C+D);
 draw B--D--A--cycle;
 draw btex $B'$ etex shifted 1/3(B+D+A);
endfig;
beginfig(207)
 pair A,B,C,D,E,F;
 numeric d[];
 u := 3cm;
 A := (0,0);
 B := (u,0);
 D := B rotated 72;
 C := (u,0) + D;
 d[0] := 1;
 d[1] := sqrt( 2*(1+cosd(72)) );
 d[2] := sqrt( 2*(1-cosd(36)) );

 % B'
 E := (d1/(d0+d1)) [A,C];
 F := (d0/(d0+d2)) [A,B];

 % A'
 A := 2*(E-E);
 C := 2*(B-E);
 B := 2*(F-E);

 draw A--B--C--cycle;
 D := (d0/(d0+d2)) [A,B];
 draw C--D--B--cycle;
 draw btex $A'$ etex shifted 1/3(C+D+B);
 draw C--A--D--cycle;
 draw btex $B$ etex shifted 1/3(C+A+D);
endfig;
beginfig(208)
 vardef pave(expr t, A, B, C, n) =
   save D, E, d;
   pair D,E;
   numeric d[];
   d[0] := 1;
   d[1] := sqrt( 2*(1+cosd(72)) );
   d[2] := sqrt( 2*(1-cosd(36)) );
   if n>0:
     if t=1:
       D := (d0/(d0+d2)) [A,C];
       pave(1,B,C,D,n-1);
       pave(4,B,D,A,n-1);
     elseif t=2:
       D := (d0/(d0+d2)) [A,B];
       pave(2,C,D,B,n-1);
       pave(3,C,A,D,n-1);
     elseif t=3:
       D := (d1/(d0+d1)) [A,B];
       E := (d0/(d0+d2)) [A,C];
       pave(1,D,C,E,n-1);
       pave(3,B,C,D,n-1);
       pave(4,D,E,A,n-1);
     elseif t=4:
       D := (d1/(d0+d1)) [A,C];
       E := (d0/(d0+d2)) [A,B];
       pave(2,D,E,B,n-1);
       pave(3,D,A,E,n-1);
       pave(4,C,D,B,n-1);
     fi;
   else:
     draw A--B--C--cycle;
     if t=1:
       fill A--B--C--cycle withcolor green + blue;
       draw A--C withpen pencircle scaled 1bp;
       draw A--B withpen pencircle scaled 1bp;
     elseif t=2:
       fill A--B--C--cycle withcolor green + blue;
       draw A--B withpen pencircle scaled 1bp;
       draw A--B withpen pencircle scaled 1bp;
     elseif t=3:
       fill A--B--C--cycle withcolor green + red;
       draw A--C withpen pencircle scaled 1bp;
       draw C--B withpen pencircle scaled 1bp;
     elseif t=4:
       fill A--B--C--cycle withcolor green + red;
       draw B--C withpen pencircle scaled 1bp;
       draw A--B withpen pencircle scaled 1bp;
     fi;
   fi;
 enddef;
 numeric M;
 M := 6;
 pair A,B,C,D;
 u := 3cm;
 A := (0,0);
 B := (u,0);
 D := B rotated 72;
 C := (u,0) + D;
 pave(3,A,C,D,M);
 pave(4,A,B,C,M);
endfig;
beginfig(209)
u:=1cm;

def milieu (expr s, ss, n) =
 if n<>0:
   for i="A","BA","BBA":
     milieu(s&i, ss, n-1);
   endfor;
 else:
   dessine(s&ss);
 fi;
enddef;

def doit(expr N) =
 for n=1 upto N:
   for i="A","BA","BBA":
     for j="","B","BB":
       milieu(i,j,n-1);
     endfor;
   endfor;
 endfor;
 milieu("","",0);
enddef;

vardef A(expr a) =
 save x,y,n;
 numeric x,y,n;
 x := xpart a;
 y := ypart a;
 n:=x*x+y*y;
 (-x/n, y/n)
enddef;

vardef B(expr a) =
 save x,y,n;
 numeric x,y,n;
 x := 1 + xpart a;
 y := ypart a;
 n := x*x+y*y;
 (-x/n, y/n)
enddef;

def dessine(expr s) =
 _dessine(s, dir(60),  up,       dir(120));
 _dessine(s, dir(60),  dir(31),  dir(2));
 _dessine(s, dir(120), dir(149), dir(178));
enddef;

def _dessine(expr s, a,b,c) =
 pair p[];
 p[0] := a;
 p[1] := b;
 p[2] := c;

 for i=0 upto length(s)-1:
   if (substring(i,i+1) of s) = "A":
       for j=0 upto 2: p[j] := A( p[j] ); endfor;
   elseif (substring(i,i+1) of s) = "B":
       for j=0 upto 2: p[j] := B( p[j] ); endfor;
   else: show("Ceci n'est pas un g�n�rateur : "&substring(i,i+1) of s)
   fi;
 endfor;
 if (xpart p[0] < 2) and (xpart p[0] > -2) and
    (xpart p[2] > -2) and (xpart p[2] < 2) and
    (ypart p[0] < 2) and (ypart p[2] < 2):
   draw ( p[0] .. p[1] .. p[2] ) scaled u;
 fi;

enddef;

 fill (dir(60) .. up .. dir(120) --
       (dir120+up) -- (dir60+up) -- cycle)  scaled u
      withcolor red+green;
 doit(7);
 draw (u*dir(60)) withpen pencircle scaled 4bp;
 draw (0,u) withpen pencircle scaled 4bp;
 draw (u*dir(60) -- u*dir(60)+u*up) shifted (0u,0);
 draw (u*dir(60) -- u*dir(60)+u*up) shifted (1u,0);
 draw (u*dir(60) -- u*dir(60)+u*up) shifted (-u,0);
 draw (u*dir(60) -- u*dir(60)+u*up) shifted (-2u,0);
endfig;
beginfig(210)
 u:=5mm;
 pickup pencircle scaled 1pt;
 for i=0 upto 500:
   draw (u*normaldeviate, u*normaldeviate);
 endfor;
endfig;
beginfig(211)
 u:=2cm;
 pickup pencircle scaled 1pt;
 for i=0 upto 500:
   draw (u*uniformdeviate(1), u*uniformdeviate(1));
 endfor;
endfig;
beginfig(212)
 numeric n;
 n:=10;
 path p;
 p := for i=0 upto n-1:
   ((1cm + 3mm*normaldeviate,0) rotated (i*360/n)) ..
 endfor cycle;
 fill p withcolor .8white;
 draw p;
endfig;
beginfig(213)
 m:=500;
 u:=1cm;
 pair A,B;
 A:=(0,0);
 for i=0 upto m:
   B:=(i/m*3u, (ypart A)+normaldeviate/m*30u);
   draw A--B;
   A:=B;
 endfor;
 draw (0,0)--(3u,0);
endfig;
beginfig(214)
 m:=50;
 pair A[], B[];
 A[0]=(0,0);
 for i=0 upto m:
   A[i+1]=(i/m*3u, (ypart A[i])+(uniformdeviate(2)-1)/m*30u);
 endfor;
 B[0]=A[0];
 B[1]=A[1];
 B[2]=A[2];
 B[3]=A[3];
 for i=4 upto m+1:
   B[i] = ( A[i-4] + A[i-3] + A[i-2] + A[i-1] + A[i])/5;
 endfor;
 for i=0 upto m:
   draw B[i]--B[i+1] withpen pencircle scaled 2pt
        withcolor .5*white;
 endfor;
 for i=0 upto m:
   draw A[i]--A[i+1];
 endfor;
 draw (0,0)--(3u,0);
endfig;
def rescale_currentpic :=
 if xpart (lrcorner currentpicture - llcorner currentpicture) > 4cm:
   currentpicture := currentpicture scaled ( 4cm /
     xpart (lrcorner currentpicture - llcorner currentpicture) );
 fi;
enddef;
beginfig(215)
vardef check_pascal =
 save again;
 boolean again;
 again := false;
 % Distance entre deux points sur le cercle : au moins 1mm
 for i=0 upto 5:
   for j=i+1 upto 5:
     show( decimal(i) &" "& decimal(j) &" "& decimal(abs(A[i]-A[j])/2mm) );
     if abs(A[i]-A[j]) < 2mm:
       again := true;
     fi;
   endfor;
 endfor;
 % Distance entre deux des M[i] : au moins 2mm, au plus 10cm
 for i=0 upto 2:
   for j=i+1 upto 2:
     if (abs(M[i]-M[j]) > 10cm) or (abs(M[i]-M[j]) < 2mm):
       again := true;
     fi;
   endfor;
 endfor;
 % Distance entre un A[i] et un M[i] : au moins 2mm
 for i=0 upto 5:
   for j=0 upto 2:
     if abs(A[i]-M[j]) < 2mm:
       again := true;
     fi;
   endfor;
 endfor;
 % Distance entre le cercle et l'un des M[i] : au plus 10cm
 if abs(M[0])>10cm:
   again:=true;
 fi;
 show again;
 not again
enddef;

 forever:
   path C;
   C := fullcircle scaled 6cm;
   pair A[], M[];
   for i=0 upto 5:
     A[i] := point uniformdeviate(length(C)) of C;
   endfor;
   M[0] = whatever[ A[0], A[1] ];
   M[0] = whatever[ A[3], A[4] ];
   M[1] = whatever[ A[1], A[2] ];
   M[1] = whatever[ A[4], A[5] ];
   M[2] = whatever[ A[2], A[3] ];
   M[2] = whatever[ A[5], A[0] ];
   exitif check_pascal;
 endfor;

 draw C;
 draw A[0]--A[1] withcolor red;
 draw A[3]--A[4] withcolor red;
 draw A[0]--M[0] withcolor red dashed evenly;
 draw A[3]--M[0] withcolor red dashed evenly;

 draw A[1]--A[2] withcolor green;
 draw A[4]--A[5] withcolor green;
 draw A[1]--M[1] withcolor green dashed evenly;
 draw A[4]--M[1] withcolor green dashed evenly;

 draw A[2]--A[3] withcolor blue;
 draw A[5]--A[0] withcolor blue;
 draw A[2]--M[2] withcolor blue dashed evenly;
 draw A[5]--M[2] withcolor blue dashed evenly;

 draw M[0]--M[1]--M[2]--cycle withpen pencircle scaled 2bp;
 for i=0 upto 2:
   draw M[i] withpen pencircle scaled 6bp;
 endfor;
 for i=0 upto 5:
   draw A[i] withpen pencircle scaled 6bp;
 endfor;
 rescale_currentpic;
endfig;
beginfig(216)
vardef pascal(expr C) =
 forever:
   pair A[], M[];
   for i=0 upto 5:
     A[i] := point uniformdeviate(length(C)) of C;
   endfor;
   M[0] = whatever[ A[0], A[1] ];
   M[0] = whatever[ A[3], A[4] ];
   M[1] = whatever[ A[1], A[2] ];
   M[1] = whatever[ A[4], A[5] ];
   M[2] = whatever[ A[2], A[3] ];
   M[2] = whatever[ A[5], A[0] ];
   exitif check_pascal;
 endfor;

 draw C;
 draw A[0]--A[1] withcolor red;
 draw A[3]--A[4] withcolor red;
 draw A[0]--M[0] withcolor red dashed evenly;
 draw A[3]--M[0] withcolor red dashed evenly;

 draw A[1]--A[2] withcolor green;
 draw A[4]--A[5] withcolor green;
 draw A[1]--M[1] withcolor green dashed evenly;
 draw A[4]--M[1] withcolor green dashed evenly;

 draw A[2]--A[3] withcolor blue;
 draw A[5]--A[0] withcolor blue;
 draw A[2]--M[2] withcolor blue dashed evenly;
 draw A[5]--M[2] withcolor blue dashed evenly;

 draw M[0]--M[1]--M[2]--cycle withpen pencircle scaled 2bp;
 for i=0 upto 2:
   draw M[i] withpen pencircle scaled 6bp;
 endfor;
 for i=0 upto 5:
   draw A[i] withpen pencircle scaled 6bp;
 endfor;
enddef;

 pascal(fullcircle xscaled 6cm yscaled 3cm);
 rescale_currentpic;
endfig;
beginfig(217)
 pascal((for i=-2cm step .1cm until 2cm:
       (i, (i/1cm)**2 *1cm) ..
     endfor (2.1cm,4.41cm)) rotated 30);
 rescale_currentpic;
endfig;
beginfig(218)
vardef pascal(expr C) =
 forever:
   pair A[], M[];

   numeric t[];
   for i=0 upto 5:
     t[i] = uniformdeviate(length(C));
   endfor;
   for i=0 upto 5:
     for j=0 upto 4:
       if t[j]>t[j+1]:
         tt:=t[j]; t[j]:=t[j+1]; t[j+1]:=tt;
       fi;
     endfor;
   endfor;
   for i=0 upto 5:
     A[i] = point t[i] of C;
   endfor;

   M[0] = whatever[ A[0], A[1] ];
   M[0] = whatever[ A[3], A[4] ];
   M[1] = whatever[ A[1], A[2] ];
   M[1] = whatever[ A[4], A[5] ];
   M[2] = whatever[ A[2], A[3] ];
   M[2] = whatever[ A[5], A[0] ];
   exitif check_pascal;
 endfor;

 draw C;
 draw A[0]--A[1] withcolor red;
 draw A[3]--A[4] withcolor red;
 draw A[0]--M[0] withcolor red dashed evenly;
 draw A[3]--M[0] withcolor red dashed evenly;

 draw A[1]--A[2] withcolor green;
 draw A[4]--A[5] withcolor green;
 draw A[1]--M[1] withcolor green dashed evenly;
 draw A[4]--M[1] withcolor green dashed evenly;

 draw A[2]--A[3] withcolor blue;
 draw A[5]--A[0] withcolor blue;
 draw A[2]--M[2] withcolor blue dashed evenly;
 draw A[5]--M[2] withcolor blue dashed evenly;

 draw M[0]--M[1]--M[2]--cycle withpen pencircle scaled 2bp;
 for i=0 upto 2:
   draw M[i] withpen pencircle scaled 6bp;
 endfor;
 for i=0 upto 5:
   draw A[i] withpen pencircle scaled 6bp;
 endfor;
enddef;

 pascal(fullcircle scaled 6cm);
 rescale_currentpic;
endfig;
beginfig(219)
 pascal(fullcircle xscaled 6cm yscaled 3cm);
 rescale_currentpic;
endfig;
beginfig(220)
 pascal(fullcircle xscaled 6cm yscaled 3cm);
 rescale_currentpic;
endfig;
beginfig(221)
 vardef barycentre(text t) =
   save n, G;
   pair G; numeric n;
   G := origin; n:=0;
   for a=t:
     G:=G+a;
     n:=n+1;
   endfor;
   G/n
 enddef;

 pair A[];
 n:=10;
 for i=0 upto n:
   A[i] = 1cm*(normaldeviate, normaldeviate);
   draw A[i] withpen pencircle scaled 4bp;
 endfor;
 draw barycentre(A[0] for i=1 upto 10: ,A[i] endfor)
   withpen pencircle scaled 4bp withcolor red;
endfig;
beginfig(222)
 vardef barycentre(text t) =
   save a, i, n, G, X;
   pair G,X; numeric n,i;
   G := origin; n:=0; i:=0;
   for a=t:
     show("i = "& decimal(i));
     show a;
     if odd(i):
       show("odd");
       n:=n+a;
       G:= G + a*X;
     else:
       show("even");
       X:=a;
     fi;
     i:=i+1;
   endfor;
   G/n
 enddef;

 pair A[];
 n:=10;
 for i=0 upto n:
   A[i] = 1cm*(normaldeviate, normaldeviate);
   draw A[i] withpen pencircle scaled 4bp;
 endfor;
 draw barycentre(A[0],0 for i=1 upto 10: ,A[i],i endfor)
   withpen pencircle scaled 4bp withcolor red;
endfig;
beginfig(223)
   numeric n;
   n:=10;
   path p;
   p := for i=0 upto n-1:
       ((1cm + 3mm*normaldeviate,0) rotated (i*360/n)) ..
     endfor cycle;
   for i=0 step 2mm until 3cm:
     draw fullcircle scaled i;
   endfor;
   clip currentpicture to p;
   draw p;

endfig;
beginfig(224)
     u := 5mm;
 draw (-2u,0) -- (2u,0);
 draw (0,-u) -- (0,4u);
 draw (-2u,4u) for i=-1.9 step .1 until 2.01: .. (i*u, i*i*u) endfor
   withpen pencircle scaled 1bp;
 draw bbox currentpicture withpen pensquare scaled 2bp withcolor .8white;
 draw bbox currentpicture withpen pensquare scaled 2bp withcolor .8white;
endfig;
beginfig(225)
 path p;
 p := (0,0) -- (2cm,0);
 def doit (suffix p)(expr t) =
   begingroup
     interim linecap := t;
     draw p withpen pencircle scaled 5mm withcolor .8white;
   endgroup;
   draw point 0 of p withpen pencircle scaled 4bp;
   draw point 1 of p withpen pencircle scaled 4bp;
   p := p shifted (0,-7mm)
 enddef;
 doit(p,rounded);
 doit(p,butt);
 doit(p,squared);

endfig;
beginfig(226)
 path p;
 p := (0,0) -- (1cm,5mm) -- (2cm,0);
 def doit (suffix p)(expr t) =
   begingroup
     interim linejoin := t;
     draw p withpen pencircle scaled 5mm withcolor .8white;
   endgroup;
   draw point 0 of p withpen pencircle scaled 4bp;
   draw point 1 of p withpen pencircle scaled 4bp;
   draw point 2 of p withpen pencircle scaled 4bp;
   p := p shifted (0,-7mm)
 enddef;
 doit(p,rounded);
 doit(p,mitered);
 doit(p,beveled);

endfig;
beginfig(227)
 path p;
 p := (0,0) -- (2cm,0);
 vardef doit (suffix p)(expr t) =
   interim linecap := t;
   draw p withpen pencircle scaled 5mm withcolor .8white;
   draw point 0 of p withpen pencircle scaled 4bp;
   draw point 1 of p withpen pencircle scaled 4bp;
   draw point 2 of p withpen pencircle scaled 4bp;
   p := p shifted (0,-7mm)
 enddef;
 doit(p,rounded);
 doit(p,butt);
 doit(p,squared);

endfig;
beginfig(228)
 draw fullcircle scaled 2cm;
 special("0 0 moveto 10 10 rlineto -10 10 rlineto stroke");

endfig;
beginfig(229)
 draw fullcircle shifted (.5,.5) xscaled 18.2cm yscaled 4cm;
 special(
   "/Times-Roman findfont 150 scalefont setfont " &
   "0 0 moveto (ABCabc) false charpath clip stroke " &
   "gsave 300 0 translate " &
   "  2 4 600 {dup 0 moveto 0 exch 0 exch 0 360 arc stroke} for " &
   "grestore "
   );

endfig;
beginfig(230)
 draw fullcircle shifted (.5,.5) xscaled 18.2cm yscaled 4cm;
 special(
   "gsave " &
   "/Times-Roman findfont 150 scalefont setfont " &
   "0 0 moveto (ABCabc) false charpath clip stroke " &
   "gsave 300 0 translate " &
   "  2 4 600 {dup 0 moveto 0 exch 0 exch 0 360 arc stroke} for " &
   "grestore " &
   "grestore "
   );

endfig;
beginfig(231)
 path p;
 p =
 (0,u)
 for i=.1 step .1 until 10:
   hide( pair A; A = (i*u, (sind (i*180/3.14))/i *u);
         draw A withpen pencircle scaled 2pt )
   .. A
 endfor;
 draw p;
endfig;
beginfig(232)
vardef inversion (expr O,k,M) =
 if pair M:
   (O + k*unitvector(M-O)/abs(M-O))
 elseif path M:
   for i=0 step length(M)/10 until length(M):
     hide(
       draw O--inversion(O,k,point i of M)--(point i of M);
       draw inversion(O,k,point i of M) withpen pencircle scaled 2pt;
       draw point i of M withpen pencircle scaled 2pt withcolor red;
       draw O withpen pencircle scaled 2pt;
       )
     inversion(O,k,point i of M) ..
   endfor
   cycle
 fi
enddef;

 path p[];
 p1=fullcircle scaled 2u shifted (u,0);
 p2=fullcircle scaled 2u shifted (-u,0);
 draw p1 dashed withdots scaled .25;
 draw p2 dashed withdots scaled .25;
 z0 = (.5u,2u);
 draw inversion( z0, 2 (u**2), p1 );
 draw inversion( z0, 2 (u**2), p2 );
endfig;
beginfig(233)
 path p;
 p := (0,0) -- (1cm,0);
 show ahangle;
 begingroup
   interim ahangle := 30;
   interim linejoin := mitered;
   interim linecap := butt;
   drawarrow p withpen pencircle scaled 2bp;
 endgroup;
 begingroup
   interim ahangle := 60;
   drawarrow p shifted (0,-5mm) withpen pencircle scaled 2bp;
 endgroup;

endfig;
beginfig(234)
 numeric x;
 x = sind(60);
 draw TEX("$\sin 60 = " & decimal(x) & "$");

endfig;
beginfig(235)
picture _TEX_pic;

def largeur(expr p) =
 if picture p:
   xpart( lrcorner(p) - llcorner(p) )
 elseif string p:
   hide(_TEX_pic := TEX(p);)
   xpart( lrcorner(_TEX_pic) - llcorner(_TEX_pic) )
 else:
   hide( errmessage("largeur: wrong type"); 0)
 fi
enddef;

def hauteur(expr p) =
 if picture p:
   ypart(ulcorner(p))
 elseif string p:
   hide(_TEX_pic := TEX(p);)
   ypart(ulcorner(_TEX_pic))
 else:
   hide( errmessage("hauteur: wrong type"); 0)
 fi
enddef;

def profondeur (expr p) =
 if picture p:
   -ypart(llcorner(p))
 elseif string p:
   hide(_TEX_pic := TEX(p);)
   -ypart(llcorner(_TEX_pic))
 else:
   hide( errmessage("profondeur: wrong type"); 0)
 fi
enddef;

 picture p;
 string s;
 s := "\huge\LaTeX";
 p := TEX(s);
 drawarrow (0,0) -- (largeur(s),0) withcolor red;
 drawarrow (0,0) -- (0,hauteur(s)) withcolor green;
 drawarrow (0,0) -- (0,-profondeur(s)) withcolor blue;
 draw p;
 draw bbox p;
endfig;
beginfig(236)
 def reddraw text t = draw t withcolor red enddef;
 draw (0,0) -- (2cm,0);
 reddraw (0,0) -- (2cm,5mm) withpen pencircle scaled 2bp;

endfig;
beginfig(237)
path _myfill_p;

def myfill expr p =
 _myfill_p := p;
 _myfill
enddef;

def _myfill text t =
 fill _myfill_p t;
 draw _myfill_p t withcolor red;
enddef;

 myfill fullcircle scaled 1cm withcolor .8white withpen pencircle scaled 2bp;
endfig;
beginfig(238)
   boxit.a(btex Essai etex);
   a.c = (0,0);
   drawboxed(a);

endfig;
beginfig(239)
   circleit.a(btex Essai etex);
   a.c = (0,0);
   drawboxed(a);

endfig;
beginfig(240)
 rboxit.a(btex Essai etex);
 a.c = (0,0);
 drawboxed(a);

endfig;
beginfig(241)
 boxit.a(btex Essai etex);
 a.c = (0,0);
 drawunboxed(a);

endfig;
beginfig(242)
 circleit.a(btex Essai etex);
 a.c = (0,0);
 a.dx = a.dy;
 drawboxed(a);
endfig;
beginfig(243)
 circleit.a(btex Essai etex);
 a.c = (0,0);
 a.dx = a.dy;
 drawunboxed(a);
 for i=0 step 10 until 360:
   draw (0,0) -- 1cm*right rotated i cutbefore bpath.a;
 endfor;
endfig;
beginfig(244)
 circleit.a(btex D�but etex);
 a.c = (0,0);
 a.dx = a.dy;
 circleit.b(btex Fin etex);
 b.c = (2cm,0);
 b.dx = b.dy;
 drawboxed(a,b);
 drawarrow  a.c {dir 45} .. b.c {dir -45}
 cutbefore bpath.a cutafter bpath.b;
 drawarrow  b.c {dir -135} .. a.c {dir 135}
 cutbefore bpath.b cutafter bpath.a;
endfig;
beginfig(245)
 circleit.a(btex D�but etex);
 a.c = (0,0);
 a.dx = a.dy;
 circleit.b(btex Fin etex);
 b.c = (2cm,0);
 b.dx = b.dy;
 drawunboxed(a,b);
 drawarrow  a.c {dir 45} .. b.c {dir -45}
 cutbefore bpath.a cutafter bpath.b;
 drawarrow  b.c {dir -135} .. a.c {dir 135}
 cutbefore bpath.b cutafter bpath.a;
endfig;
beginfig(246)
 boxjoin(
   a.dx = a.dy;
   b.dx = b.dy;
   a.e + (5mm,0) = b.w;
   );
 circleit.a(btex D�but etex);
 a.c = (0,0);
 circleit.b(btex Fin etex);
 drawboxed(a,b);
 drawarrow  a.c {dir 45} .. b.c {dir -45}
 cutbefore bpath.a cutafter bpath.b;
 drawarrow  b.c {dir -135} .. a.c {dir 135}
 cutbefore bpath.b cutafter bpath.a;
endfig;
beginfig(247)
 % Toujours mettre la commande boxjoin au d�but.
 boxjoin(a.e = b.w);
 boxit.a(btex A etex);
 boxit.b(btex B etex);
 boxit.c(btex C etex);
 boxit.d(btex D etex);
 drawboxed(a,b,c,d);
endfig;
beginfig(248)
 boxjoin(a.e = b.w);
 boxit.a(btex a etex);
 boxit.b(btex b etex);
 boxit.c(btex c etex);
 boxit.d(btex d etex);
 drawboxed(a,b,c,d);
endfig;
beginfig(249)
 boxjoin(a.se = b.sw; a.ne = b.nw);
 boxit.a(btex a etex);
 boxit.b(btex b etex);
 boxit.c(btex c etex);
 boxit.d(btex d etex);
 drawboxed(a,b,c,d);
endfig;
beginfig(250)
 boxjoin(a.se = b.sw; a.ne = b.nw);
 boxit.a1(btex a etex);
 boxit.a2(btex b etex);
 boxit.a3(btex c etex);
 boxit.a4(btex d etex);
 drawboxed(a1,a2,a3,a4);
endfig;
beginfig(251)
 draw (0,0) -- (5cm,0) withcolor red;
 draw btex a etex ;
 draw btex b etex shifted (1cm,0);
 draw btex c etex shifted (2cm,0);
 draw btex d etex shifted (3cm,0);
 draw btex e etex shifted (4cm,0);
endfig;
beginfig(252)
 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0));
 boxit a (btex a etex);
 boxit b (btex b etex);
 boxit c (btex c etex);
 boxit d (btex d etex);
 boxit e (btex e etex);
 drawunboxed(a,b,c,d,e);
endfig;
beginfig(253)
 vardef boxTEX expr s =
   save p,h,l;
   picture p;
   numeric h,l;
   p := TEX(s);
   h := max(ypart ulcorner(p), abs(ypart llcorner(p)));
   l := xpart lrcorner(p);
   setbounds p to (0,-h)--(l,-h)--(l,h)--(0,h)--cycle;
   p
 enddef;

 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0));
 boxit a (boxTEX "a");
 boxit b (boxTEX "b");
 boxit c (boxTEX "c");
 boxit d (boxTEX "d");
 boxit e (boxTEX "e");
 drawunboxed(a,b,c,d,e);
endfig;
beginfig(254)
 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0));
 boxit a (boxTEX "a");
 boxit b (boxTEX "b");
 boxit c (boxTEX "c");
 boxit d (boxTEX "d");
 boxit e (boxTEX "e");
 drawboxed(a,b,c,d,e);
endfig;
beginfig(255)
 let OLD_beginbox_ = beginbox_;
 def beginbox_(expr pp,sp)(suffix $)(text t) =
   _n_ := str $;
   generic_declare(pair) _n.off, _n.c;
   generic_declare(string) pproc_._n, sproc_._n;
   generic_declare(picture) pic_._n;
   pproc_$:=pp; sproc_$:=sp;
   pic_$ = nullpicture;
   for _p_=t:
     pic_$:=
       if picture _p_: _p_
       else: _p_ infont defaultfont scaled defaultscale
       fi;
   endfor
   $c = $off + (.5[xpart llcorner pic_$, xpart urcorner pic_$], 0)
 enddef;

 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0));
 boxit a (btex a etex);
 boxit b (btex b etex);
 boxit c (btex c etex);
 boxit d (btex d etex);
 boxit e (btex e etex);
 drawunboxed(a,b,c,d,e);
endfig;
beginfig(256)
 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0));
 boxit a (btex a etex);
 boxit b (btex b etex);
 boxit c (btex c etex);
 boxit d (btex d etex);
 boxit e (btex e etex);
 drawboxed(a,b,c,d,e);
endfig;
beginfig(257)
let OLD_boxit = boxit;
let OLD_sizebox_ = sizebox_;
let OLD_clearb_ = clearb_;

vardef boxit@#(text tt) =
 beginbox_("boxpath_","sizebox_",@#,tt);
 generic_declare(pair) _n.sw, _n.s, _n.se, _n.e, _n.ne, _n.n, _n.nw, _n.w;
 0 = xpart (@#nw-@#sw) = ypart(@#se-@#sw);
 0 = xpart(@#ne-@#se) = ypart(@#ne-@#nw);
 @#s = .5[@#sw,@#se];
 @#n = .5[@#ne,@#nw];
 xpart @#w = xpart @#nw;
 xpart @#e = xpart @#ne;
 ypart @#w = ypart @#c = ypart @#e;
 @#ne-@#c = (@#dx,@#dy) +
            (xpart(.5*(urcorner pic_@# - llcorner pic_@#)), ypart urcorner pic_@#);
 @#c-@#sw = (@#dx,@#dy) +
            (xpart(.5*(urcorner pic_@# - llcorner pic_@#)), -ypart lrcorner pic_@#);
 endbox_(clearb_,@#);
enddef;

 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0));
 boxit a (btex a etex);
 boxit b (btex b etex);
 boxit c (btex c etex);
 boxit d (btex d etex);
 boxit e (btex e etex);
 drawboxed(a,b,c,d,e);
endfig;
beginfig(258)
 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0); b.ne - b.se = a.nw - a.sw);
 boxit a (btex a etex);
 boxit b (btex b etex);
 boxit c (btex c etex);
 boxit d (btex d etex);
 boxit e (btex e etex);
 drawboxed(a,b,c,d,e);
endfig;
beginfig(259)
vardef boxit@#(text tt) =
 beginbox_("boxpath_","sizebox_",@#,tt);
 generic_declare(pair) _n.sw, _n.s, _n.se, _n.e, _n.ne, _n.n, _n.nw, _n.w;
 0 = xpart (@#nw-@#sw) = ypart(@#se-@#sw);
 0 = xpart(@#ne-@#se) = ypart(@#ne-@#nw);
 @#s = .5[@#sw,@#se];
 @#n = .5[@#ne,@#nw];
 xpart @#w = xpart @#nw;
 xpart @#e = xpart @#ne;
 ypart @#w = ypart @#c = ypart @#e;
 @#ne-@#c = (@#dx,@#dyup) +
            (xpart(.5*(urcorner pic_@# - llcorner pic_@#)), ypart urcorner pic_@#);
 @#c-@#sw = (@#dx,@#dydown) +
            (xpart(.5*(urcorner pic_@# - llcorner pic_@#)), -ypart lrcorner pic_@#);
 endbox_(clearb_,@#);
enddef;

def sizebox_(suffix $) =
 if unknown $.dx: $.dx=defaultdx; fi
 if unknown $.dyup:
   if unknown $.dy:
     $.dyup=defaultdy
   else:
     $.dyup=$.dy
   fi;
 fi;
 if unknown $.dydown:
   if unknown $.dy:
     $.dydown=defaultdy
   else:
     $.dydown=$.dy
   fi;
 fi;
enddef;

vardef clearb_(suffix $) =
 _n_ := str $;
 generic_redeclare(numeric) _n.sw, _n.s, _n.se, _n.e, _n.ne, _n.n, _n.nw, _n.w,
   _n.c, _n.off, _n.dx, _n.dy, _n.dyup, _n.dy_down;
enddef;

 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0); ypart( b.ne - a.ne ) = 0; ypart( b.se - a.se ) = 0;);
 boxit a (btex a etex);
 boxit b (btex b etex);
 boxit c (btex c etex);
 boxit d (btex d etex);
 boxit e (btex e etex);
 drawboxed(a,b,c,d,e);
endfig;
beginfig(260)
 draw (0,0) -- (5cm,0) withcolor red;
 picture p;
 numeric h;
 p := btex b etex;
 h = ypart ( ulcorner p - llcorner p );
 boxjoin(
   b.c - a.c = (1cm,0);
   ypart( b.ne - a.ne ) = 0;
   ypart( a.ne - a.se ) = h+2defaultdy;
 );
 boxit a (btex a etex);
 boxit b (btex b etex);
 boxit c (btex c etex);
 boxit d (btex d etex);
 boxit e (btex e etex);
 drawboxed(a,b,c,d,e);
endfig;
beginfig(261)
 % Les lignes suivantes n'ont pas l'effet escompt�...
 let beginbox_ = OLD_beginbox_;
 let boxit     = OLD_boxit;
 let sizebox_  = OLD_sizebox_;
 let clearb_   = OLD_clearb_;

 % On recopie donc les d�finitions initiales des macros que l'on a modifi�es...
 extra_beginfig := "";
 extra_endfig   := "";
 input boxes;

 % Et on regarde sur un exemple si �a marche...
 draw (0,0) -- (5cm,0) withcolor red;
 boxjoin(b.c - a.c = (1cm,0));
 boxit a (btex a etex);
 boxit b (btex b etex);
 boxit c (btex c etex);
 boxit d (btex d etex);
 boxit e (btex e etex);
 drawboxed(a,b,c,d,e);
endfig;
beginfig(262)
 boxit.a1(btex $a$ etex);
 boxit.b1(btex etex);
 boxit.a2(btex $b$ etex);
 boxit.b2(btex etex);
 boxit.a3(btex $c$ etex);
 boxit.b3(btex etex);
 boxit.a4(btex $d$ etex);
 boxit.b4(btex etex);
 for i=1 upto 4:
   % Les boites a[i] et b[i] sont coll�es
   a[i].e = b[i].w;
   % Il y a un peu d'espace entre b[i] et a[i+1]
   b[i].e + (5mm,0) = a[i+1].w;
   % La hauteur des boites est la m�me
   a[i].n - a[i].s = a[i+1].n - a[i+1].s = b[i].n - b[i].s ;
   % Les b[i] ne sont pas tr�s larges
   b[i].e - b[i].w = (2mm,0);
 endfor;
 drawboxed(a1,b1,a2,b2,a3,b3,a4,b4);
 for i=1 upto 3:
   drawarrow b[i].c {up} .. a[i+1].c {down}
   cutafter bpath.a[i+1];
 endfor;
endfig;
beginfig(263)
 boxit.a(btex A etex);
 boxit.b(btex B etex);
 boxit.c(btex C etex);
 boxit.d(btex D etex);
 boxit.e(btex E etex);

 b.c-a.c = (1cm,0);
 c.c-b.c = (b.c-a.c) rotated 72;
 d.c-c.c = (c.c-b.c) rotated 72;
 e.c-d.c = (d.c-c.c) rotated 72;
 a.c-e.c = (e.c-d.c) rotated 72;
 b.c-a.c = (a.c-e.c) rotated 72;

 drawboxed(a,b,c,d,e);

 drawarrow a.c -- b.c cutbefore bpath.a cutafter bpath.b;
 drawarrow b.c -- c.c cutbefore bpath.b cutafter bpath.c;
 drawarrow c.c -- d.c cutbefore bpath.c cutafter bpath.d;
 drawarrow d.c -- e.c cutbefore bpath.d cutafter bpath.e;
 drawarrow e.c -- a.c cutbefore bpath.e cutafter bpath.a;
endfig;
beginfig(264)
 boxit.a(btex A etex);
 boxit.b(btex B etex);
 boxit.c(btex C etex);
 boxit.d(btex D etex);
 boxit.e(btex E etex);

 d.c = 1cm*up;
 e.c = 1cm*up rotated (1*72);
 a.c = 1cm*up rotated (2*72);
 b.c = 1cm*up rotated (3*72);
 c.c = 1cm*up rotated (4*72);

 drawunboxed(a,b,c,d,e);

 drawarrow a.c -- b.c cutbefore bpath.a cutafter bpath.b;
 drawarrow b.c -- c.c cutbefore bpath.b cutafter bpath.c;
 drawarrow c.c -- d.c cutbefore bpath.c cutafter bpath.d;
 drawarrow d.c -- e.c cutbefore bpath.d cutafter bpath.e;
 drawarrow e.c -- a.c cutbefore bpath.e cutafter bpath.a;
endfig;
beginfig(265)
 def linkboxes(suffix a,b) =
   drawarrow a.c -- b.c cutbefore bpath.a cutafter bpath.b;
 enddef;

 boxit.a(btex A etex);
 boxit.b(btex B etex);
 boxit.c(btex C etex);
 boxit.d(btex D etex);
 boxit.e(btex E etex);

 d.c = 1cm*up;
 e.c = 1cm*up rotated (1*72);
 a.c = 1cm*up rotated (2*72);
 b.c = 1cm*up rotated (3*72);
 c.c = 1cm*up rotated (4*72);

 drawunboxed(a,b,c,d,e);

 linkboxes(a,b);
 linkboxes(b,c);
 linkboxes(c,d);
 linkboxes(d,e);
 linkboxes(e,a);
endfig;
beginfig(266)
 boxit a(btex Essai etex);
 fill bpath a withcolor .5[red,white];
 drawboxed(a);

endfig;
beginfig(267)
 def drawredboxed(text t) =
   forsuffixes a=t:
     fill bpath a withcolor .5[red,white];
   endfor;
   drawboxed(t);
 enddef;

 circleit.a(btex D�but etex);
 a.c = (0,0);
 a.dx = a.dy;
 circleit.b(btex Fin etex);
 b.c = (2cm,0);
 b.dx = b.dy;
 drawredboxed(a,b);
 drawarrow  a.c {dir 45} .. b.c {dir -45}
 cutbefore bpath.a cutafter bpath.b;
 drawarrow  b.c {dir -135} .. a.c {dir 135}
 cutbefore bpath.b cutafter bpath.a;

endfig;
beginfig(268)
 def drawcoloredboxed(expr c)(text t) =
   forsuffixes a=t:
     fill bpath a withcolor c;
   endfor;
   drawboxed(t);
 enddef;

 circleit.a(btex D�but etex);
 a.c = (0,0);
 a.dx = a.dy;
 circleit.b(btex Fin etex);
 b.c = (2cm,0);
 b.dx = b.dy;
 drawcoloredboxed(.5[red,white],  a);
 drawcoloredboxed(.5[blue,white], b);
 drawarrow  a.c {dir 45} .. b.c {dir -45}
 cutbefore bpath.a cutafter bpath.b;
 drawarrow  b.c {dir -135} .. a.c {dir 135}
 cutbefore bpath.b cutafter bpath.a;

endfig;
beginfig(269)
def begindiag =
 begingroup;
 save _diag_x, _diag_x_max, _diag_y, _diag_y_max, _diag;
 numeric _diag_x, _diag_x_max, _diag_y, _diag_y_max;
 string _diag[][];
 % Num�ro de ligne et de colonne courrants
 _diag_x = -1; _diag_y = 0;
 % Num�ro de ligne et de colonne maximaux
 _diag_x_max = _diag_y_max = 0;
 save _diag_ar_n, _diag_ar_source, _diag_ar_but, _diag_ar_up, _diag_ar_down;
 % Nombre de fl�ches
 numeric _diag_ar_n; _diag_ar_n=-1;
 % Source et but de la fl�che
 pair _diag_ar_source[], _diag_ar_but[];
 % Ce qu'il faut �crire au dessus ou au dessous
 string _diag_ar_up[], _diag_ar_down[];
 save _diag_ar_curved, _diag_ar_shape, _diag_ar_color, _diag_ar_width;
 % � courbure � (c'est une distance)
 numeric _diag_ar_curved[];
 % Forme de la fl�che
 string _diag_ar_shape[];
 % Couleur, �paisseur, pointill�s
 color _diag_ar_color[];
 numeric _diag_ar_width[];
 picture _diag_ar_dashed[];
enddef;

def node expr A =
 _diag_x := _diag_x + 1;
 _diag_x_max := max(_diag_x,_diag_x_max);
 _diag[_diag_x][_diag_y] := A;
enddef;

def nextline =
 _diag_x := -1;
 _diag_y := _diag_y + 1;
 _diag_y_max := max(_diag_y, _diag_y_max);
enddef;

tertiarydef a => b = a, b enddef;
def even (expr a) = not odd(a) enddef;

vardef rarrowto(expr a,b)(text t) =
 save i,p;
 _diag_ar_n := _diag_ar_n + 1;
 _diag_ar_source[_diag_ar_n] = (_diag_x, _diag_y);
 _diag_ar_but[_diag_ar_n] = (_diag_x + a, _diag_y + b);

 numeric i; i:=0;
 string current;
 for p=t:
   if even(i):
     current := p;
   else:
     if current = "above":
       _diag_ar_up[_diag_ar_n] = p;
     elseif current = "below":
       _diag_ar_down[_diag_ar_n] = p;
     elseif current = "shape":
       _diag_ar_shape[_diag_ar_n] = p;
     elseif current = "curved":
       _diag_ar_curved[_diag_ar_n] = p;
     elseif current = "color":
       _diag_ar_color[_diag_ar_n] = p;
     elseif current = "width":
       _diag_ar_width[_diag_ar_n] = p;
     elseif current = "dashed":
       _diag_ar_dashed[_diag_ar_n] = p;
     else:
       errmessage("rarrowto: Wrong argument "&ditto&current&ditto);
     fi;
   fi;
   i := i + 1;
 endfor;
 if odd i:
   errmessage("rarrowto: Odd number of arguments "&decimal(i));
 fi;
enddef;

%% Les t�tes de fl�ches

picture withsmalldots, notdashed;
withsmalldots := withdots scaled .3;
notdashed := dashpattern(on 50cm);

vardef diag_arrow_head (expr p, t) =
 save A,B,C,u; pair A,B,C,u;
 B := point t of p;
 u := -unitvector(direction t of p);
 A := B + ahlength*u rotated(-ahangle);
 C := B + ahlength*u rotated(+ahangle);
 A .. {-u} B {u} .. C
enddef;

vardef diag_arrow_bar (expr p, t) =
 save A,B,C,u; pair A,B,C,u;
 B := point t of p;
 u := unitvector(direction t of p);
 A := B + ahlength*sind(ahangle)*u rotated(90);
 C := B + ahlength*sind(ahangle)*u rotated(-90);
 A .. B .. C
enddef;

%% Les fl�ches

def diag_draw_arrow_default(suffix a,b)(expr curved, w, col, dash) =
 p = a.c ..
 (1/2 [a.c,b.c] + curved*unitvector(b.c-a.c) rotated 90)
 .. b.c;
 pp := p cutbefore bpath.a cutafter bpath.b;
 draw pp
   withcolor col withpen pencircle scaled w dashed dash;
 draw diag_arrow_head (pp, length(pp))
   withcolor col withpen pencircle scaled w;
enddef;

def diag_draw_arrow_middle(suffix a,b)(expr curved, w, col, dash) =
 p = a.c ..
 (1/2 [a.c,b.c] + curved*unitvector(b.c-a.c) rotated 90)
 .. b.c;
 pp := p cutbefore bpath.a cutafter bpath.b;
 draw pp
   withcolor col withpen pencircle scaled w dashed dash;
 draw diag_arrow_head(p,1)
   withcolor col withpen pencircle scaled w;
enddef;

def diag_draw_arrow_epi(suffix a,b)(expr curved, w, col, dash) =
 p = a.c ..
 (1/2 [a.c,b.c] + curved*unitvector(b.c-a.c) rotated 90)
 .. b.c;
 pp := p cutbefore bpath.a cutafter bpath.b;
 draw pp
   withcolor col withpen pencircle scaled w dashed dash;
 draw diag_arrow_head (pp, length(pp))
   withcolor col withpen pencircle scaled w;
 path ppp;
 ppp := pp cutafter (fullcircle scaled 1mm shifted point length(pp) of pp);
 draw diag_arrow_head(ppp, length(ppp))
   withcolor col withpen pencircle scaled w;
enddef;

def diag_draw_arrow_mono(suffix a,b)(expr curved, w, col, dash) =
 p = a.c ..
 (1/2 [a.c,b.c] + curved*unitvector(b.c-a.c) rotated 90)
 .. b.c;
 pp := p cutbefore bpath.a cutafter bpath.b;
 path ppp;
 ppp := pp cutbefore (fullcircle scaled 1mm shifted point 0 of pp);
 draw ppp
   withcolor col withpen pencircle scaled w dashed dash;
 draw diag_arrow_head (pp, length(pp))
   withcolor col withpen pencircle scaled w;
 draw diag_arrow_head(ppp, 0)
   withcolor col withpen pencircle scaled w;
enddef;

vardef diag_draw_arrow_inj(suffix a,b)(expr curved, w, col, dash) =
 p = a.c ..
 (1/2 [a.c,b.c] + curved*unitvector(b.c-a.c) rotated 90)
 .. b.c;
 pp := p cutbefore bpath.a cutafter bpath.b;
 path ppp;
 ppp := pp cutbefore (fullcircle scaled 1mm shifted point 0 of pp);
 draw ppp
   withcolor col withpen pencircle scaled w dashed dash;
 draw diag_arrow_head (pp, length(pp))
   withcolor col withpen pencircle scaled w;
 save u,A,B,C;
 pair u,A,B,C;
 A := point 0 of ppp;
 u := unitvector(direction 0 of ppp);
 B := A + ahlength*(-u) rotated (-ahangle);
 C := A + 2 ahlength*sind(ahangle)*u rotated 90;
 draw C {-u} .. B .. A {u}
 withcolor col withpen pencircle scaled w dashed dash;
enddef;

def diag_draw_arrow_mapsto(suffix a,b)(expr curved, w, col, dash) =
 p = a.c ..
 (1/2 [a.c,b.c] + curved*unitvector(b.c-a.c) rotated 90)
 .. b.c;
 pp := p cutbefore bpath.a cutafter bpath.b;
 draw pp
   withcolor col withpen pencircle scaled w dashed dash;
 draw diag_arrow_head (pp, length(pp))
   withcolor col withpen pencircle scaled w;
 draw diag_arrow_bar (pp, 0)
   withcolor col withpen pencircle scaled w;
enddef;

def diag_draw_arrow_half_dotted(suffix a,b)(expr curved, w, col, dash) =
 p = a.c ..
 (1/2 [a.c,b.c] + curved*unitvector(b.c-a.c) rotated 90)
 .. b.c;
 pp := p cutbefore bpath.a cutafter bpath.b;
 draw subpath(0,1) of pp
   withcolor col withpen pencircle scaled w dashed withsmalldots;
 draw subpath(1,2) of pp
   withcolor col withpen pencircle scaled w;
 draw diag_arrow_head (pp, length(pp))
   withcolor col withpen pencircle scaled w;
enddef;

%% Fin des fl�ches

def color_to_string (expr a) =
 "("&
   decimal(redpart a)
   &","&
   decimal(greenpart a)
   &","&
   decimal(bluepart a)
   &")"
enddef;

def enddiag =
 save i,j,k,l,mm,a,A,p,b;
 for i=0 upto _diag_x_max:
   for j=0 upto _diag_y_max:
     if known _diag[i][j]:
       circleit.a[i][j]( _diag[i][j] );
       a[i][j].dx = a[i][j].dy;
       a[i][j].c = 1cm * (i,-j);
       drawunboxed( a[i][j] );
     fi;
   endfor;
 endfor;
 for m=0 upto _diag_ar_n:
   % V�rifier que le but existe
   i := xpart _diag_ar_source[m];
   j := ypart _diag_ar_source[m];
   k := xpart _diag_ar_but[m];
   l := ypart _diag_ar_but[m];

   % On trace la fl�che. Le chemin est mis dans la variable p.
   path p,pp;
   if unknown _diag_ar_shape[m]:  _diag_ar_shape[m]  := "default" fi;
   if unknown _diag_ar_color[m]:  _diag_ar_color[m]  := black     fi;
   if unknown _diag_ar_width[m]:  _diag_ar_width[m]  := .5bp      fi;
   if unknown _diag_ar_curved[m]: _diag_ar_curved[m] := 0         fi;
   if unknown _diag_ar_dashed[m]: _diag_ar_dashed[m] := notdashed fi;
   % On ne peut PAS utiliser m dans une cha�ne ce caract�res que l'on donne
   % � scantokens, car m est une variable de boucle. C'est vraiment sp�cial,
   % une variable de boucle.
   mm := m;
   scantokens(
     "diag_draw_arrow_"& _diag_ar_shape[m]
     &"("
       &"a[i][j], a[k][l],_diag_ar_curved[mm],_diag_ar_width[mm],"
       &"_diag_ar_color[mm],_diag_ar_dashed[mm]"
       &");"
     );

   % On �crit des choses au dessus ou au dessous des fl�ches
   pair A;
   A = point 1/2 length(p) of p;
   if known _diag_ar_up[m]:
     boxit.b[m](_diag_ar_up[m]);
     b[m].c = A + 4bp*unitvector(direction 1/2 length(p) of p rotated 90);
     drawunboxed(b[m]);
   fi;
   if known _diag_ar_down[m]:
     boxit.c[m](_diag_ar_down[m]);
     c[m].c = A + 4bp*unitvector(direction 1/2 length(p) of p rotated -90);
     drawunboxed(c[m]);
   fi;
 endfor;
 endgroup;
enddef;

 begindiag;
   node "A";
     rarrowto(1,0, "above" => "a",
              "shape" => "middle",
              "curved" => 3mm,
              "dashed" => withsmalldots);
     rarrowto(0,1, "below" => "b",
              "color" => blue,
              "shape" => "mapsto",
              "dashed" => evenly);
   node "A";
     rarrowto(1,0, "above" => "c", "width" => 1bp, "shape" => "inj");
     rarrowto(0,1, "below" => "d", "shape" => "mono");
   node "A";
   nextline;
   node "A";
     rarrowto(1,0, "below" => "e", "shape" => "epi");
   node "A";
     rarrowto(1,-1, "below" => "f", "curved" => -3mm, "shape" => "half_dotted");
 enddiag;
endfig;
beginfig(270)
   draw begingraph(3cm,2cm)
     gdraw "data1";
   endgraph;

endfig;
beginfig(271)
 draw begingraph(3cm,2cm)
   gdraw "data1" withpen pencircle scaled 2bp;
 endgraph;
endfig;
beginfig(272)
 draw begingraph(3cm,2cm)
   gdraw "data1" dashed evenly;
 endgraph;
endfig;
beginfig(273)
 draw begingraph(3cm,2cm)
   gdraw "data1" withcolor red;
 endgraph;
endfig;
beginfig(274)
 draw begingraph(3cm,2cm)
   gdraw "data1" withpen pencircle scaled 2bp;
   gdraw "data2" ;
 endgraph;
endfig;
beginfig(275)
 draw begingraph(3cm,2cm)
   gdraw "data1" ;
   gdraw "data2" dashed evenly;
   gdraw "data3" dashed withdots;
 endgraph;
endfig;
beginfig(276)
 draw begingraph(3cm,2cm)
   gdraw "data1" withcolor red;
   gdraw "data2" withcolor blue;
 endgraph;
endfig;
beginfig(277)
   draw begingraph(3cm,2cm)
     gdraw "data1" plot btex $\bullet$ etex;
   endgraph;

endfig;
beginfig(278)
 picture gros_point;
 draw (0,0) withpen pencircle scaled 4bp;
 gros_point := currentpicture;
 currentpicture := nullpicture;
 draw begingraph(3cm,2cm)
   gdraw "data1" plot gros_point;
 endgraph;
endfig;
beginfig(279)
 picture gros_point;
 gros_point := nullpicture;
 addto gros_point doublepath (0,0)
       withpen pencircle scaled 4bp;
 draw begingraph(3cm,2cm)
   gdraw "data1" plot gros_point;
 endgraph;
endfig;
beginfig(280)
 picture croix;
 croix := nullpicture;
 addto croix doublepath (-2bp,2bp)--(2bp,-2bp)
             withpen pencircle scaled 1bp;
 addto croix doublepath (-2bp,-2bp)--(2bp,2bp)
             withpen pencircle scaled 1bp;
 picture gros_carre;
 gros_carre := nullpicture;
 addto gros_carre contour unitsquare shifted (-.5,-.5) scaled 2bp;

 draw begingraph(3cm,2cm)
   gdraw "data1";
   gdraw "data1" plot croix;
   gdraw "data2";
   gdraw "data2" plot gros_carre;
 endgraph;
endfig;
beginfig(281)
   draw begingraph(3cm,2cm)
     gdata("data1",
           v,
           glabel(gros_point, v1, v2);
          );
   endgraph;

endfig;
beginfig(282)
   draw begingraph(3cm,2cm)
     path p;
     gdata("data1",
           v,
           augment.p(v1,v2);
          );
     gdraw p;
   endgraph;

endfig;
beginfig(283)
 interim linecap := squared;
 interim linejoin := mitered;
 draw begingraph(3cm,2cm)
   path p;
   gdata("data1",
     v,
     augment.p(v1,v2);
     );
   gdraw p withpen pencircle scaled 2bp;
   gdraw p withpen pencircle scaled 1bp withcolor .8white;
 endgraph;
endfig;
beginfig(284)
 draw begingraph(3cm,2cm)
   gdata("data1",
         v,
         path p;
         augment p (v1,0);
         augment p (v1,v2);
         gdraw p;
        );
 endgraph;
endfig;
beginfig(285)
 draw begingraph(3cm,2cm)
   gdata("data1",
         v,
         path p;
         augment p (v1,0);
         augment p (v1,v2);
         gdraw p withpen pencircle scaled 4bp;
        );
 endgraph;
endfig;
beginfig(286)
 interim linecap:=2;
 draw begingraph(3cm,2cm)
   gdata("data1",
         v,
         path p;
         augment p (v1,0);
         augment p (v1,v2);
         gdraw p withpen pencircle scaled 4bp;
        );
 endgraph;
endfig;
beginfig(287)
 draw begingraph(3cm,2cm)
   gdata("data1", v,
         path p;
         augment p (v1,0);
         augment p (v1,v2);
         augment p (v1 Sadd "1",v2);
         augment p (v1 Sadd "1",0);
         gdraw p--cycle;
        );
 endgraph;
endfig;
beginfig(288)
 draw begingraph(3cm,2cm)
   gdata("data1", v,
         path p;
         augment p (v1,0);
         augment p (v1,v2);
         augment p (v1 Sadd "1",v2);
         augment p (v1 Sadd "1",0);
         gfill p--cycle withcolor .8white;
         gdraw p--cycle;
         );
 endgraph;
endfig;
beginfig(289)
 draw begingraph(3cm,2cm)
   gdata("data1", v,

           % Le dessus
           path p;
           augment p (v1,v2);
           augment p (v1 Sadd "1",v2);
           augment p (v1 Sadd "1.5", v2 Sadd "10");
           augment p (v1 Sadd ".5",  v2 Sadd "10");
           gfill p--cycle withcolor white;
           gdraw p--cycle;

           % Le c�t�
           path p;
           augment p (v1 Sadd "1",0);
           augment p (v1 Sadd "1",v2);
           augment p (v1 Sadd "1.5", v2 Sadd "10");
           augment p (v1 Sadd "1.5", "10");
           gfill p--cycle withcolor .5white;
           gdraw p--cycle;

           % Le devant
           path p;
           augment p (v1,0);
           augment p (v1,v2);
           augment p (v1 Sadd "1",v2);
           augment p (v1 Sadd "1",0);
           gfill p--cycle withcolor .8white;
           gdraw p--cycle;

          );
endgraph;
endfig;
beginfig(290)
 draw begingraph(3cm,2cm)
   path p,q;
   gdata("data1", v,
         augment.p(v1,v2);
        );
   q:= (xpart point 0 of p, 0) -- p --
     (xpart point length(p) of p, 0) -- cycle;
   gfill q withcolor .8white;
   gdraw p withpen pencircle scaled 2bp;
 endgraph;
endfig;
beginfig(291)
 draw begingraph(3cm,2cm)
   gdata("data1",
     v,
     path p;
     augment p ("0", i);
     augment p (v2, i);
     augment p (v2, i Sadd ".5");
     augment p (0, i Sadd ".5");
     gfill p--cycle withcolor .8white;
     gdraw p--cycle;
     );
   autogrid(otick.bot,);
 endgraph;
endfig;
beginfig(292)
   draw begingraph(3cm,2cm)
     gdraw "data1";
     glabel.bot(btex Abscisse etex, OUT);
     glabel.lft(btex Ordonn�e etex, OUT);
   endgraph;

endfig;
beginfig(293)
   draw begingraph(3cm,2cm)
     gdraw "data1" withcolor red;
     glabel.lft(btex 1 etex, 8);
     gdraw "data2" withcolor blue;
     glabel.bot(btex 2 etex, 9);
   endgraph;

endfig;
beginfig(294)
 draw begingraph(3cm,2cm)
   gdraw "data1";
   glabel.bot(btex Abscisse etex, OUT);
   glabel.lft(btex Ordonn�e etex rotated 90, OUT);
 endgraph;
endfig;
beginfig(295)
 % La l�gende
 color couleur[];
 couleur[0] := red;
 couleur[1] := green;
 couleur[2] := blue;
 picture p[], legende;
 legende := nullpicture;
 for i=0 upto 2:
   p[i] := nullpicture;
   addto p[i] also TEX("Courbe " & decimal(i+1))
              withcolor couleur[i];
   addto legende doublepath ( (0,0)--(5mm,0) )
                 shifted (0, -5mm*i)
                 withpen currentpen withcolor couleur[i];
   addto legende also p[i]
                 shifted 1/2(lrcorner p[i] - ulcorner p[i])
                 shifted (0, -5mm*i);
 endfor;
 % Les courbes
 draw begingraph(3cm,2cm)
   for i=1 upto 3:
     gdraw "data" & decimal(i) withcolor couleur[i-1];
   endfor;
   glabel.top(legende,OUT);
 endgraph;
endfig;
beginfig(296)
   draw begingraph(3cm,2cm)
     setcoords(-linear,log);
     gdraw "data1";
   endgraph;

endfig;
beginfig(297)
 draw begingraph(3cm,2cm)
   gdraw "data1";
 endgraph;

endfig;
beginfig(298)
 draw begingraph(3cm,2cm)
   setrange( (whatever,0), (whatever,whatever) );
   gdraw "data1";
 endgraph;

endfig;
beginfig(299)
 draw begingraph(3cm,2cm)
   setrange(whatever, 0, whatever, whatever);
   gdraw "data1";
 endgraph;

endfig;
beginfig(300)
vardef TEX primary s =
  write "verbatimtex"                    to "mptextmp.mp";
  write "\documentclass[12pt]{article}"  to "mptextmp.mp";
  write "\usepackage[T1]{fontenc}"       to "mptextmp.mp";
  write "\usepackage{amsmath,amssymb}"   to "mptextmp.mp";
  write "\begin{document}"               to "mptextmp.mp";
  write "etex"                           to "mptextmp.mp";
  write "btex "&s&" etex"                to "mptextmp.mp";
  write EOF                              to "mptextmp.mp";
  scantokens "input mptextmp"
enddef;
  vardef mylabel(expr pic, p, t) =
    save A; pair A;
    A = point t of p +
        8bp * unitvector(direction t of p) rotated 90;
    label(pic, A);
  enddef;
  path p; u:=1cm;
  p = (0,0)..(-u,u)..(u,u);
  draw p;
  for i=0 step .2 until length(p):
    draw point i of p withpen pencircle scaled 4bp;
    mylabel(TEX("$"&decimal(round(5*i))&"$"),p,i);
  endfor;

endfig;
beginfig(301)
  path p;
  p := subpath(1,3) of fullcircle scaled 2cm;
  interim linejoin := mitered;
  interim linecap := butt;

  interim ahangle := 30;
  drawarrow p withpen pencircle scaled 2bp;

  interim ahangle := 45;
  drawarrow p shifted (0,-5mm) withpen pencircle scaled 2bp;

  interim ahangle := 60;
  drawarrow p shifted (0,-10mm) withpen pencircle scaled 2bp;

endfig;
beginfig(302)
  path p;
  p := subpath(1,3) of fullcircle scaled 2cm;
  interim linejoin := mitered;
  interim linecap := butt;
  interim ahangle := 30;

  interim ahlength := 2bp;
  drawarrow p withpen pencircle scaled 2bp;

  interim ahlength := 4bp;
  drawarrow p shifted (0,-5mm) withpen pencircle scaled 2bp;

  interim ahlength := 6bp;
  drawarrow p shifted (0,-10mm) withpen pencircle scaled 2bp;

endfig;
beginfig(303)
  draw TEX( "Nous sommes le "&
            decimal(day)   &"/"&
            decimal(month) &"/"&
            decimal(year) &"."    );

endfig;
beginfig(304)
  path p;
  p := (0,0) -- (2cm,0);
  def doit (suffix p)(expr t) =
    begingroup
      interim linecap := t;
      draw p withpen pencircle scaled 5mm withcolor .8white;
    endgroup;
    draw point 0 of p withpen pencircle scaled 4bp;
    draw point 1 of p withpen pencircle scaled 4bp;
    p := p shifted (0,-7mm)
  enddef;
  doit(p,rounded);
  doit(p,butt);
  doit(p,squared);

endfig;
beginfig(305)
  path p;
  p := (0,0) -- (1cm,5mm) -- (2cm,0);
  def doit (suffix p)(expr t) =
    begingroup
      interim linejoin := t;
      draw p withpen pencircle scaled 5mm withcolor .8white;
    endgroup;
    draw point 0 of p withpen pencircle scaled 4bp;
    draw point 1 of p withpen pencircle scaled 4bp;
    draw point 2 of p withpen pencircle scaled 4bp;
    p := p shifted (0,-7mm)
  enddef;
  doit(p,rounded);
  doit(p,mitered);
  doit(p,beveled);

endfig;
bye;