summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/metapost/mp3d
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-09 00:45:48 +0000
committerKarl Berry <karl@freefriends.org>2006-01-09 00:45:48 +0000
commit5dc602d16c5be2fd035b254ca23484a90aebd6dc (patch)
tree72efb15fba318cc2096a8cc6999ed3fa0bff317d /Master/texmf-dist/doc/metapost/mp3d
parentb4fc5f639874db951177ec539299d20908adb654 (diff)
doc 5
git-svn-id: svn://tug.org/texlive/trunk@81 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/metapost/mp3d')
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/README84
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp88
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp124
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp86
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp94
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp133
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp48
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp66
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp75
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp76
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp90
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp91
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp98
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp99
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp112
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp113
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp84
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp85
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp100
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp101
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp102
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp103
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp120
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp121
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp63
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp148
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp149
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/gut2001.pdfbin0 -> 247845 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdfbin0 -> 138588 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdfbin0 -> 175795 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx1149
-rw-r--r--Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdfbin0 -> 263816 bytes
32 files changed, 3802 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/metapost/mp3d/README b/Master/texmf-dist/doc/metapost/mp3d/README
new file mode 100644
index 00000000000..499a872c0b1
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/README
@@ -0,0 +1,84 @@
+ 3d/3dgeom version 1.34
+ ======================
+
+This release is a intermediary release of the 3d metapost package.
+It updates the 3d package (CTAN:graphics/metapost/macros/3d)
+and adds features facilitating the creation of space geometry drawings.
+
+There have been a number of changes, and as a consequence we had
+to slightly update the description published in TUGboat in 1998.
+See the doc directory. The doc directory contains both
+the old 1998 article, a corrected version, the 2001 GUTenberg
+article on geometry in space and its translation which appeared in 2003
+(TUGboat 2001).
+
+The 1998 package is completely contained in this release in the directory
+v1.0, except that some files have been renamed in order to prevent
+a conflict. For istance, 3d.mp has been renamed into 3d-1.0.mp
+when necessary. Also, the doc directory from the 1.0 version has been
+transferred to the current doc directory.
+
+The 1.0 version should still be of interest for the documentation
+of its file, which used mft (see for instance v1.0/doc/3d-1.0.ps).
+
+As version 1.34 is an intermediate release, it may lack some
+uniformity which might be added later. Also, the sources do contain
+preliminary and documented material.
+
+This release contains three directories:
+
+ doc : documentation
+ examples : all the examples from the Space Geometry article
+ inputs : the files needed for metapost
+
+
+HOW TO CREATE AN ANIMATION
+--------------------------
+
+Details are given to produce the standard animation
+under UNIX, with the binaries listed below.
+For other architectures, you may have to adapt the
+write_script macro in the 3d.mp file.
+
+ 1) create a directory and copy the .mp files from the
+ inputs directory to it.
+ 2) apply metapost to animpoly.mp ; this will create 100 files
+ named animpoly.101, animpoly.102, ..., animpoly.200.
+ It will also have created a script file named
+ create_animation.sh
+ 3) copy the gifmerge utility (as well as programs such as pnmcut,...)
+ in this directory or let it be reachable through PATH.
+ 4) apply sh to create_animation.sh; this will create the animation;
+ first the metapost outputs are converted to gif, then
+ they are collated with gifmerge.
+ 5) the result is animpoly.gif which is a GIF89A animation file;
+ it can be viewed under netscape or simply with a program like xanim.
+
+ Binaries required by the 3D package
+ -----------------------------------
+
+As it is, the generation of animated gifs requires the following
+programs:
+
+ awk
+ gs (ghostscript)
+ pnmcut
+ ppmquant
+ ppmtogif
+ gifmerge
+
+These executables are not part of that distribution.
+
+The first two are widely available on UNIX.
+The three p* programs are part of the NETPBM toolkit.
+You can find this toolkit on the web through any search tool.
+And gifmerge can be found at http://www.iis.ee.ethz.ch/~kiwi/GIFMerge.
+
+I have no idea how to port all this on other architectures,
+but I assume there are similar tools for PCs or Macs.
+I'd be interested to get feedback and details so that i can
+include instructions in future releases of my package.
+
+========================================================================
+Denis Roegel, 17 August 2003
+roegel@loria.fr
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp
new file mode 100644
index 00000000000..7cc6cb78731
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp
@@ -0,0 +1,88 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+% Oblique projections of the cube
+
+input 3danim
+output_res:=72;
+drawing_scale:=2cm;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+new_plane_(horizontal_plane)(point_null,vec_I,vec_J);
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_line(3,7);draw_lines(8,7,5);
+ draw_line(2,6);draw_line(4,8);
+ draw_lines(5,6,8);draw_lines(4,3);draw_lines(2,4);
+ drawoptions(dashed evenly);
+ draw_lines(1,2);draw_lines(3,1);draw_line(1,5);
+ drawoptions();
+enddef;
+
+assign_obj("cube","C");
+point_of_view_obj("cube",8,Obs_phi);
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),CAVALIER,30,50); % 30
+
+beginfig(100);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),CABINET,30,20); % 30
+
+beginfig(101);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),30,20,20); % 20
+
+beginfig(102);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+new_point(hp);
+set_point_(hp)(0,1,1);
+
+set_plane_(horizontal_plane)(hp,vec_I,vec_K);
+% such a plane and a second angle of 90 degrees produces a
+% ``planometric'' view.
+oblique_projection(horizontal_plane)(pnt_obj("cube",8),30,90,20); % 20
+
+vardef draw_C(expr inst)=
+ draw_lines(8,7);draw_line(3,7);draw_lines(7,5);
+ draw_lines(1,2);draw_lines(3,1);
+ draw_line(1,5);
+ draw_lines(4,3);draw_lines(2,4);draw_line(4,8);
+ drawoptions(dashed evenly);
+ draw_lines(5,6);
+ draw_line(2,6);draw_lines(6,8);
+ drawoptions();
+enddef;
+
+beginfig(103);
+ Obs_dist:=2;
+ draw_obj("cube");
+endfig;
+
+end.
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp
new file mode 100644
index 00000000000..7a841d2e8b4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp
@@ -0,0 +1,124 @@
+verbatimtex
+%&latex
+\documentclass{article}
+
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=20cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,21); % 21 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+
+ % corners of the projection plane
+ %set_point(9)(12.92993,12.37372,6.83334);
+ %set_point(10)(15.68588,8.48413,6.8334);
+ %set_point(11)(16.27899,8.90436,4.12851);
+ %set_point(12)(13.52304,12.79395,4.12845);
+
+ %set_point(9)(13.76718,11.50638,6.15714);
+ %set_point(10)(15.14517,9.56158,6.15717);
+ %set_point(11)(15.44174,9.7717,4.80472);
+ %set_point(12)(14.06375,11.71649,4.80469);
+
+ set_point(9)(0.80682,2.27571,1.939);
+ set_point(10)(2.03946,0.2357,1.93903);
+ set_point(11)(2.46796,0.49461,0.63113);
+ set_point(12)(1.23532,2.53462,0.6311);
+
+ % shown observator
+ set_point(13)(3.23608,2.35114,2);
+
+ % intersections with the projection plane
+ new_plane(pl)(9,10,11);
+ new_line(l)(1,13);
+ if not def_inter_p_l_pl(14)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(2,13);
+ if not def_inter_p_l_pl(15)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(3,13);
+ if not def_inter_p_l_pl(16)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(4,13);
+ if not def_inter_p_l_pl(17)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(5,13);
+ if not def_inter_p_l_pl(18)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(6,13);
+ if not def_inter_p_l_pl(19)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(7,13);
+ if not def_inter_p_l_pl(20)(l)(pl):
+ message "PROBLEM ";
+ fi;
+ set_line(l)(8,13);
+ if not def_inter_p_l_pl(21)(l)(pl):
+ message "PROBLEM ";
+ fi;
+
+ free_line(l);
+ free_plane(pl);
+
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ draw_lines(9,10,11,12,9);
+ pickup pencircle scaled 2pt;
+ draw_line(13,13);draw_line(1,1);draw_line(2,2);draw_line(3,3);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw fullcircle scaled 6pt shifted z[ipnt_(8)];
+ label_obj.lft(btex \textit{Obs}$(3.23,2.35,2)$ etex,13);
+ label_obj.rt(btex $(0,0,0)$ etex,1);
+ label_obj.rt(btex $(0,0,1)$ etex,2);
+ label_obj.bot(btex $(0,1,0)$ etex,3);
+ label_obj.llft(btex $(1,1,0)$ etex,7);
+
+ drawoptions(dashed withdots);
+ draw_line(1,13);draw_line(2,13);draw_line(3,13);draw_line(4,13);
+ draw_line(5,13);draw_line(6,13);draw_line(7,13);draw_line(8,13);
+ drawoptions();
+ draw_line(14,15,17,16,14);draw_lines(18,19,21,20,18);
+ draw_line(14,18);draw_line(15,19);draw_line(16,20);draw_line(17,21);
+enddef;
+
+assign_obj("cube","C");
+
+for i:=28 upto 28:
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),4);
+ show_point("Obs",Obs);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",14,Obs_phi);
+ draw_obj("cube");
+ endfig;
+endfor;
+
+end.
+
+
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp
new file mode 100644
index 00000000000..9c3370744ee
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp
@@ -0,0 +1,86 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=2cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,11); % 11 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ if z[ipnt_(9)]=(10,10):draw_line(9,9);
+ fi;
+ if z[ipnt_(10)]=(10,10):draw_line(10,10);
+ fi;
+ if z[ipnt_(11)]=(10,10):draw_line(11,11);
+ fi;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ draw_line(9,9);draw_line(10,10);draw_line(11,11);
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% we change the field because we are very close
+h_field:=120; % degrees
+v_field:=120; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=97;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.8*cosd(3.6*i),1.8*sind(3.6*i),2);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp
new file mode 100644
index 00000000000..228cd35f9da
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp
@@ -0,0 +1,94 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=2cm;
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,12); % 12 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ set_line(l)(1,7);
+ if not def_vanishing_point_p_l_pl(12)(l)(screen):
+ message "no vanishing point 4";
+ set_point(12)(0,0,0);
+ fi;
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ if z[ipnt_(9)]=(10,10):draw_line(9,9);
+ fi;
+ if z[ipnt_(10)]=(10,10):draw_line(10,10);
+ fi;
+ if z[ipnt_(11)]=(10,10):draw_line(11,11);
+ fi;
+ if z[ipnt_(12)]=(10,10):draw_line(12,12);
+ fi;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ draw_line(9,9);draw_line(10,10);draw_line(11,11);draw_line(12,12);
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ draw_line(1,12);draw_line(2,12);
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% on change le champ car on est très près
+h_field:=160; % degrees
+v_field:=160; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=97;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.8*cosd(3.6*i),1.8*sind(3.6*i),2);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp
new file mode 100644
index 00000000000..28df75f1e85
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp
@@ -0,0 +1,133 @@
+% The nine vanishing points of a cube
+% D. Roegel, 22 January 2001
+% Warning: this figure is very sensitive to small motions!
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=1cm;
+
+def draw_arrowline_extra(expr i,j)(expr exi,exj)=
+ drawarrow exi[z[ipnt_(i)],z[ipnt_(j)]]--exj[z[ipnt_(i)],z[ipnt_(j)]];
+enddef;
+
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+ % vanishing points
+ def_screen_pl(screen);
+ new_line(l)(1,2);
+ if not def_vanishing_point_p_l_pl(9)(l)(screen):
+ message "no vanishing point 1";
+ set_point(9)(0,0,0);
+ fi;
+ set_line(l)(1,3);
+ if not def_vanishing_point_p_l_pl(10)(l)(screen):
+ message "no vanishing point 2";
+ set_point(10)(0,0,0);
+ fi;
+ set_line(l)(1,5);
+ if not def_vanishing_point_p_l_pl(11)(l)(screen):
+ message "no vanishing point 3";
+ set_point(11)(0,0,0);
+ fi;
+ set_line(l)(1,7);
+ if not def_vanishing_point_p_l_pl(12)(l)(screen):
+ message "no vanishing point 4";
+ set_point(12)(0,0,0);
+ fi;
+ set_line(l)(5,3);
+ if not def_vanishing_point_p_l_pl(13)(l)(screen):
+ message "no vanishing point 5";
+ set_point(13)(0,0,0);
+ fi;
+ set_line(l)(5,8);
+ if not def_vanishing_point_p_l_pl(14)(l)(screen):
+ message "no vanishing point 6";
+ set_point(14)(0,0,0);
+ fi;
+ set_line(l)(6,7);
+ if not def_vanishing_point_p_l_pl(15)(l)(screen):
+ message "no vanishing point 7";
+ set_point(15)(0,0,0);
+ fi;
+ set_line(l)(5,2);
+ if not def_vanishing_point_p_l_pl(16)(l)(screen):
+ message "no vanishing point 8";
+ set_point(16)(0,0,0);
+ fi;
+ set_line(l)(6,1);
+ if not def_vanishing_point_p_l_pl(17)(l)(screen):
+ message "no vanishing point 9";
+ set_point(17)(0,0,0);
+ fi;
+
+ free_line(l);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+ pickup pencircle scaled 4pt;
+ drawoptions(withcolor red);
+ for i:=9 upto 17:
+ if z[ipnt_(i)]=(10,10):draw_line(i,i);
+ fi;
+ endfor;
+ drawoptions();
+ pickup pencircle scaled 1pt;
+ for i:=9 upto 17:draw_line(i,i);endfor;
+ pickup pencircle scaled 0.4pt;
+ drawoptions(dashed evenly scaled 0.5);
+ for j:=1,3,5,7:draw_line(j,9);endfor;
+ for j:=3,4,7,8:draw_line(j,10);endfor;
+ for j:=1 upto 4:draw_line(j,11);endfor;
+ draw_line(1,12);draw_line(2,12);
+ drawoptions(dashed evenly scaled 0.5 withcolor red);
+ for j:=5,6:draw_line(j,13);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor green);
+ for j:=1,5:draw_line(j,14);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor blue);
+ for j:=2,6:draw_line(j,15);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor green);
+ for j:=2,4:draw_line(j,16);endfor;
+ drawoptions(dashed evenly scaled 0.5 withcolor red);
+ for j:=6,8:draw_line(j,17);endfor;
+
+ drawoptions();
+enddef;
+
+new_plane_(screen)(0,0,0); % must be defined before |assign_obj|
+ % because |assign_obj| calls |set_C_point|
+
+% we change the field, because we are very close
+h_field:=170; % degrees
+v_field:=170; % degrees
+
+
+assign_obj("cube","C");
+
+%for i:=0 upto 100:
+i=96;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(1.7*cosd(3.6*i),1.8*sind(3.6*i),1.8);
+ Obs_phi:=90;Obs_dist:=0.5;point_of_view_obj("cube",8,Obs_phi);
+ reset_obj("cube");
+ draw_obj("cube");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp
new file mode 100644
index 00000000000..f555a2637cb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp
@@ -0,0 +1,48 @@
+% D. Roegel January 2001
+% roegel@loria.fr
+
+% oblique projections
+
+input 3danim
+output_res:=72;
+drawing_scale:=3cm;
+
+projection_type:=2;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);draw_lines(5,6,8,7,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);draw_line(4,8);
+enddef;
+
+assign_obj("cube","C");
+
+for i:=0 upto 20:
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",8,Obs_phi);
+ draw_obj("cube");
+ endfig;
+endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp
new file mode 100644
index 00000000000..1e52203a811
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp
@@ -0,0 +1,66 @@
+% Cube projections
+% D. Roegel 23 January 2001
+% roegel@loria.fr
+
+
+input 3danim
+output_res:=72;
+drawing_scale:=2cm;
+
+projection_type:=1;
+
+%set_plane_(projection_plane)(point_null,vec_I,vec_J);
+%set_plane_(projection_plane)(point_null,vec_I,vec_K);
+
+vardef def_C(expr inst)=
+ new_obj_points(inst,8); % 8 points
+ set_C_points(inst);
+enddef;
+
+vardef set_C_points(expr inst)=
+ set_point(1)(0,0,0);set_point(2)(0,0,1);
+ set_point(3)(0,1,0);set_point(4)(0,1,1);
+ set_point(5)(1,0,0);set_point(6)(1,0,1);
+ set_point(7)(1,1,0);set_point(8)(1,1,1);
+enddef;
+
+vardef draw_C(expr inst)=
+ draw_lines(1,2,4,3,1);
+ draw_line(2,6);draw_line(4,8);draw_line(1,5);
+ draw_lines(5,6,8);
+ drawoptions(dashed evenly);
+ draw_line(3,7);draw_lines(8,7,5);
+ drawoptions();
+enddef;
+
+assign_obj("cube","C");
+
+% Trimetric projection
+i:=67;
+beginfig(167);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("cube",8,Obs_phi);
+ draw_obj("cube");
+endfig;
+
+% Isometric projection
+isometric_projection(vec_I,vec_J,vec_K,pnt_obj("cube",8),Obs_dist,90);
+
+beginfig(168);
+ draw_obj("cube");
+endfig;
+
+% Dimetric projection
+dimetric_projection(vec_I,vec_J,vec_K,0.5,pnt_obj("cube",8),3*Obs_dist,90);
+
+beginfig(169);
+ draw_obj("cube");
+endfig;
+
+end.
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp
new file mode 100644
index 00000000000..bf144e1eeae
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp
@@ -0,0 +1,75 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=7cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ drawoptions();
+ draw_line(2,3);draw_line(2,4);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.ulft(btex $A_1$ etex,1);
+ label_obj.rt(btex $B_2$ etex,2);
+ label_obj.lft(btex $C_3$ etex,3);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.top(btex $I_5$ etex,5);
+ label_obj.top(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp
new file mode 100644
index 00000000000..82a76d2c042
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp
@@ -0,0 +1,76 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=7cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ drawoptions();
+ draw_line(2,3);draw_line(2,4);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.ulft(btex $A_1$ etex,1);
+ label_obj.rt(btex $B_2$ etex,2);
+ label_obj.lft(btex $C_3$ etex,3);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.top(btex $I_5$ etex,5);
+ label_obj.top(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp
new file mode 100644
index 00000000000..7ff4e581013
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp
@@ -0,0 +1,90 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp
new file mode 100644
index 00000000000..b2e3453f029
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp
@@ -0,0 +1,91 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,6); % 6 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp
new file mode 100644
index 00000000000..a4b3cb81736
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp
@@ -0,0 +1,98 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,7); % 7 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(2,7);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+ label_obj.bot(btex $M_7$ etex,7);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp
new file mode 100644
index 00000000000..8b66eac58bb
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp
@@ -0,0 +1,99 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,7); % 7 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(2,7);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.bot(btex $C_3$ etex,3);
+ label_obj.rt(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.urt(btex $J_6$ etex,6);
+ label_obj.bot(btex $M_7$ etex,7);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp
new file mode 100644
index 00000000000..93e3cfba01c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp
@@ -0,0 +1,112 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,10); % 10 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ % K=middle of AD
+ mid_point(8,1,4);
+ set_line(ij)(5,8);
+ b:=def_inter_p_l_pl(9)(ij)(bcd); if not b: ... fi;
+ set_line(ij)(6,8);
+ b:=def_inter_p_l_pl(10)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);draw_line(8,5);
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);draw_line(8,8);
+ draw_line(9,9);draw_line(10,10);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(3,7);
+ draw_line(8,9);draw_line(4,9);
+ draw_line(8,10);draw_line(3,10);
+ draw_line_extra(9,10)(-0.1,1.1);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.llft(btex $C_3$ etex,3) shifted (-2.5mm,1mm);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.lft(btex $J_6$ etex,6) shifted (-2mm,0);
+ label_obj.lrt(btex $M_7$ etex,7);
+ label_obj.urt(btex $K_8$ etex,8);
+ label_obj.lrt(btex $N_9$ etex,9);
+ label_obj.lrt(btex $L_{10}$ etex,10);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp
new file mode 100644
index 00000000000..b97426f8196
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp
@@ -0,0 +1,113 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=13cm;
+
+numeric b,c,d,e;b=70;c=0;d=20;e=50; % parameterized angles
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,10); % 10 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(3*cosd(b),3*sind(b),0);
+ set_point(3)(6*cosd(c),6*sind(c),0);
+ new_vec(v_a);new_vec(v_b);
+ vec_def_vec_(v_a,vec_I);
+ vec_rotate_(v_a,vec_K,d);
+ vec_prod_(v_b,v_a,vec_K);
+ vec_rotate_(v_a,v_b,e);
+ vec_mult_(v_a,v_a,4.5);
+ vec_sum_(pnt(4),pnt(1),v_a);
+ free_vec(v_b);free_vec(v_a);
+ % Determination of I and J:
+ % I=A + unit(AB)
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_sum(5,5,1);
+ % J=A + 4*unit(AC)
+ vec_diff(6,3,1);
+ vec_unit(6,6);
+ vec_mult(6,6,4);
+ vec_sum(6,6,1);
+ new_plane(bcd)(2,3,4);
+ new_line(ij)(5,6);
+ boolean b;
+ b:=def_inter_p_l_pl(7)(ij)(bcd); if not b: ... fi;
+ % K=middle of AD
+ mid_point(8,1,4);
+ set_line(ij)(5,8);
+ b:=def_inter_p_l_pl(9)(ij)(bcd); if not b: ... fi;
+ set_line(ij)(6,8);
+ b:=def_inter_p_l_pl(10)(ij)(bcd); if not b: ... fi;
+ free_line(ij);
+ free_plane(bcd);
+enddef;
+
+vardef draw_T(expr inst)=
+ drawoptions(dashed evenly);draw_line(2,4);draw_line(8,5);
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(1,4);
+ draw_line(2,3);draw_line(3,4);
+ pickup pencircle scaled 2pt;
+ draw_line(5,5);draw_line(6,6);draw_line(7,7);draw_line(8,8);
+ draw_line(9,9);draw_line(10,10);
+ pickup pencircle scaled .4pt;
+ draw_line(5,7);draw_line(3,7);
+ draw_line(8,9);draw_line(4,9);
+ draw_line(8,10);draw_line(3,10);
+ draw_line_extra(9,10)(-0.1,1.1);
+ label_obj.top(btex $A_1$ etex,1);
+ label_obj.lft(btex $B_2$ etex,2);
+ label_obj.llft(btex $C_3$ etex,3) shifted (-2.5mm,1mm);
+ label_obj.top(btex $D_4$ etex,4);
+ label_obj.lft(btex $I_5$ etex,5);
+ label_obj.lft(btex $J_6$ etex,6) shifted (-2mm,0);
+ label_obj.lrt(btex $M_7$ etex,7);
+ label_obj.urt(btex $K_8$ etex,8);
+ label_obj.lrt(btex $N_9$ etex,9);
+ label_obj.lrt(btex $L_{10}$ etex,10);
+
+enddef;
+
+assign_obj("tetra","T");
+
+new_vec(v_a);new_vec(v_b);new_vec(v_c);
+vec_diff_(v_a,pnt_obj("tetra",3),pnt_obj("tetra",4)); % vec(DC)
+vec_mult_(v_a,v_a,5);
+vec_diff_(v_b,pnt_obj("tetra",3),pnt_obj("tetra",2)); % vec(BC)
+vec_mult_(v_b,v_b,5);
+vec_diff_(v_c,pnt_obj("tetra",1),pnt_obj("tetra",3)); % vec(CA)
+vec_mult_(v_c,v_c,3);
+vec_sum_(Obs,pnt_obj("tetra",3),v_a); % C + 5DC
+vec_sum_(Obs,Obs,v_b);% C + 5DC + 5BC
+vec_sum_(Obs,Obs,v_c);% C + 5DC + 5BC + 3CA
+free_vec(v_c);free_vec(v_b);free_vec(v_a);
+
+%for i:=0 upto 20:
+i=8;
+ beginfig(200+i);
+ % Observator
+ %set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
+ Obs_phi:=0;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp
new file mode 100644
index 00000000000..5bf58829948
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp
@@ -0,0 +1,84 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,4); % 4 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;new_point(h);new_point(k);
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff_(h,pnt(2),pnt(1));
+ vec_unit_(h,h);vec_mult_(h,h,lsb*cosd(aasb));
+ vec_sum_(h,h,pnt(1));
+ vec_diff_(k,pnt(4),pnt(1));
+ vec_unit_(k,k);vec_mult_(k,k,lsb*cosd(absc));
+ vec_sum_(k,k,pnt(1));
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(h);
+ def_orth_pl_l_p_(kp)(sc)(k);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ free_point(k);free_point(h);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(1,4);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ drawoptions(dashed evenly);
+ draw_line(2,4);
+ drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.top(btex $B$ etex,3);
+ label_obj.lft(btex $C$ etex,4);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp
new file mode 100644
index 00000000000..3063c260839
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp
@@ -0,0 +1,85 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,4); % 4 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;new_point(h);new_point(k);
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff_(h,pnt(2),pnt(1));
+ vec_unit_(h,h);vec_mult_(h,h,lsb*cosd(aasb));
+ vec_sum_(h,h,pnt(1));
+ vec_diff_(k,pnt(4),pnt(1));
+ vec_unit_(k,k);vec_mult_(k,k,lsb*cosd(absc));
+ vec_sum_(k,k,pnt(1));
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(h);
+ def_orth_pl_l_p_(kp)(sc)(k);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ free_point(k);free_point(h);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(1,4);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ drawoptions(dashed evenly);
+ draw_line(2,4);
+ drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.top(btex $B$ etex,3);
+ label_obj.lft(btex $C$ etex,4);
+
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp
new file mode 100644
index 00000000000..c11e44391a9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp
@@ -0,0 +1,100 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ def_right_angle(14,15,16,13,6,3);
+ def_right_angle(17,18,19,13,5,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(2,4);draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ draw_line(13,6);draw_line(13,5);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_double_right_angle(14,15,16,13);
+ draw_double_right_angle(17,18,19,13);
+
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+ i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp
new file mode 100644
index 00000000000..a63a1b08474
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp
@@ -0,0 +1,101 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=10cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ def_right_angle(14,15,16,13,6,3);
+ def_right_angle(17,18,19,13,5,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(2,4);draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ draw_line(13,6);draw_line(13,5);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_double_right_angle(14,15,16,13);
+ draw_double_right_angle(17,18,19,13);
+
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+ i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp
new file mode 100644
index 00000000000..45865eae0f0
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp
@@ -0,0 +1,102 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(3,5);draw_line(3,6);draw_line(2,4);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);draw_line(15,16);draw_line(16,17);draw_line(17,14);
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp
new file mode 100644
index 00000000000..784d8a2cfcc
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp
@@ -0,0 +1,103 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,17); % 17 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+ def_orth_pl_l_p_(hp)(sa)(pnt(5));
+ def_orth_pl_l_p_(kp)(sc)(pnt(6));
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);
+ draw_line(3,5);draw_line(3,6);draw_line(2,4);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);draw_line(15,16);draw_line(16,17);draw_line(17,14);
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp
new file mode 100644
index 00000000000..b46031931b9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp
@@ -0,0 +1,120 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,op,oab,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+
+ def_orth_pl_l_p(hp)(sa)(5);
+ def_orth_pl_l_p(kp)(sc)(6);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM 1";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+ if def_visual_inter(18)(15,16,2,3):
+ else:
+ message "PROBLEM";
+ fi;
+ if def_visual_inter(19)(15,16,3,4):
+ else:
+ message "PROBLEM";
+ fi;
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);draw_line(2,4);
+ draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);
+ %draw_line(15,16);
+ draw_line(15,18);draw_line(19,16);
+ draw_line(16,17);draw_line(17,14);
+ drawoptions(dashed evenly);
+ draw_line(18,19);
+ pickup pencircle scaled .4pt;drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ reset_obj("tetra"); % so that |Obs| is taken into account
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp
new file mode 100644
index 00000000000..fc342bb301c
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp
@@ -0,0 +1,121 @@
+% D. Roegel, 7 January 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=8cm;
+
+numeric lsa,lsb,lsc,aasc,aasb,absc;
+lsa=9;lsb=8;lsc=4;aasc=60;aasb=40;absc=30;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,19); % 19 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ save hp,kp,sa,sc,op,oab,inter;
+ set_point(1)(0,0,0); % S
+ set_point(2)(lsa,0,0); % A
+ set_point(4)(lsc*cosd(aasc),lsc*sind(aasc),0); % C
+ vec_diff(5,2,1);
+ vec_unit(5,5);
+ vec_mult(5,5,lsb*cosd(aasb));
+ vec_sum(5,5,1);
+ vec_diff(6,4,1);
+ vec_unit(6,6);vec_mult(6,6,lsb*cosd(absc));
+ vec_sum(6,6,1);
+ new_plane(hp)(1,1,1);
+ new_plane(kp)(1,1,1);
+ new_line(sa)(1,2);
+ new_line(sc)(1,4);
+ new_line(inter)(1,1);
+
+ def_orth_pl_l_p(hp)(sa)(5);
+ def_orth_pl_l_p(kp)(sc)(6);
+ if def_inter_l_pl_pl(inter)(hp)(kp): % there is an intersection
+ if def_point_at(3,-lsb,1)(inter):
+ else:
+ message "PROBLEM 1";
+ fi;
+ new_plane(sac)(1,2,4);
+ if def_inter_p_l_pl(13)(inter)(sac): else: message "PROBLEM";fi;
+ free_plane(sac);
+ else:
+ message "PROBLEM";
+ set_point(3)(1,1,1);
+ fi;
+ def_right_angle(7,8,9,5,1,3);
+ def_right_angle(10,11,12,6,1,3);
+ free_line(inter);free_line(sc);free_line(sa);
+ free_plane(kp);free_plane(hp);
+ set_point(14)(-2,-2,0);
+ set_point(15)(11,-2,0);
+ set_point(16)(11,10,0);
+ set_point(17)(-2,10,0);
+ if def_visual_inter(18)(15,16,2,3):
+ else:
+ message "PROBLEM";
+ fi;
+ if def_visual_inter(19)(15,16,3,4):
+ else:
+ message "PROBLEM";
+ fi;
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line_extra(1,4)(-.1,2);draw_line(1,3);
+ draw_line(2,3);draw_line(3,4);
+ draw_line_extra(3,13)(-0.5,1);
+ drawoptions(dashed evenly);draw_line(2,4);
+ draw_line(3,5);draw_line(3,6);
+ draw_line_extra(3,13)(1,2);
+ drawoptions();
+ draw_double_right_angle(7,8,9,5);
+ draw_double_right_angle(10,11,12,6);
+ draw_line(14,15);
+ %draw_line(15,16);
+ draw_line(15,18);draw_line(19,16);
+ draw_line(16,17);draw_line(17,14);
+ drawoptions(dashed evenly);
+ draw_line(18,19);
+ pickup pencircle scaled .4pt;drawoptions();
+ label_obj.bot(btex $S$ etex,1);
+ label_obj.rt(btex $A$ etex,2);
+ label_obj.ulft(btex $B$ etex,3);
+ label_obj.llft(btex $C$ etex,4);
+ label_obj.bot(btex $p_1$ etex,14);
+ label_obj.rt(btex $p_2$ etex,15);
+ label_obj.ulft(btex $p_3$ etex,16);
+ label_obj.llft(btex $p_4$ etex,17);
+
+enddef;
+
+square_angle_size:=0.35;
+assign_obj("tetra","T");
+
+
+%for i:=0 upto 20:
+i=0;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(20*cosd(3.6*i-150),20*sind(3.6*i-150),6);
+ reset_obj("tetra"); % so that |Obs| is taken into account
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp
new file mode 100644
index 00000000000..a419516aff4
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp
@@ -0,0 +1,63 @@
+% D. Roegel, 9 January 2001
+% roegel@loria.fr
+
+input 3danim
+input 3dgeom
+output_res:=72;
+drawing_scale:=15cm;
+
+vardef def_T(expr inst)=
+ new_obj_points(inst,12); % 12 points
+ set_T_points(inst);
+enddef;
+
+vardef set_T_points(expr inst)=
+ set_point(1)(0,0,0);
+ set_point(2)(1,0,0);
+ set_point(3)(1,1,0);
+ set_point(4)(0,1,0);
+ set_point(5)(0,0,1);
+ set_point(6)(1,0,1);
+ set_point(7)(1,1,1);
+ set_point(8)(0,1,1);
+ new_vec(v);
+ vec_diff_(v,pnt(1),pnt(4));
+ vec_sum_(pnt(9),pnt(1),v);
+ mid_point(10,1,2);
+ vec_sum_(pnt(11),pnt(2),v);
+ mid_point(12,7,8);
+enddef;
+
+vardef draw_T(expr inst)=
+ draw_line(1,2);draw_line(2,3);
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(1,5);draw_line(2,6);draw_line(3,7);
+ draw_line(9,10);draw_line(10,11);draw_line(11,9);
+ draw_line(5,12);draw_line(12,6);draw_line(6,5);
+ drawoptions(dashed evenly);
+ draw_line(3,4);draw_line(4,1);draw_line(4,8);
+ draw_line(5,9);draw_line(10,12);draw_line(6,11);
+ drawoptions();
+ fill z[ipnt_(9)]--z[ipnt_(10)]--z[ipnt_(11)]--cycle withcolor 0.8white;
+ fill z[ipnt_(5)]--z[ipnt_(12)]--z[ipnt_(6)]--cycle withcolor 0.8white;
+ draw_equal_marks(1,4,2);
+ draw_equal_marks(1,5,2);
+enddef;
+
+assign_obj("tetra","T");
+
+%for i:=0 upto 30:
+i=23;
+ beginfig(100+i);
+ % Observator
+ set_point_(Obs)(10*cosd(3.6*i-150),10*sind(3.6*i-150),3);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("tetra",1,Obs_phi);
+ draw_obj("tetra");
+ endfig;
+%endfor;
+
+end.
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp
new file mode 100644
index 00000000000..09516765684
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp
@@ -0,0 +1,148 @@
+% D. Roegel
+% Three orthogonal projections of a tetrahedron
+% January 7, 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\begin{document}
+etex
+
+
+
+input 3dgeom; % definitions for geometry
+input 3danim; % animations
+
+% We modify some of the default settings.
+output_res:=72;
+drawing_scale:=7cm;
+filled_faces:=false;
+show_animation_parameters:=true;
+
+%projection_type:=1; % parallel projection
+
+%================ DEFINITION OF OBJECT (BEGIN) =========================
+vardef def_fig(expr inst)=
+ new_obj_points(inst,28); % 28 points 4+3*(4+4)
+ set_fig_points(inst);
+enddef;
+
+% Definition of the points that belong to the general figure.
+vardef set_fig_points(expr inst)=
+ set_point(1)(0.3,0.45,0.8); % A
+ set_point(2)(0.6,0.45,0.8); % B
+ set_point(3)(0.5,0.6,0.5); % C
+ set_point(4)(0.5,0.3,0.5); % D
+
+ % the three planes (four corners at a time)
+ % horizontal
+ set_point(5)(0,0,-.2);
+ set_point(6)(1,0,-.2);
+ set_point(7)(1,1,-.2);
+ set_point(8)(0,1,-.2);
+ % vertical left
+ set_point(9) (-.45,0,0);
+ set_point(10)(-.45,1,0);
+ set_point(11)(-.45,1,1);
+ set_point(12)(-.45,0,1);
+ % vertical front
+ set_point(13)(0,-.45,0);
+ set_point(14)(1,-.45,0);
+ set_point(15)(1,-.45,1);
+ set_point(16)(0,-.45,1);
+
+ % we now compute the verticals and therefore introduce plane structures
+ new_plane(f)(9,10,11);
+ new_plane(g)(13,14,15);
+ new_plane(h)(5,6,7);
+
+ % bottow figure
+ def_vert_pl(17)(1)(h);
+ def_vert_pl(18)(2)(h);
+ def_vert_pl(19)(3)(h);
+ def_vert_pl(20)(4)(h);
+
+ % left figure
+ def_vert_pl(21)(1)(f);
+ def_vert_pl(22)(2)(f);
+ def_vert_pl(23)(3)(f);
+ def_vert_pl(24)(4)(f);
+
+ % front figure
+ def_vert_pl(25)(1)(g);
+ def_vert_pl(26)(2)(g);
+ def_vert_pl(27)(3)(g);
+ def_vert_pl(28)(4)(g);
+
+ free_plane(h);free_plane(g);free_plane(f);
+enddef;
+
+% Method to draw a general figure
+vardef draw_fig(expr inst)=
+ % tetrahedron
+ pickup pencircle scaled 1pt;
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(2,3);
+ draw_line(2,4);draw_line(3,4);
+ drawoptions(dashed withdots);draw_line(1,4);
+ drawoptions();
+
+ % projection on f:
+ draw_line(21,22);draw_line(21,23);draw_line(21,24);
+ draw_line(22,23);draw_line(22,24);draw_line(23,24);
+
+ % projection on g:
+ draw_line(25,26);draw_line(25,27);draw_line(25,28);
+ draw_line(26,27);draw_line(26,28);draw_line(27,28);
+
+ % projection on h:
+ draw_line(17,18);draw_line(17,19);draw_line(17,20);
+ draw_line(18,19);draw_line(18,20);draw_line(19,20);
+
+ pickup pencircle scaled .4pt;
+
+ % les plans
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(9,10);draw_line(10,11);draw_line(11,12);draw_line(12,9);
+ draw_line(13,14);draw_line(14,15);draw_line(15,16);draw_line(16,13);
+ pickup pencircle scaled .4pt;
+
+ % dotted projection lines:
+ save i;drawoptions(dashed evenly);
+ for i:=1 upto 4: draw_line(i,i+16);endfor;
+ for i:=1 upto 4: draw_line(i,i+20);endfor;
+ for i:=1 upto 4: draw_line(i,i+24);endfor;
+
+ % and a few labels:
+ label_obj.top(btex $A$ etex,1);
+ label_obj.llft(btex $B$ etex,2);
+ label_obj.lrt(btex $C$ etex,3);
+ label_obj.llft(btex $D$ etex,4);
+
+ label_obj.bot(btex $H$ etex,7);
+ label_obj.top(btex $F$ etex,12);
+ label_obj.llft(btex $G$ etex,14);
+
+enddef;
+
+assign_obj("figa","fig");
+
+%================ DEFINITION OF OBJECT (END) =========================
+
+% Call of drawing instruction
+%for i:=0 upto 20:%99:
+i=12;
+ beginfig(100+i);
+ % Positionning of the observer
+ set_point_(Obs)(4*cosd(3.6*i),4*sind(3.6*i),2.2);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("figa",1,Obs_phi);
+ draw_obj("figa"); % main figure
+ endfig;
+%endfor; show_animation_bbox;
+end.
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp b/Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp
new file mode 100644
index 00000000000..67fc60a0e5f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp
@@ -0,0 +1,149 @@
+% D. Roegel
+% Three orthogonal projections of a tetrahedron
+% January 7, 2001
+% roegel@loria.fr
+
+verbatimtex
+%&latex
+\documentclass{article}
+\usepackage{mathpple}
+\begin{document}
+etex
+
+
+
+input 3dgeom; % definitions for geometry
+input 3danim; % animations
+
+% We modify some of the default settings.
+output_res:=72;
+drawing_scale:=7cm;
+filled_faces:=false;
+show_animation_parameters:=true;
+
+%projection_type:=1; % parallel projection
+
+%================ DEFINITION OF OBJECT (BEGIN) =========================
+vardef def_fig(expr inst)=
+ new_obj_points(inst,28); % 28 points 4+3*(4+4)
+ set_fig_points(inst);
+enddef;
+
+% Definition of the points that belong to the general figure.
+vardef set_fig_points(expr inst)=
+ set_point(1)(0.3,0.45,0.8); % A
+ set_point(2)(0.6,0.45,0.8); % B
+ set_point(3)(0.5,0.6,0.5); % C
+ set_point(4)(0.5,0.3,0.5); % D
+
+ % the three planes (four corners at a time)
+ % horizontal
+ set_point(5)(0,0,-.2);
+ set_point(6)(1,0,-.2);
+ set_point(7)(1,1,-.2);
+ set_point(8)(0,1,-.2);
+ % vertical left
+ set_point(9) (-.45,0,0);
+ set_point(10)(-.45,1,0);
+ set_point(11)(-.45,1,1);
+ set_point(12)(-.45,0,1);
+ % vertical front
+ set_point(13)(0,-.45,0);
+ set_point(14)(1,-.45,0);
+ set_point(15)(1,-.45,1);
+ set_point(16)(0,-.45,1);
+
+ % we now compute the verticals and therefore introduce plane structures
+ new_plane(f)(9,10,11);
+ new_plane(g)(13,14,15);
+ new_plane(h)(5,6,7);
+
+ % bottow figure
+ def_vert_pl(17)(1)(h);
+ def_vert_pl(18)(2)(h);
+ def_vert_pl(19)(3)(h);
+ def_vert_pl(20)(4)(h);
+
+ % left figure
+ def_vert_pl(21)(1)(f);
+ def_vert_pl(22)(2)(f);
+ def_vert_pl(23)(3)(f);
+ def_vert_pl(24)(4)(f);
+
+ % front figure
+ def_vert_pl(25)(1)(g);
+ def_vert_pl(26)(2)(g);
+ def_vert_pl(27)(3)(g);
+ def_vert_pl(28)(4)(g);
+
+ free_plane(h);free_plane(g);free_plane(f);
+enddef;
+
+% Method to draw a general figure
+vardef draw_fig(expr inst)=
+ % tetrahedron
+ pickup pencircle scaled 1pt;
+ drawoptions();
+ draw_line(1,2);draw_line(1,3);draw_line(2,3);
+ draw_line(2,4);draw_line(3,4);
+ drawoptions(dashed withdots);draw_line(1,4);
+ drawoptions();
+
+ % projection on f:
+ draw_line(21,22);draw_line(21,23);draw_line(21,24);
+ draw_line(22,23);draw_line(22,24);draw_line(23,24);
+
+ % projection on g:
+ draw_line(25,26);draw_line(25,27);draw_line(25,28);
+ draw_line(26,27);draw_line(26,28);draw_line(27,28);
+
+ % projection on h:
+ draw_line(17,18);draw_line(17,19);draw_line(17,20);
+ draw_line(18,19);draw_line(18,20);draw_line(19,20);
+
+ pickup pencircle scaled .4pt;
+
+ % les plans
+ draw_line(5,6);draw_line(6,7);draw_line(7,8);draw_line(8,5);
+ draw_line(9,10);draw_line(10,11);draw_line(11,12);draw_line(12,9);
+ draw_line(13,14);draw_line(14,15);draw_line(15,16);draw_line(16,13);
+ pickup pencircle scaled .4pt;
+
+ % dotted projection lines:
+ save i;drawoptions(dashed evenly);
+ for i:=1 upto 4: draw_line(i,i+16);endfor;
+ for i:=1 upto 4: draw_line(i,i+20);endfor;
+ for i:=1 upto 4: draw_line(i,i+24);endfor;
+
+ % and a few labels:
+ label_obj.top(btex $A$ etex,1);
+ label_obj.llft(btex $B$ etex,2);
+ label_obj.lrt(btex $C$ etex,3);
+ label_obj.llft(btex $D$ etex,4);
+
+ label_obj.bot(btex $H$ etex,7);
+ label_obj.top(btex $F$ etex,12);
+ label_obj.llft(btex $G$ etex,14);
+
+enddef;
+
+assign_obj("figa","fig");
+
+%================ DEFINITION OF OBJECT (END) =========================
+
+% Call of drawing instruction
+%for i:=0 upto 20:%99:
+i=12;
+ beginfig(100+i);
+ % Positionning of the observer
+ set_point_(Obs)(4*cosd(3.6*i),4*sind(3.6*i),2.2);
+ Obs_phi:=90;Obs_dist:=2;point_of_view_obj("figa",1,Obs_phi);
+ draw_obj("figa"); % main figure
+ endfig;
+%endfor; show_animation_bbox;
+end.
+
+
+
+
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf b/Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf
new file mode 100644
index 00000000000..e64bdca4b52
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdf b/Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdf
new file mode 100644
index 00000000000..572c16e6bec
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf b/Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf
new file mode 100644
index 00000000000..3fb40bfc8ba
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx b/Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx
new file mode 100644
index 00000000000..9ff0153aeac
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx
@@ -0,0 +1,1149 @@
+% D. Roegel, 25/2/1997 : first draft
+% 26/2/1997
+% 23/4/1997 : appendix, types added
+% 24/4/1997 : better formatting of appendix
+% 25/4/1997 : two columns
+% 27/4/1997 : some improvements
+% 28/4/1997 : changes to take new syntax into account
+% 30/4/1997 : cleaning and additions
+% 1/5/1997 : ltugboat macros
+% addition of appendix b
+% all overfull hboxes removed; this needed a lot
+% of rephrasing!
+% lots of cleaning
+% 2/5/1997 : extension of future part
+% 12/5/1997 : several small improvements to take Ulrik Vieth's
+% comments into account.
+% 17/5/1997 : some corrections to take modifications in
+% the source code into account
+% 18/5/1997 : commas in the syntax have been put in \texttt
+% some renamings in order to get rid of the overfull
+% hboxes resulting from the comma changes ...
+% 29/5/1997 : some renamings of ``object'' into ``obj'' to
+% be in accordance with the code (version 0.993)
+% some reformatting of pieces of code with respect
+% to the indentation
+% 19/6/1997 : - the `future' part has been corrected with respect
+% to the general algorithm for drawing the faces
+% (thanks to Dominique Larchey)
+% - reference to the ``LaTeX Graphics Companion''
+% 11/2/1998 : - description of draw_contours and contour_width
+% - acknowledgment of Denis Barbier and Boguslaw
+% Jackowski
+% - one_image changed to an_image at the beginning
+% of the paper, in order to avoid being misleading
+% by comparison with the real one_image macro
+% - a few more lines describing the parameters of
+% one_image
+% - ghostscript -> Ghostscript
+% - footnote added to explain why Ghostscript
+% has not been used to generate the excerpts
+% of the images.
+% - some lines to explain why the color type
+% was not used for 3d vectors
+% 12/2/1998 : - rewording to avoid overfull hboxes
+% 19/2/1998 : - minor ``english'' editing (RF)
+% and file sent to author for review (mb)
+% 04/03/1998: - EM fonts removed/ not to be used this issue
+% 04/08/1998: - TUB-specific inputs modified for portability to
+% CTAN archives (mb)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\documentclass[nonumber,harvardcite]{ltugboat}
+\usepackage{mflogo}
+
+\usepackage{url}
+\usepackage[dvips]{graphicx}
+
+\newcommand{\AVN}{\meta{avn}}
+\newcommand{\LVN}{\meta{lvn}}
+\newcommand{\APN}{\meta{apn}}
+\newcommand{\LPN}{\meta{lpn}}
+\newcommand{\AFN}{\meta{afn}}
+\newcommand{\LFN}{\meta{lfn}}
+\newcommand{\CN}{\meta{cl}}
+\newcommand{\IN}{\meta{obj}}
+\newcommand{\VL}{\meta{vl}}
+\newcommand{\VSL}{\meta{vsl}}
+\newcommand{\HEXCOL}{\meta{hc}}
+\newcommand{\COL}{\meta{col}}
+\newcommand{\STR}{\meta{str}}
+\newcommand{\PAIR}{\meta{pair}}
+\newcommand{\NUM}{\meta{num}}
+\newcommand{\BOOL}{\meta{bool}}
+
+\newcommand{\tc}{\texttt{,}}
+
+\newenvironment{todo}{\begin{bfseries}}{\end{bfseries}}
+
+%% this command is already defined in ltugboat.cls and is more robust
+%% I think....
+%\newcommand\meta[1]{$\langle$\mbox{\textit{#1}}$\rangle$}
+%%% the following is the ltugboat.cls definition
+%\DeclareRobustCommand\meta[1]{%
+% \ensuremath{\langle}\emph{#1}\ensuremath{\rangle}}
+
+\let\m=\meta % <-- this command is never used.
+
+%%%%%TUGboat production-specific files
+\vol 18, 4. % volume, issue.
+\issueseqno=57 % sequential issue number
+\issdate December 1997. % month, year of publication
+\setcounter{page}{274}
+\NoBlackBoxes
+\PrelimDraftfalse
+
+\widowpenalty=10000
+\clubpenalty=10000
+\renewcommand{\topfraction}{0.9}
+\renewcommand{\bottomfraction}{0.5}
+\renewcommand{\floatpagefraction}{0.8}
+\renewcommand{\textfraction}{0.1}
+\setcounter{bottomnumber}{2}
+\setcounter{totalnumber}{4}
+\renewcommand{\dbltopfraction}{0.9}
+\renewcommand{\dblfloatpagefraction}{0.8}
+\pretolerance=500
+\tolerance=1000
+\hbadness=3000
+\vbadness=3000
+\hyphenpenalty=400
+%%%%%%%END of TUGboat production-specific files
+
+\begin{document}
+
+\sectitle{Graphics Applications}
+
+\title{Creating 3D animations with \MP}
+\author{Denis Roegel}
+\address{CRIN (Centre de Recherche en Informatique de Nancy)\\
+ B\^atiment LORIA\\
+ BP 239\\
+ 54506 Vand\oe uvre-l\`es-Nancy\\
+ FRANCE}
+\netaddress{roegel@loria.fr}
+\personalURL{http://www.loria.fr/~roegel}
+
+
+
+\maketitle
+
+\begin{abstract}
+\MP{} can be used to create animations. We show here an example
+of animation of polyhedra, introducing the \texttt{3d} package.
+\end{abstract}
+
+\section{Introduction}
+
+%%%RF 1998/02/19: N-forms of cite
+\MP{} (\citeN{hobby1992}; see also the description in
+\shortciteN{Goossens:LGC97})
+is a drawing language very similar to \MF,
+but whose output is \PS. \MP{} is especially suited for geometrical
+and technical drawings, where a drawing can naturally be decomposed
+in several parts, related in some logical way.
+%%%RF 1998/02/19: active voice for passive
+Knuth is using \MP{} for the revisions of and additions to
+\emph{The Art Of Computer Programming}~\cite{knuth1997},
+and it is or will be a component of every standard \TeX{} distribution.
+
+Unfortunately, \MP{} is still quite bare and the user is only offered
+%%%RF 1998/02/19: revamped a bit
+the raw power\Dash a little bit like the \TeX{} user who only has
+plain \TeX{} at his/her disposal. The lack of libraries is certainly
+due to the infancy of \MP{} (which came in the public domain at the
+beginning of 1995) and thus to the small number of its users.
+
+In this paper, we present a way to produce animations using \MP.
+The technique is quite general and we illustrate it through the \texttt{3d}
+package.
+
+\section{Animations}
+
+The World Wide Web has accustomed us to various animations,
+especially \texttt{java} animations.
+Common components of web pages are animated GIF images.
+
+Producing animations in \MP{} is actually quite easy. A number of
+$n$ images will be computed and their sequence produces the animation.
+The animation will be similar to a movie, with no interaction. More precisely,
+if \verb|an_image(|$i$\verb|)|
+produces a picture parameterized by $i$,
+it suffices to wrap this macro
+between \verb|beginfig| and \verb|endfig|:
+
+\begin{verbatim}
+def one_image_out(expr i)=
+ beginfig(<figure number>);
+ an_image(i);
+ endfig;
+enddef;
+\end{verbatim}
+
+\noindent and to loop over \verb|one_image_out|:
+
+\begin{verbatim}
+for j:=1 upto 100:one_image_out(j);endfor;
+\end{verbatim}
+
+Assuming that \verb|<figure number>|
+is equal to the parameter of \verb|an_image|,
+the compilation of this program will produce
+a hundred files with extensions \verb|.1|, \verb|.2|, \ldots, \verb|.100|.
+All these files are \PS{} files and all we need to do is to find a way
+to collate them in one piece. How to do this depends on the operating
+system. On UNIX for instance, one can use \texttt{Ghostscript}
+to transform a \PS{} file
+into \texttt{ppm} and then transform each \texttt{ppm} file into
+GIF with \texttt{ppmtogif}. These programs are part of the
+\texttt{NETPBM} package~\cite{netpbm}. Finally, a program such as
+\texttt{gifmerge}~\cite{gifmerge}
+creates an animated GIF file (GIF89A)
+out of the hundred individual simple GIFs.
+However, various details must be taken care of. For instance,
+%%%RF 1998/02/19: reorganised around `grabbed'->`needed'
+only a part of \texttt{Ghostscript}'s output is needed
+and selection can be made with \texttt{pnmcut}.
+%(which is also part of \texttt{NETPBM}).
+
+The whole process of creating an animation out of \MP's outputs can
+be summed up in a shell script, similar to the one
+in figure~\ref{animation-script}. As we will see, this script (including
+the arguments of \texttt{awk} and \texttt{pnmcut}) can be generated
+automatically by \MP{} itself.
+
+%%fig 1
+\begin{figure*}
+\begin{verbatim}
+#! /bin/sh
+
+/bin/rm -f animpoly.log
+for i in `ls animpoly.*| grep 'animpoly.[0-9]'`;do
+echo $i
+echo '=============='
+# shift each picture so that it lies in the page:
+awk < $i '{print} /^%%Page: /{print "172 153 translate\n"}' > $i.ps
+# produce ppm format:
+gs -sDEVICE=ppmraw -sPAPERSIZE=a4 -dNOPAUSE -r36 -sOutputFile=$i.ppm -q -- $i.ps
+/bin/rm -f $i.ps
+# produce gif:
+ppmquant 32 $i.ppm | pnmcut 15 99 141 307 | ppmtogif > `expr $i.ppm : '\(.*\)ppm'`gif
+/bin/rm -f $i.ppm
+done
+/bin/rm -f animpoly.gif
+# merge the gif files:
+gifmerge -10 -l1000 animpoly.*.gif > animpoly.gif
+/bin/rm -f animpoly.*.gif
+\end{verbatim}
+\caption{Script created by \MP{} (with some additional comments)}
+\label{animation-script}
+\end{figure*}
+
+
+\section{Objects in space}
+
+\subsection{Introduction}
+
+The author applied this idea to the animation of objects
+in space. The macros in the \texttt{3d.mp} package\footnote{On CTAN,
+under \texttt{graphics/metapost/macros/3d}. The code is documented
+with \texttt{MFT}~\cite{knuth1989}
+and illustrated with \MP. This paper describes version 1.0 of the macros.}
+provide a basis for the
+representation of three-dimensional objects. The basic components of
+the objects are the points or the vectors. Both are stored as triplets.
+More precisely, we have three
+arrays\footnote{\MP{} has a few simple types such as \texttt{numeric},
+\texttt{boolean}, \texttt{string}, \texttt{path}, \ldots.
+It also has pairs (\texttt{pair}) and triples (\texttt{color}). We might
+have cheated and stored points as colors, but instead, we found it
+interesting to illustrate a construction equivalent
+to \textsc{Pascal}'s records or C's structures. In \MP, instead of
+having a list or an array of structures, we use several lists or arrays,
+so that a record is a cross-section over several arrays.}
+of type \verb|numeric|:
+
+\begin{verbatim}
+numeric vect[]x,vect[]y,vect[]z;
+\end{verbatim}
+
+Vector $i$'s components are \verb|vect[|$i$\verb|]x|, \verb|vect[|$i$\verb|]y|
+and \verb|vect[|$i$\verb|]z|. It is then straightforward to define the usual
+operations on vectors using this convention. For instance,
+vector addition is defined as:
+
+\begin{verbatim}
+def vect_sum(expr k,i,j)=
+ vect[k]x:=vect[i]x+vect[j]x;
+ vect[k]y:=vect[i]y+vect[j]y;
+ vect[k]z:=vect[i]z+vect[j]z;
+enddef;
+\end{verbatim}
+
+Often, we need some scratch vectors or vectors local to a macro.
+A simple vector allocation mechanism solves the problem: we use a stack
+of vectors and we reserve and free vectors only on top of the stack.
+For instance, the allocation of a vector is defined by:
+
+\begin{verbatim}
+def new_vect=incr(last_vect_) enddef;
+\end{verbatim}
+
+\noindent where \verb|last_vect_| is the index of the top of the stack.
+Hence, a vector is manipulated by its index on the stack.
+Writing \verb|v:=new_vect;| lets \verb|v| be the index of the newly allocated
+vector.
+
+Freeing a vector is also easy and is only allowed at the top of the stack:
+
+\begin{verbatim}
+def free_vect(expr i)=
+ if i=last_vect_:
+ last_vect_:=last_vect_-1;
+ else: errmessage("Vector " &
+ decimal i & " can't be freed!");
+ fi;
+enddef;
+\end{verbatim}
+
+How these macros are used is made explicit in the \verb|vect_rotate| macro
+which does a rotation of a vector \verb|v| around a vector \verb|axis|
+by an angle \verb|alpha|. This rotation is illustrated
+in figure~\ref{vector-rotation}.
+$\vec{v}$ is written as the sum of $\vec{h}$ and $\vec{a}$ where
+$\vec{h} \perp \vec{a}$. If $\vec{b}$ is
+$\overrightarrow{axis}/{\|\overrightarrow{axis}\|}$, $\vec{c}$ is computed
+as the vector product of $\vec{b}$ and $\vec{a}$ and $\vec{a}$ is then
+rotated in a simple way resulting in $\vec{f}$.
+
+The vectors declared with \verb|new_vect| are freed in the inverse order.
+The \verb|vect_rotate| macro makes use of a few other macros:
+\verb|vect_mod| computes the modulus of a vector; \verb|vect_dprod(a,b)| is
+the dot product of vectors \texttt{a} and \texttt{b}; \verb|vect_mult(b,a,x)|
+lets vector \texttt{b} equal vector \texttt{a} multiplied by the scalar
+\texttt{x}; \verb|vect_sum| and \verb|vect_diff| compute as their first
+argument the sum or the difference of the two other vectors;
+\verb|vect_prod(c,a,b)| lets vector \texttt{c} equal the vectorial
+product of vectors \texttt{a} and \texttt{b}. These macros are
+described in appendix A.
+
+%% fig2
+\begin{figure*}
+\begin{center}
+\includegraphics{vect-fig.9}\hspace{1cm}\includegraphics{vect-fig.10}
+\end{center}
+\caption{Vector rotation}\label{vector-rotation}
+\end{figure*}
+
+\begin{verbatim}
+vardef vect_rotate(expr v,axis,alpha)=
+ save v_a,v_b,v_c,v_d,v_e,v_f;
+ v_a:=new_vect;v_b:=new_vect;
+ v_c:=new_vect;v_d:=new_vect;
+ v_e:=new_vect;v_f:=new_vect;
+ v_g:=new_vect;v_h:=new_vect;
+ vect_mult(v_b,axis,1/vect_mod(axis));
+ vect_mult(v_h,v_b,vect_dprod(v_b,v));
+ vect_diff(v_a,v,v_h);
+ vect_prod(v_c,v_b,v_a);
+ vect_mult(v_d,v_a,cosd(alpha));
+ vect_mult(v_e,v_c,sind(alpha));
+ vect_sum(v_f,v_d,v_e);
+ vect_sum(v,v_f,v_h);
+ free_vect(v_h);free_vect(v_g);
+ free_vect(v_f);free_vect(v_e);
+ free_vect(v_d);free_vect(v_c);
+ free_vect(v_b);free_vect(v_a);
+enddef;
+\end{verbatim}
+
+The \verb|3d| package defines other macros in order to set the observer,
+%%%RF 1998/02/19: was `to manipulate'
+to compute a reference matrix, etc. Provision is given for
+manipulating objects.
+
+\subsection{Objects and classes}
+
+The \texttt{3d} package understands a notion of \emph{class}.
+A \emph{class} is a parameterized object. For instance, we have the class
+of regular tetrahedra, the class of regular cubes, etc. Our classes
+%%%RF 1998/02/19: `first level of genericity'->... abstraction
+are the lowest level of abstraction and classes can not be composed.
+They can only be \emph{instanciated}. When we need a specific tetrahedron,
+we call a generic function to create a tetrahedron, but with an identifier
+specific to one instance.
+
+A class is a set of vertices in space, together with a way to draw
+faces, and therefore edges.
+The author's focus was to manipulate (and later animate) polyhedra.
+As an example, the \verb|poly.mp| package provides the definition of
+each of the five regular convex polyhedra.
+
+%%%RF 1998/02/19: `is defining'->defines, etc, `both macros'->`each macro'
+Each class consists of two macros: one defines the points,
+the other calls the first macro and defines the faces.
+Each macro has a parameter which is a string identifying
+the particular instance of that class.
+
+\tolerance=4500
+The points of a regular tetrahedron are defined in
+\verb|set_tetrahedron_points|,
+%%%RF 1998/02/19: second half sentence rewritten
+an example of the general macro name \verb|set_|\meta{class}\verb|_points|.
+Five points are defined, four of
+them with \verb|set_obj_point|, a macro which defines points \emph{local}
+to an object. The first four points are the vertices and the fifth
+is the center of the tetrahedron. \verb|set_obj_point|'s first parameter
+is the point number and the other three are the cartesian coordinates.
+The first three points are in a plane and the fourth is obtained with
+the \verb|new_face_point| macro, which folds a face
+%%%RF 1998/02/19: tagged reference sentence on to end in parens
+(see the description in appendix A for more details).
+The \verb|new_face_point| macro
+is used with the angle \verb|an| which is computed in advance.
+Once the four points are set, the object is normalized, which means
+that it is centered with respect to the list of vertices given
+as parameter (here \verb|1,2,3,4|) and the last vertex is put on a sphere
+of radius 1, centered on the origin. Therefore, point 5 is the center
+of the tetrahedron, and the tetrahedron is set symmetrically
+with respect to the origin.
+
+\tolerance=1000
+%%%RF 1998/02/19: was `are hence inscriptible'
+All five convex regular polyhedra are defined in this way and may
+therefore be inscribed in a sphere of radius 1.
+
+\begin{verbatim}
+def set_tetrahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);
+ sinan=1/sqrt(3);
+ cosan=sqrt(1-sinan**2);
+ an=180-2*angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ normalize_obj(inst)(1,2,3,4);
+ set_obj_point(5,0,0,0);
+enddef;
+\end{verbatim}
+
+The second macro, \verb|def_tetrahedron| defines the number of points and
+faces of the instance, calls the previous macro and defines the faces
+with the macro \verb|set_obj_face|.
+The first argument of that macro is a \emph{local}
+face number, the second is a list of vertices such that the list goes clockwise
+when the face is visible. The last argument is the color of the face in RGB.
+
+\begin{verbatim}
+vardef def_tetrahedron(expr inst)=
+ new_obj_points(inst,5);
+ new_obj_faces(inst,4);
+ set_tetrahedron_points(inst);
+ set_obj_face(1,"1,2,4","b4fefe");
+ set_obj_face(2,"2,3,4","b49bc0");
+ set_obj_face(3,"1,4,3","b4c8fe");
+ set_obj_face(4,"1,3,2","b4fe40");
+enddef;
+\end{verbatim}
+
+The result of the drawing is:
+
+\begin{center}
+\includegraphics{tetra.ps}
+\end{center}
+
+A more complex example is the icosahedron which is defined below.
+
+\begin{verbatim}
+def set_icosahedron_points(expr inst)=
+ set_obj_point(1,0,0,0);
+ set_obj_point(2,1,0,0);
+ set_obj_point(3,cosd(60),sind(60),0);
+ cosan=1-8/3*cosd(36)*cosd(36);
+ sinan=sqrt(1-cosan*cosan);
+ an=180-angle((cosan,sinan));
+ new_face_point(4,1,2,3,an);
+ new_face_point(5,2,3,1,an);
+ new_face_point(6,3,1,2,an);
+ new_face_point(7,2,4,3,an);
+ new_face_point(8,3,5,1,an);
+ new_face_point(9,1,6,2,an);
+ new_face_point(10,3,4,7,an);
+ new_face_point(11,3,7,5,an);
+ new_face_point(12,1,8,6,an);
+ % 1 and 10 are opposite vertices
+ normalize_obj(inst)(1,10);
+ % center of icosahedron
+ set_obj_point(13,0,0,0);
+enddef;
+\end{verbatim}
+
+\begin{verbatim}
+vardef def_icosahedron(expr inst)=
+ save cosan,sinan,an;
+ new_obj_points(inst,13);
+ new_obj_faces(inst,20);
+ set_icosahedron_points(inst);
+ set_obj_face(1,"3,2,1","b40000");
+ set_obj_face(2,"2,3,4","ff0fa1");
+ set_obj_face(3,"3,7,4","b49b49");
+ set_obj_face(4,"3,5,7","b49bc0");
+ set_obj_face(5,"3,1,5","b4c8fe");
+ set_obj_face(6,"1,8,5","b4fefe");
+ set_obj_face(7,"1,6,8","b4fe40");
+ set_obj_face(8,"1,2,6","45d040");
+ set_obj_face(9,"2,9,6","45a114");
+ set_obj_face(10,"2,4,9","45a1d4");
+ set_obj_face(11,"9,4,10","4569d4");
+ set_obj_face(12,"4,7,10","112da1");
+ set_obj_face(13,"7,5,11","b4fefe");
+ set_obj_face(14,"5,8,11","b49bc0");
+ set_obj_face(15,"8,6,12","45a114");
+ set_obj_face(16,"6,9,12","b49b49");
+ set_obj_face(17,"8,12,11","b40000");
+ set_obj_face(18,"7,11,10","45a1d4");
+ set_obj_face(19,"12,10,11","b4c8fe");
+ set_obj_face(20,"9,10,12","ff0fa1");
+enddef;
+\end{verbatim}
+
+Since all points of the objects are stored in a unique global array,
+they are internally
+accessed by the local numbers and an offset defined by the
+macro \verb|new_obj_points|.
+The icosahedron example shows a systematic use of the
+\verb|new_face_point| macro to compute a point on an adjacent face.
+Displaying such an icosahedron results in the figure~\ref{icosahedron}.
+%% fig3
+\begin{figure}[h]
+\begin{center}
+\includegraphics{icosa.ps}
+\end{center}
+\caption{An icosahedron}\label{icosahedron}
+\end{figure}
+
+The other three regular convex polyhedra are:
+\begin{center}
+\includegraphics{cube.ps}
+\end{center}
+
+\begin{center}
+\includegraphics{octa.ps}\hfill\includegraphics{dodeca.ps}
+\end{center}
+
+The dodecahedron code is a bit special, since the vertices are built
+using ten additional points corresponding to face centers. These points
+are defined as an array of variables \verb|fc1| through \verb|fc10|
+with \verb|new_points(fc)(10)|.
+\verb|free_points(fc)(10)| frees them when they are no longer
+necessary. An excerpt of the dodecahedron code is:
+
+\begin{verbatim}
+def set_dodecahedron_points(expr inst)=
+ new_points(fc)(10);% face centers
+ set_point(fc1,0,0,0);
+ set_obj_point(1,1,0,0);
+ set_obj_point(2,cosd(72),sind(72),0);
+ rotate_in_plane(3,fc1,1,2);
+ ...
+ free_points(fc)(10);
+enddef;
+\end{verbatim}
+
+
+Finally, wire drawings can be obtained by setting the boolean
+\verb|filled_faces| to false:
+
+\begin{center}
+\includegraphics{icosa-w.ps}
+\end{center}
+
+\subsection{Animating objects}
+
+The animation of one or several objects involves the object(s) and an observer.
+The animation is a set of images and from an image to the next one,
+the observer as well as the objects can move. For instance
+the macro \verb|one_image| in \verb|3d.mp| is:
+
+\begin{verbatim}
+def one_image(expr name,i,a,rd,ang)=
+ beginfig(i);
+ set_point(Obs,
+ -rd*cosd(a*ang),-rd*sind(a*ang),1);
+ Obs_phi:=90;Obs_dist:=2;
+ % fix point 1 of object |name|
+ point_of_view_obj(name,1,Obs_phi);
+ draw_obj(name);
+ rotate_obj_pv(name,1,vect_I,ang);
+ % show the rotation point
+ draw_point(name,1);
+ draw_axes(red,green,blue);
+ endfig;
+enddef;
+\end{verbatim}
+
+The parameters of this macro are a name of an object (\verb|name|),
+an image index (\verb|i|), and three values defining the position
+of the observer.
+The observer (\verb|Obs| is a global point and set with \verb|set_point|,
+not with \verb|set_obj_point|)
+follows a circle of radius \verb|rd|.
+%%%RF 1998/02/19: reversed `usually is'
+The parameter \verb|a|, which is usually a function of \verb|i|,
+determines the number of rotation steps
+of the observer, each step being a rotation of angle \verb|ang|.
+The distance between the observer and the
+projection plane is $2$ (see figure~\ref{proj-screen}).
+
+%% fig4
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.8}
+\end{center}
+\caption{Projection on the screen}\label{proj-screen}
+\end{figure*}
+
+%% fig5
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.16}
+\end{center}
+\caption{Orientation of the observer}\label{obs-orientation}
+\end{figure*}
+
+
+The orientation of the observer is defined by three angles
+(see figure~\ref{obs-orientation}). The \verb|Obs_phi| angle
+is given and the two others are computed with a call to
+\verb|point_of_view_obj(name,1,Obs_phi)| which constrains the observer
+to look towards point 1 of object \verb|name|. Therefore, this
+point will seem fixed on the animation and \verb|draw_point(name,1)|
+draws it later so that this feature can be observed.
+There is nothing special about that point, except that it
+remains fix when the object is rotated. The object is drawn
+with \verb|draw_obj(name)| and
+%%%RF 1998/02/19: `does rotate'->rotates -- these arguments aren't
+%%% described here, which seems wrong, but i don't think
+%%% it's easy to do better....
+\verb|rotate_obj_pv| rotates the object \verb|name|
+by \verb|ang| degrees around an axis going through point 1
+and directed by vector \verb|vect_I| ($\vec{\imath}$).
+The reference vectors ($\vec\imath$,
+$\vec\jmath$ and $\vec k$) are drawn in red, green and blue with
+\verb|draw_axes|.
+
+Finally, a complete animation of an icosahedron is obtained
+with
+
+\begin{verbatim}
+animate_object("icosahedron",1,100,100);
+\end{verbatim}
+
+%%%RF 1998/02/19: `and this'->`which'
+\noindent which generates files \verb|anim.101|,
+%%%RF 1998/02/19: `if ... is'->`from ...'
+\ldots, \verb|anim.200| from the main file \verb|anim.mp|.
+The first parameter of \verb|animate_object| is the name of the object
+to animate, the second and third parameters are minimal and maximal
+values of the index loop and the fourth parameter is an offset added
+to the index loop in order to get the file extension, which must lie
+in the interval $0..4096$.
+
+After each image is drawn, the values of the current bounding box
+are used to compute the bounding box of the sequence of images.
+The internal values \verb|xmin_|, \verb|ymin_|, \verb|xmax_|
+and \verb|ymax_| hold the minimal and maximal values of the coordinates
+of the past images' corners.
+They are updated just before each image is shipped out.
+
+\subsection{Putting the pieces together}
+
+Once all the views have been computed, they can be used separately
+(see for instance the five views of figure~\ref{anim-five-views})
+or more interestingly, they can be merged.
+This task is made almost straightforward by \MP{} itself.
+Indeed, every time \verb|animate_object| is used, a shell script
+named \verb|create_animation.sh|
+is generated, as a side-effect of a call to
+\verb|show_animation_bbox|. The script is
+similar to that shown in figure~\ref{animation-script}.
+This script uses the values
+computed for the global bounding box of the sequence of images,
+for these values are necessary in order to extract the right parts
+of the images and get correct alignments; the parts are extracted
+with \texttt{pnmcut}.\footnote{One might think of using
+\texttt{Ghostscript} for generating an excerpt of an image,
+but if \texttt{Ghostscript} is used to generate the bounding box
+of an image, it will in general not be possible to have a good alignment
+between all images. The sizes of the excerpts are only known when all images
+have been produced.}
+If you have the programs
+used in this script (\texttt{Ghostscript}, etc.), you can just run
+it with \verb|sh create_animation.sh| on UNIX. You may need
+to adapt it to your needs, and for that purpose, you can modify the macro
+\verb|write_script| in \verb|3d.mp|.
+
+Some examples are included in the \verb|3d| distribution, and they
+can be viewed for instance with \texttt{netscape} or
+special programs such as \verb|xanim|.
+
+%% fig6
+\begin{figure*}
+\includegraphics[scale=0.5]{anim.1}\hfill
+\includegraphics[scale=0.5]{anim.2}\hfill
+\includegraphics[scale=0.5]{anim.3}\hfill
+\includegraphics[scale=0.5]{anim.4}\hfill
+\includegraphics[scale=0.5]{anim.5}
+
+\caption{Five views of an animation}\label{anim-five-views}
+\end{figure*}
+
+\section{Future}
+
+It is quite easy to improve and extend the \verb|3d| macros but the
+author decided to go no further for the moment. Other objects can
+be implemented easily and new algorithms can be added. For instance
+in order to take light sources or shadows into account, one can compute
+the angles under which a face gets its light, and the angle under which
+this very face is seen, in order to decide how much darker or lighter
+it must be rendered. Another problem is to represent
+overlapping objects correctly. In the current implementation, each
+object is drawn
+independently from the other objects, so that the overlapping may be wrong.
+One solution is to sort all the faces according to their distance
+to the observer and, if two faces can not be ordered, to split them.
+Then, the faces can be drawn starting with the most distant, and
+ending with the closest one.
+Appendix B explains the internal representation of the objects and
+shows that this algorithm can be implemented without much surgery to
+the present code.
+
+\section{Acknowledgments}
+
+Thanks to John Hobby who always answers all my queries on the \MF{} mailing
+list. Thanks to Alain Filbois who helped me with the shell script
+syntax, to Thomas Lambolais and Thomas Genet who gave some feedback
+on this work, and to Dominique Larchey who pointed out a shortcoming
+in the conclusion. Thanks to Denis Barbier who
+was one of the first users of these
+macros and contributed the animated crayons in the distribution. Thanks to
+Bogus\l aw Jackowski who made valuable comments on some peculiarities of
+the code.
+And finally, special thanks to Ulrik Vieth who not only
+pushed me to polish my code and this paper more than I had first intended,
+but also made it possible to use \MP{} under \texttt{web2c}.
+
+\bibliography{paper}
+
+\appendix
+
+\section{Appendix A\\
+Summary of the \texttt{3d} package}
+
+\subsection{Types}
+
+The commands in the \texttt{3d} package take parameters
+of several different types. The types are described here.
+
+\begin{itemize}
+\item An \AVN{} (\emph{Absolute Vector Number}) is the internal
+number identifying a vector in the \verb|vect| array (an integer).
+\item An \APN{} (\emph{Absolute Point Number}) refers to a vector
+in the same way as an \AVN{} (an integer).
+\item A \LPN{} (\emph{Local Point Number}) is a number identifying a
+point \emph{within} an object (an integer). Two \LPN{}s with the same value
+can correspond to different points in different objects.
+\item An \AFN{} (\emph{Absolute Face Number}) is the internal
+number identifying a face.
+\item A \LFN{} (\emph{Local Face Number}) is a number identifying a face
+\emph{within} an object (an integer). As for points, two \LFN{}s with
+the same value
+can correspond to different faces in different objects.
+\item A \CN{} (\emph{Class}) is a string representing a class,
+for instance \verb|"tetrahedron"|. It may only contain
+letters and underscores.
+\item An \IN{} (\emph{Object}) is a string representing an object, that is
+an instance of a class. Such a string may only contain
+letters and underscores.
+\item A \VL{} (\emph{Vertex List}) is a list
+of integers, where each integer identifies a vertex. For instance, \verb|1,7|
+is the list of vertices 1 and 7.
+\item A \VSL{} (\emph{Vertex String List}) is a string corresponding to a list
+of integers, where each integer identifies a vertex. For instance,
+\verb|"1,2,6,5"| is the list of vertices 1, 2, 6 and 5.
+\item \HEXCOL{} (\emph{Hex Color}) is a string representing a color with
+the three RGB components in hexadecimal and in the range
+$0..255$. For instance, \verb|"b4fe40"|.
+\item \COL{} (\emph{Color}) is a standard \MP{} color
+(a triplet of RGB components in the range $0..1$),
+such as \verb|red|.
+\item \STR{} (\emph{String}) is a string.
+\item \PAIR{} (\emph{Pair}) is a pair of numerics.
+\item \NUM{} (\emph{Numeric}) is a number.
+\item \BOOL{} (\emph{Boolean}) is a boolean.
+\end{itemize}
+
+\subsection{Low level vector commands}
+
+The low level vector commands define the classical operations in vector
+algebra.
+
+\begin{itemize}
+%\item \verb|vect_def(|\AVN\tc$x$\tc$y$\tc$z$\verb|)|; defines vector \AVN{}
+\item \verb|vect_def(|\AVN\tc$x$\tc$y$\tc$z$\verb|)|: defines vector \AVN{}
+as $(x,y,z)$;
+
+%\item \verb|set_point|: synonym of \verb|vect_def|; a point is stored in the
+\item \verb|set_point|; synonym of \verb|vect_def|: a point is stored in the
+same array as vectors.
+
+%\item \verb|set_obj_point(|\LPN\tc$x$\tc$y$\tc$z$\verb|)|;
+\item \verb|set_obj_point(|\LPN\tc$x$\tc$y$\tc$z$\verb|)|:
+this defines the point \LPN{} as $(x,y,z)$;
+
+%\item \verb|vect_def_vect(|\AVN$_1$\tc\AVN$_2$\verb|)|;
+\item \verb|vect_def_vect(|\AVN$_1$\tc\AVN$_2$\verb|)|:
+vector \AVN$_1$ becomes equal to vector \AVN$_2$;
+
+\item \verb|vect_sum(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$ becomes the sum of vectors \AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_translate(|\AVN$_1$\tc\AVN$_2$\verb|)|:
+add vector \AVN$_2$
+to vector \AVN$_1$; vector \AVN$_2$ remains unchanged.
+
+\item \verb|vect_diff(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$
+becomes the difference between vectors \AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_dprod(|\AVN$_1$\tc\AVN$_2$\verb|)| $\rightarrow $ \NUM{}:
+returns the dot product of vectors \AVN$_1$ and \AVN$_2$.
+
+\item \verb|vect_mod(|\AVN\verb|)| $\rightarrow $ \NUM{}: returns the
+modulus of vector \AVN.
+
+\item \verb|vect_prod(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+the vector \AVN$_1$
+becomes the vector product of vectors \AVN$_2$ and \AVN$_3$.
+
+\tolerance=1000
+\item \verb|vect_mult(|\AVN$_1$\tc\AVN$_2$\tc\NUM\verb|)|: \AVN$_1$
+becomes vector \AVN$_2$ scaled by \NUM.
+
+\item \verb|mid_point(|\AVN$_1$\tc\AVN$_2$\tc\AVN$_3$\verb|)|:
+vector (or point) \AVN$_1$ becomes the mid-point of vectors (or of the
+line joining the points)
+\AVN$_2$ and \AVN$_3$.
+
+\item \verb|vect_rotate(|\AVN$_1$\tc\AVN$_2$\tc$a$\verb|)|: vector \AVN$_1$ is
+rotated around vector \AVN$_2$ by the angle $a$.
+\end{itemize}
+
+\tolerance=1000
+\subsection{Operations on objects}
+
+Several operations apply globally on objects:
+
+\begin{itemize}
+\item \verb|assign_obj(|\IN\tc\CN\verb|)|:
+ create \IN{} as an instance of class \CN.
+\item \verb|reset_obj(|\IN\verb|)|: put \IN{} back where it
+ was just after it was initialized.
+\item \verb|put_obj(|\IN\tc\AVN\tc$s$\tc$\psi$\tc$\theta$\tc$\phi$\verb|)|:
+ object \IN{} is scaled by $s$, shifted by vector \AVN{} and
+ oriented with the angles $\psi$, $\theta$, $\phi$,
+ as for the observer orientation (figure~\ref{obs-orientation}).
+\item \verb|rotate_obj_pv(|\IN\tc\LPN\tc\AVN\tc$a$\verb|)|:
+ object \IN{} is rotated
+ around an axis going through local point \LPN{}
+ and directed by vector \AVN; the rotation is by $a$ degrees.
+\item \verb|rotate_obj_abs_pv(|\IN\tc\APN\tc\AVN\tc$a$\verb|)|:\break
+ the object \IN{} is rotated around an axis going through absolute
+ point \APN{} and directed by vector \AVN; the rotation is by $a$ degrees.
+\item \verb|rotate_obj_pp(|\IN\tc\LPN$_1$\tc\LPN$_2$\tc$a$\verb|)|:
+ \IN{} is rotated around an axis going through local points
+ \LPN$_1$ and \LPN$_2$; the rotation is by $a$ degrees.
+\item \verb|translate_obj(|\IN\tc\AVN\verb|)|: object \IN{} is translated
+ by vector \AVN.
+\item \verb|scale_obj(|\IN\tc$v$\verb|)|: object~\IN{}~is~scaled~by~$v$.
+\end{itemize}
+
+\subsection{Building new points in space}
+
+Three macros are especially useful for the definition of regular polyhedra:
+
+\begin{itemize}
+\item \verb|rotate_in_plane(|$k$\tc$o$\tc$i$\tc$j$\verb|)|:
+get point $k$ from point $j$ by rotation
+around point $o$ by an angle $\alpha$ equal to the angle from $i$ to $j$;
+$i$, $j$ and $k$ are of type \LPN, whereas $o$ is of type \APN.
+
+\begin{center}
+ \includegraphics{vect-fig.11}
+\end{center}
+
+\item \verb|new_face_point(|$c$\tc$o$\tc$i$\tc$j$\tc$\alpha$\verb|)|:
+the middle $m$ of points $i$ and $j$ is such that
+$\widehat{(\overrightarrow{om},\overrightarrow{mc})}=\alpha$
+and $\overrightarrow{mc}$ is $\overrightarrow{om}$ rotated around
+$\overrightarrow{ji}$. $c$, $o$, $i$ and $j$ are of type \LPN.
+
+\begin{center}
+ \includegraphics{vect-fig.7}
+\end{center}
+
+\item \verb|new_abs_face_point(|$c$\tc$o$\tc$i$\tc$j$\tc$\alpha$\verb|)|:
+similar to the previous definition, but $c$ and $o$ are of type \APN.
+
+\end{itemize}
+
+\subsection{Drawing points, axes, objects}
+
+\begin{itemize}
+\item \verb|draw_point(|\IN\tc\LPN\verb|)|: draw point \LPN{} in
+ object \IN.
+\item \verb|draw_axes(|\COL$_1$\tc\COL$_2$\tc\COL$_3$\verb|)|:
+ draw vectors $\vec\imath$, $\vec\jmath$ and $\vec{k}$ in colors
+ \COL$_1$, \COL$_2$ and \COL$_3$.
+\item \verb|draw_obj(|\IN\verb|)|: draw object \IN.
+\end{itemize}
+
+\subsection{Setting faces}
+
+\begin{itemize}
+\item \verb|set_face(|\AFN\tc\VSL\tc\HEXCOL\verb|)|:
+set absolute face \AFN{} as
+delimited by the vertex list \VSL{} (local point numbers) and colored by
+color \HEXCOL.
+\item \verb|set_obj_face(|\LFN\tc\VSL\tc\HEXCOL\verb|)|:
+set local face \LFN{} as
+delimited by the vertex list \VSL{} (local point numbers) and colored by
+color \HEXCOL.
+
+\end{itemize}
+
+\break
+
+\subsection{View points, distance}
+
+\begin{itemize}
+\item \verb|compute_reference(|$\psi$\tc$\theta$\tc$\phi$\verb|)|: defines
+the orientation of the observer by the three angles $\psi$,
+$\theta$ and $\phi$. See figure~\ref{obs-orientation}.
+
+\item \verb|point_of_view_obj(|\IN\tc\LPN\tc$\phi$\verb|)|: the orientation
+of the observer is defined as looking local point \LPN{} of object \IN,
+with an angle of $\phi$;
+\item \verb|point_of_view_abs(|\APN\tc$\phi$\verb|)|: the observer's
+orientation is defined as looking absolute point \APN{},
+with an angle of $\phi$;
+\item \verb|obs_distance(|$v$\verb|)(|\IN\tc\LPN\verb|)|: let $v$ equal
+the distance between the observer and local point \LPN{} in object \IN{}.
+\end{itemize}
+
+\subsection{Vector and point allocation}
+
+\begin{itemize}
+\item \verb|new_vect|$\rightarrow $ \AVN{}: return a new vector;
+\item \verb|new_point|: synonym of \verb|new_vect|;
+\item \verb|new_points(|$v$\verb|)(|$n$\verb|)|: defines the absolute points
+ $v_1, \ldots, v_n$, using \verb|new_point|;
+\item \verb|free_vect(|\AVN\verb|)|: free vector \AVN;
+\item \verb|free_point(|\APN\verb|)|: free point \APN;
+\item \verb|free_points(|$v$\verb|)(|$n$\verb|)|: frees the absolute points
+ $v_1, \ldots, v_n$, using \verb|free_point|.
+\end{itemize}
+
+\subsection{Debugging}
+
+\begin{itemize}
+\item \verb|show_vect(|\STR\tc\AVN\verb|)|:
+shows vector \AVN, with string \STR.
+\item \verb|show_point|: synonym of \verb|show_vect|
+\item \verb|show_pair(|\STR\tc\PAIR\verb|)|: this shows a numeric pair,
+ with string \STR.
+\end{itemize}
+
+\subsection{Normalization}
+
+\begin{itemize}
+\item \verb|normalize_obj(|\IN\tc\VL\verb|)|: normalize object \IN{}
+with respect to the list of vertices \VL.
+\end{itemize}
+
+\subsection{Parameters}
+
+\begin{itemize}
+\item \verb|Obs_dist| $\rightarrow$ \NUM: distance between the observer
+ and the projection plane.
+\item \verb|h_field| $\rightarrow$ \NUM: horizontal field of view
+ (default: 100 degrees)
+\item \verb|v_field| $\rightarrow$ \NUM: vertical field of view
+ (default: 70 degrees)
+\item \verb|Obs_phi| $\rightarrow$ \NUM: angle $\phi$ for the orientation
+ of the observer;
+\item \verb|Obs_theta| $\rightarrow$ \NUM: angle $\theta$ for the orientation
+ of the observer;
+\item \verb|Obs_psi| $\rightarrow$ \NUM: angle $\psi$ for the orientation
+ of the observer;
+\item \verb|drawing_scale| $\rightarrow$ \NUM: scale factor applied for
+ drawing;
+\item \verb|filled_faces| $\rightarrow$ \BOOL: if \texttt{true}, the faces
+ are drawn filled; if \texttt{false}, only the edges are drawn,
+ and hidden edges are drawn dashed;
+\item \verb|draw_contours| $\rightarrow$ \BOOL: if \texttt{true}, the contours
+ of the faces are drawn, and the lines have the thickness
+ \verb|contour_width|; if \texttt{false}, the contours are not drawn;
+\item \verb|contour_width| $\rightarrow$ \NUM: dimension used for drawing
+ contours of faces (default: 1pt).
+\end{itemize}
+
+\subsection{Constants}
+
+These values represent constant objects such
+as reference vectors, and should not be changed.
+
+\begin{itemize}
+\item \verb|vect_null| $\rightarrow$ \AVN: internal index for $\vec0$.
+\item \verb|vect_I| $\rightarrow$ \AVN: internal index for $\vec\imath$.
+\item \verb|vect_J| $\rightarrow$ \AVN: internal index for $\vec\jmath$.
+\item \verb|vect_K| $\rightarrow$ \AVN: internal index for $\vec k$.
+\item \verb|point_null| $\rightarrow$ \APN: internal index for $\vec0$.
+\item \verb|Obs| $\rightarrow$ \APN: observer's internal point number.
+\end{itemize}
+
+\subsection{Defining new object points and faces}
+
+\begin{itemize}
+\item \verb|new_obj_points(|\IN\tc\NUM\verb|)|:
+ defines points $1$ to \NUM{} in object \IN; must be used before setting
+ the points;
+\item \verb|new_obj_faces(|\IN\tc\NUM\verb|)|:
+ defines \NUM{} faces in object \IN; must be used before setting
+ the faces;
+\end{itemize}
+
+\subsection{Offsets}
+
+\begin{itemize}
+\item \verb|pnt(|\LPN\verb|)| $\rightarrow$ \APN: returns the absolute point
+number for a given local point index.
+\item \verb|face(|\LFN\verb|)| $\rightarrow$ \AFN: returns the absolute face
+number for a given local face index.
+\end{itemize}
+
+\subsection{Standard classes}
+
+Five standard classes are defined in \texttt{poly.mp}:
+they define the five regular convex polyhedra. For each class \meta{class},
+there are two macros:
+
+\begin{itemize}
+
+\item \verb|set_|\meta{class}\verb|_points|
+ (e.g. \verb|set_cube_points|)
+
+\item \verb|def_|\meta{class} (e.g. \verb|def_cube|)
+
+\end{itemize}
+
+Each of these macros is defined with a parameter which is the instance
+name.
+
+\subsection{Standard animations}
+
+The \texttt{3d} package provides a few standard animations using
+the convex polyhedra. In each of these animations, the observer
+follows a circular path pictured in figure~\ref{observer-motion}.
+Each standard animation is divided into two macros. The first,
+such as \verb|animate_object|, defines the class(es) that are used
+and sets the objects. The second, such as \verb|one_image|, sets
+the observer, draws the object(s) and moves the object(s) and the
+observer. The file \verb|animpoly.mp| gives examples of the use
+of the standard animations.
+
+\iffalse
+\begin{itemize}
+\item \verb|one_image(name,i,a)|
+\item \verb|one_image_two_objects(name_a,name_b,i,a)|
+\item \verb|one_image_three_objects(name_a,name_b,name_c,i,a)|
+\item \verb|one_image_two_identical_objects(name_a,name_b,i,a)|
+\item \verb|animate_object(name,imin,imax,index)|
+\item \verb|animate_two_objects(name_a,name_b,imin,imax,index)|
+\item \verb|animate_three_objects(name_a,name_b,name_c,imin,imax,index)|
+\item \verb|animate_two_identical_objects(name,imin,imax,index)|
+\end{itemize}
+\fi
+
+%% fig7
+\begin{figure*}
+\begin{center}
+ \includegraphics{vect-fig.17}
+\end{center}
+\caption{Motion of the observer}\label{observer-motion}
+\end{figure*}
+
+\section{Appendix B\\
+Coding an object}
+
+In order to extend the \texttt{3d} package, it is necessary to
+understand how the objects are coded. We give here an overview of
+this coding, but the reader is advised to peek in the code to get
+a better understanding on how all the functions interact.
+
+First, an object has a name, for instance \verb|"box"|.
+The macro \verb|box_class| (which can be called with \verb|obj_class_("box")|)
+is the string corresponding to the class of
+\verb|"box"|, for instance \verb|"cube"|.
+The variable \verb|cube_point_offsetbox|, of type \texttt{numeric},
+and obtained with \verb|obj_point_offset_("box")|,
+is equal to the absolute index of the last
+point of the previous object. A cube is defined with $8+1$ points. Assuming
+it was defined after an icosahedron ($12+1$ points) named
+\verb|"ico"|, \verb|cube_point_offsetbox| will be a \verb|numeric|
+equal to $13$. \verb|cube_pointsbox|
+(obtained with \verb|obj_points_("box")|)
+is a macro equal to $9$.
+%(\verb|current_point_offset_| is equal to \verb|cube_point_offsetbox|.)
+The variable \verb|cube_face_offsetbox|,
+similar to \verb|cube_point_offsetbox|,
+obtained with a call to \verb|obj_face_offset_("box")|,
+equals $20$.
+The macro \verb|cube_facesbox|
+(obtained by \verb|obj_faces_("box")|)
+is equal to $6$.
+%(\verb|current_face_offset_| is equal to \verb|cube_face_offsetbox|.)
+
+The \verb|obj_name| macro is extended each time a new object is defined.
+To an absolute face number, it associates an object name. Hence, it is possible
+to go through all faces. \verb|last_point_offset_| and
+\verb|last_face_offset_| are the absolute numbers of the last points and faces
+defined up to now.
+
+\begin{verbatim}
+def obj_name(expr i)=
+ if i<1: elseif i<=20:"ico"
+ elseif i<=26:"box"
+ fi;
+enddef;
+\end{verbatim}
+
+\verb|pnt(i)| gives the absolute vector corresponding to local point $i$.
+\verb|ipnt_(i)| is the absolute point number, that is $i$ plus the number
+of points defined beforehand in other objects.
+\verb|points_[j]| is the absolute vector corresponding to absolute object
+point $j$. Similarly, \verb|face(i)|
+is the absolute face corresponding to local face $i$.
+
+The list of vertices of absolute face number $i$ is \verb|face_points_[i]|.
+The color of absolute face number $i$ is \verb|face_color_[i]|.
+
+
+When the macros \verb|pnt| or \verb|face| are to be used, the calls
+\verb|define_current_point_offset_("box")| and
+\verb|define_current_face_offset_("box")| must be issued.
+
+
+\makesignature
+
+\end{document}
+
diff --git a/Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdf b/Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdf
new file mode 100644
index 00000000000..bf7e2d0fff6
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdf
Binary files differ