From 5dc602d16c5be2fd035b254ca23484a90aebd6dc Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 9 Jan 2006 00:45:48 +0000 Subject: doc 5 git-svn-id: svn://tug.org/texlive/trunk@81 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/metapost/mp3d/README | 84 ++ .../doc/metapost/mp3d/examples/cube10.mp | 88 ++ .../doc/metapost/mp3d/examples/cube4-eng.mp | 124 +++ .../texmf-dist/doc/metapost/mp3d/examples/cube5.mp | 86 ++ .../texmf-dist/doc/metapost/mp3d/examples/cube6.mp | 94 ++ .../texmf-dist/doc/metapost/mp3d/examples/cube7.mp | 133 +++ .../texmf-dist/doc/metapost/mp3d/examples/cube8.mp | 48 + .../texmf-dist/doc/metapost/mp3d/examples/cube9.mp | 66 ++ .../doc/metapost/mp3d/examples/gutmp1-eng.mp | 75 ++ .../doc/metapost/mp3d/examples/gutmp1.mp | 76 ++ .../doc/metapost/mp3d/examples/gutmp2-eng.mp | 90 ++ .../doc/metapost/mp3d/examples/gutmp2.mp | 91 ++ .../doc/metapost/mp3d/examples/gutmp3-eng.mp | 98 ++ .../doc/metapost/mp3d/examples/gutmp3.mp | 99 ++ .../doc/metapost/mp3d/examples/gutmp4-eng.mp | 112 ++ .../doc/metapost/mp3d/examples/gutmp4.mp | 113 ++ .../doc/metapost/mp3d/examples/gutmp5-eng.mp | 84 ++ .../doc/metapost/mp3d/examples/gutmp5.mp | 85 ++ .../doc/metapost/mp3d/examples/gutmp6-eng.mp | 100 ++ .../doc/metapost/mp3d/examples/gutmp6.mp | 101 ++ .../doc/metapost/mp3d/examples/gutmp7-eng.mp | 102 ++ .../doc/metapost/mp3d/examples/gutmp7.mp | 103 ++ .../doc/metapost/mp3d/examples/gutmp8-eng.mp | 120 ++ .../doc/metapost/mp3d/examples/gutmp8.mp | 121 +++ .../doc/metapost/mp3d/examples/gutmp9.mp | 63 ++ .../doc/metapost/mp3d/examples/monge-eng.mp | 148 +++ .../texmf-dist/doc/metapost/mp3d/examples/monge.mp | 149 +++ Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf | Bin 0 -> 247845 bytes .../doc/metapost/mp3d/paper1997corrected.pdf | Bin 0 -> 138588 bytes Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf | Bin 0 -> 175795 bytes Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx | 1149 ++++++++++++++++++++ .../doc/metapost/mp3d/tugboat-geometry-space.pdf | Bin 0 -> 263816 bytes 32 files changed, 3802 insertions(+) create mode 100644 Master/texmf-dist/doc/metapost/mp3d/README create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/cube10.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/cube4-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/cube5.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/cube6.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/cube7.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/cube8.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/cube9.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp1.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp2.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp3.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp4.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp5.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp6.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp7.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp8.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/gutmp9.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/monge-eng.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/examples/monge.mp create mode 100644 Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf create mode 100644 Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdf create mode 100644 Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf create mode 100644 Master/texmf-dist/doc/metapost/mp3d/tb57roegel.ltx create mode 100644 Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdf (limited to 'Master/texmf-dist/doc/metapost/mp3d') 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 Binary files /dev/null and b/Master/texmf-dist/doc/metapost/mp3d/gut2001.pdf 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 Binary files /dev/null and b/Master/texmf-dist/doc/metapost/mp3d/paper1997corrected.pdf 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 Binary files /dev/null and b/Master/texmf-dist/doc/metapost/mp3d/tb57roeg.pdf 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(
); + 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|
| +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 Binary files /dev/null and b/Master/texmf-dist/doc/metapost/mp3d/tugboat-geometry-space.pdf differ -- cgit v1.2.3