diff options
author | Karl Berry <karl@freefriends.org> | 2009-05-23 00:01:24 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-05-23 00:01:24 +0000 |
commit | 002586642116a741d40c197b07191c63515d35dd (patch) | |
tree | bcc824fc6046261ea3a69af08d34b6cdf8570cae /Master/texmf-dist/doc | |
parent | 8518c1ff40dd53799254c0b0f88a6a8ae85173e6 (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')
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¤t&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"; + |