summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-05-23 00:01:24 +0000
committerKarl Berry <karl@freefriends.org>2009-05-23 00:01:24 +0000
commit002586642116a741d40c197b07191c63515d35dd (patch)
treebcc824fc6046261ea3a69af08d34b6cdf8570cae /Master/texmf-dist/doc
parent8518c1ff40dd53799254c0b0f88a6a8ae85173e6 (diff)
move metapost docs out of texmf-doc
git-svn-id: svn://tug.org/texlive/trunk@13402 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc')
-rw-r--r--Master/texmf-dist/doc/metapost/metapost-examples/Makefile21
-rw-r--r--Master/texmf-dist/doc/metapost/metapost-examples/README21
-rw-r--r--Master/texmf-dist/doc/metapost/metapost-examples/data111
-rw-r--r--Master/texmf-dist/doc/metapost/metapost-examples/data211
-rw-r--r--Master/texmf-dist/doc/metapost/metapost-examples/data311
-rw-r--r--Master/texmf-dist/doc/metapost/metapost-examples/examples.mp4896
-rw-r--r--Master/texmf-dist/doc/metapost/metapost-examples/mp2html.pl170
7 files changed, 5141 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/metapost/metapost-examples/Makefile b/Master/texmf-dist/doc/metapost/metapost-examples/Makefile
new file mode 100644
index 00000000000..f2300310718
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/metapost-examples/Makefile
@@ -0,0 +1,21 @@
+METAPOST = mpost --interaction=nonstopmode
+
+all:
+ perl mp2html.pl
+
+old_all:
+ TEX=latex $(METAPOST) examples.mp
+
+clean:
+ rm -f examples.[0-9] examples.[0-9][0-9] examples.[0-9][0-9][0-9] *.mps
+ rm -f examples.tex examples.ps examples.dvi examples.pdf
+ rm -f *.dvi *.aux *.log *\~
+ rm -f mpxerr.* *.mpx mptextmp.*
+ rm -f nohup.out
+
+cleanse: clean
+ rm -f examples.[0-9].gif examples.[0-9][0-9].gif examples.[0-9][0-9][0-9].gif
+ rm -f examples.[0-9].eps examples.[0-9][0-9].eps examples.[0-9][0-9][0-9].eps
+ rm -f examples.[0-9].ps examples.[0-9][0-9].ps examples.[0-9][0-9][0-9].ps
+ rm -f examples.[0-9].tex examples.[0-9][0-9].tex examples.[0-9][0-9][0-9].tex
+ rm -f examples.html
diff --git a/Master/texmf-dist/doc/metapost/metapost-examples/README b/Master/texmf-dist/doc/metapost/metapost-examples/README
new file mode 100644
index 00000000000..a884163d656
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/metapost-examples/README
@@ -0,0 +1,21 @@
+These are a few (hundred) example pictures drawn with
+metapost, ranging from very simple (lines and circles)
+to rather intricate (uncommon geometric transformations,
+fractals, bitmap, etc.).
+
+README this file
+data1 sample data file (for plot drawings)
+data2
+data3
+examples.mp The examples
+mptohtml.pl A perl script that turns the examples into a PostScript
+ file and into an HTML file and GIF pictures
+ The resulting (huge) Web page may be seen here:
+ http://www.math.jussieu.fr/~zoonek/LaTeX/Metapost/metapost.html
+Makefile runs the above script
+
+Vincent Zoonekynd <zoonek@math.jussieu.fr>
+August 1999
+Updated august 2001
+Version 0.01
+Distributed under the GPL (see http://www.gnu.org/copyleft/gpl.html for details)
diff --git a/Master/texmf-dist/doc/metapost/metapost-examples/data1 b/Master/texmf-dist/doc/metapost/metapost-examples/data1
new file mode 100644
index 00000000000..24092f087bb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/metapost-examples/data1
@@ -0,0 +1,11 @@
+0 82
+1 90
+2 100
+3 97
+4 70
+5 75
+6 93
+7 103
+8 115
+9 121
+10 119
diff --git a/Master/texmf-dist/doc/metapost/metapost-examples/data2 b/Master/texmf-dist/doc/metapost/metapost-examples/data2
new file mode 100644
index 00000000000..c934e72a70b
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/metapost-examples/data2
@@ -0,0 +1,11 @@
+0 100
+1 95
+2 85
+3 80
+4 83
+5 90
+6 88
+7 96
+8 99
+9 100
+10 105
diff --git a/Master/texmf-dist/doc/metapost/metapost-examples/data3 b/Master/texmf-dist/doc/metapost/metapost-examples/data3
new file mode 100644
index 00000000000..7e54a066ff7
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/metapost-examples/data3
@@ -0,0 +1,11 @@
+0 125
+1 119
+2 123
+3 104
+4 81
+5 94
+6 90
+7 88
+8 85
+9 89
+10 90
diff --git a/Master/texmf-dist/doc/metapost/metapost-examples/examples.mp b/Master/texmf-dist/doc/metapost/metapost-examples/examples.mp
new file mode 100644
index 00000000000..7a156f03deb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/metapost-examples/examples.mp
@@ -0,0 +1,4896 @@
+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;
diff --git a/Master/texmf-dist/doc/metapost/metapost-examples/mp2html.pl b/Master/texmf-dist/doc/metapost/metapost-examples/mp2html.pl
new file mode 100644
index 00000000000..143e2314e0a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/metapost-examples/mp2html.pl
@@ -0,0 +1,170 @@
+#! perl -w
+
+#
+# Builds an HTML file and a bunch of GIF files from a Metapost file
+# Also creates a PS file
+#
+# (c) Vincent Zoonekynd <zoonek@math.jussieu.fr>
+# August 1999
+# modified in august 2001
+# distributed under the GPL
+#
+
+$main = $ARGV[0] || "examples";
+$main =~ s/\.mp$//i;
+
+# On crée les images GIF
+# BUG : à chaque fois qu'il y a des fontes, ça plante.
+# C'est normal pour deux raisons :
+# - si j'utilisais prologuse:=2, il ne trouverait pas les fontes.
+# - Comme j'utilise prologues:=0, c'est encore pire...
+# L'idéal serait de créer un fichier LaTeX pour chaque fichier postscript,
+# de lancer later puis dvips dessus et de récupérer le fichier postscript.
+
+# 1. Compile the examples
+
+system "TEX=latex mpost --interaction=nonstopmode $main";
+
+# 2. Create a LaTeX file encompassing the examples and compile it
+
+open(LATEX,'>', "$main.tex") || die "Cannot open examples.tex for writing: $!";
+print LATEX '\documentclass[a4paper]{article}' ."\n";
+print LATEX '\usepackage{graphicx}' ."\n";
+print LATEX '\begin{document}' ."\n";
+print LATEX '\begin{verbatim}' ."\n";
+open(MP, "<", "$main.mp") || die "cannot open $main.mp for reading: $!";
+while(<MP>){
+ if (m/^\s*beginfig\s*\((.*)\)/) {
+ print LATEX '\end{verbatim}' . "\n";
+ print LATEX "\\includegraphics{${main}_$1.mps}\n";
+ print LATEX '\begin{verbatim}' . "\n";
+ print LATEX $_;
+ } elsif (m/^\s*endfig/) {
+ print LATEX $_;
+ print LATEX '\end{verbatim}' ."\n";
+ print LATEX '\hrulefill' . "\n";
+ print LATEX '\begin{verbatim}' . "\n";
+ } else {
+ print LATEX $_;
+ }
+}
+print LATEX '\end{verbatim}' . "\n";
+print LATEX '\end{document}' ."\n";
+close MP;
+close LATEX;
+
+opendir(DIR,"./") || die "Cannot open ./ directory for reading : $!";
+foreach $file (readdir DIR) {
+ if ($file =~ m/^$main.[0-9]+$/) {
+ my $new = $file;
+ $new =~ s/\./_/g;
+ $new .= ".mps";
+ symlink $file, $new;
+ }
+}
+closedir(DIR);
+
+system "latex --interaction=nonstopmode $main.tex";
+system "dvips -o $main.ps $main.dvi";
+#system "pdflatex --interaction=nonstopmode $main.tex";
+
+# 3. Create the GIF pictures
+
+opendir(DIR,"./") || die "Cannot open ./ directory for reading : $!";
+foreach $file (readdir DIR) {
+ if ($file =~ m/^$main.[0-9]+$/) {
+
+ ## Création du fichier PS
+ symlink "$file", "$file.eps";
+ open(TEX,">$file.tex") || die "cannot open $file.tex for writing : $!";
+ print TEX '\nonstopmode' ."\n" ;
+ print TEX '\documentclass[a4paper,10pt]{article}' ."\n" ;
+ print TEX '\usepackage[T1]{fontenc}\usepackage[latin1]{inputenc}' ."\n" ;
+ print TEX '\usepackage{graphicx,amsmath,amssymb}' ."\n" ;
+ print TEX '\pagestyle{empty}' ."\n" ;
+ print TEX '\begin{document}' ."\n" ;
+ print TEX '\includegraphics{'. "$file.eps" .'}' ."\n" ;
+ print TEX '\end{document}' ."\n" ;
+ close TEX;
+ system "latex $file.tex";
+ system "dvips -E -f $file.dvi -o $file.ps";
+
+ ## Transformation en GIF
+ my ($bbx,$bby,$bbw,$bbh);
+ open(PS,"$file.ps");
+ while (<PS>) {
+ if (/^%%BoundingBox:\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)/) {
+ $bbx = 0-$1; $bby = 0-$2;
+ $bbw = $3+$bbx; $bbh = $4+$bby;
+# print "*** Seen BBOX\n";
+ }
+ last if /^%%EndComments/;
+ }
+ close(PS);
+
+ my $scale = 3;
+ my $density = 72*$scale;
+ $bbw = $scale * $bbw;
+ $bbh = $scale * $bbh;
+# print "*** gs -q -dNOPAUSE -dNO_PAUSE -sDEVICE=ppmraw -g${bbw}x${bbh} -r$density -sOutputFile=$file.ppm\n";
+ open(GS, "|gs -q -dNOPAUSE -dNO_PAUSE -sDEVICE=ppmraw -g${bbw}x${bbh} -r$density -sOutputFile=$file.ppm");
+ print GS "$bbx $bby translate\n";
+ print GS "($file.ps) run\n";
+ print GS "showpage\n";
+ print GS "quit\n";
+ close(GS);
+
+ system("pnmcrop $file.ppm | ppmquant 256 | ppmtogif > $file.gif");
+
+ unlink "$file.ppm";
+ }
+}
+
+
+# 4. Create the HTML file
+open(MP,"$main.mp") || die "cannot open $main.mp for reading: $!";
+open(HTML,">$main.html") || die "cannot open $main.html for writing: $!";
+select HTML;
+print "<HTML><HEAD><TITLE>Metapost : exemples</TITLE></HEAD><BODY>\n";
+print "<H1> Métapost : exemples </H1>\n";
+print "<HR><PRE>\n";
+while(<MP>){
+ if (m/^\s*beginfig\s*\((.*)\)/) {
+ print "</PRE><IMG SRC=\"$main.$1.gif\"><PRE>\n";
+ print ;
+ } elsif (m/^\s*endfig/) {
+ print;
+ print "</PRE><HR><PRE>\n";
+ } else {
+ print;
+ }
+}
+print "</PRE>\n";
+print "</BODY></HTML>\n";
+close HTML;
+close MP;
+
+# 5. Remove unnecessary files
+
+opendir(DIR,"./") || die "Cannot open ./ directory for reading : $!";
+foreach $file (readdir DIR) {
+ if ($file =~ m/^$main.[0-9]+$/) {
+ unlink $file;
+ unlink "$file.tex";
+ unlink "$file.dvi";
+ unlink "$file.aux";
+ unlink "$file.log";
+ unlink "$file.eps";
+ unlink "$file.ps";
+ my $new = $file;
+ $new =~ s/\./_/g;
+ $new .= ".mps";
+ unlink $new;
+ } elsif( $file =~ m/\.mpx$/ ) {
+ unlink $file;
+ }
+}
+closedir DIR;
+unlink "$main.aux";
+unlink "$main.log";
+