diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-11 22:58:36 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-11 22:58:36 +0000 |
commit | ac3c55a3216b5988f0e48ba9414ddb059f19a699 (patch) | |
tree | a752ab12de05a9ac4511903abc09675172018fd6 /Master/texmf-dist/metapost/mp3d/3dpoly.mp | |
parent | d087712418726a64822e40ce1c0627a514d17975 (diff) |
trunk/Master/texmf-dist/metapost
git-svn-id: svn://tug.org/texlive/trunk@104 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/metapost/mp3d/3dpoly.mp')
-rw-r--r-- | Master/texmf-dist/metapost/mp3d/3dpoly.mp | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/mp3d/3dpoly.mp b/Master/texmf-dist/metapost/mp3d/3dpoly.mp new file mode 100644 index 00000000000..5d3b8f5f2fa --- /dev/null +++ b/Master/texmf-dist/metapost/mp3d/3dpoly.mp @@ -0,0 +1,294 @@ +%%\input epsf +%%\def\newpage{\vfill\eject} +%%\def\vc#1{$\vcenter{#1}$} +%%\def\title#1{\hrule\vskip1mm#1\par\vskip1mm\hrule\vskip5mm} +%%\def\figure#1{\par\centerline{\epsfbox{#1}}} +%%\title{{\bf 3DPOLY.MP: DEFINITION OF REGULAR CONVEX POLYHEDRA IN METAPOST}} + +%% version 1.34, 17 August 2003 +%% {\bf Denis Roegel} ({\tt roegel@loria.fr}) +%% +%%This package defines the five regular convex polyhedra classes and +%%must be used with the {\bf 3d} package. + +if known three_d_poly_version: + expandafter endinput % avoids loading this package twice +fi; + +message "*** 3dpoly, v1.34 (c) D. Roegel, 17 August 2003 ***"; +numeric three_d_poly_version; +three_d_poly_version=1.34; + +%%Each object definition is parameterized by +%%an instance identification. + +%%All polyhedra are normalized (centered on the origin and inscriptible +%%in a sphere of radius 1). + +%%The polyhedra are defined with a certain number of points and faces. +%%The points comprise both the vertices and the center of the object. + +%%It might be useful to remind the Euler formula linking +%%the number of faces $f$, +%%vertices $v$ and edges $e$ in polyhedra with no hole in dimension 3: +%%$f+v-e=2$. This can be verified in the following table: + +%%\centerline{\vbox{\halign{\quad#\hfil\quad&&\quad\hfil#\quad\cr +%% \omit \hfil type\hfil&\omit\hfil faces\hfil +%% &\omit\hfil vertices\hfil&\omit\hfil edges\hfil\cr +%% tetrahedron&4&4&6\cr +%% cube&6&8&12\cr +%% octahedron&8&6&12\cr +%% dodecahedron&12&20&30\cr +%% icosahedron&20&12&30\cr}}} + +%%For more details, see the documentation enclosed in the distribution. + +%%\newpage\title{TETRAHEDRON (4 faces)\kern1cm\epsfbox{tetra.ps}} + +%% Construction of a tetrahedron: + +%% One face is \vc{\epsfbox{vect-fig.1}} with $h=c\sqrt{3}/2$ + +%% The angle $\alpha$ between two faces is given by +%% $\sin(\alpha/2)={\displaystyle c/2\over \displaystyle c\sqrt{3}/2}=1/\sqrt3$ + +%% \figure{vect-fig.2} + +def set_tetrahedron_points(expr inst)= + set_point(1)(0,0,0);set_point(2)(1,0,0); + set_point(3)(cosd(60),sind(60),0);% $60=360/6$ + 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_point(5)(0,0,0);% center of tetrahedron +enddef; + +vardef def_tetrahedron(expr inst)= + new_obj_points(inst,5);% 4 vertices and the center + new_obj_faces(inst,4);% 4 faces in the definition + 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; + +%%\newpage\title{CUBE (HEXAHEDRON) (6 faces)\kern1cm\epsfbox{cube.ps}} + +%%The definition of a cube is straightforward. + +def set_cube_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); + normalize_obj(inst)(1,7);% 1 and 7 are opposite vertices + set_point(9)(0,0,0);% center of cube +enddef; + +vardef def_cube(expr inst)= + new_obj_points(inst,9);% 8 vertices and the center + new_obj_faces(inst,6);% 6 faces in the definition + set_cube_points(inst); + set_obj_face(1,"1,2,6,5","b4fe40"); + set_obj_face(2,"2,3,7,6","45d040"); + set_obj_face(3,"4,8,7,3","45a114"); + set_obj_face(4,"1,5,8,4","45a1d4"); + set_obj_face(5,"5,6,7,8","4569d4"); + set_obj_face(6,"4,3,2,1","112da1"); +enddef; + + +%%\newpage\title{OCTAHEDRON (8 faces)\kern1cm\epsfbox{octa.ps}} + +%% A section of a pyramid is: \vc{\epsfbox{vect-fig.3}} + +%% The height of this pyramid is given +%% by $H^2={(c\sqrt3/2)}^2-{(c/2)}^2=c^2/2$, hence $H=c/\sqrt2$ + +def set_octahedron_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)(.5,.5,1/sqrt(2)); + set_point(6)(.5,.5,-1/sqrt(2)); + normalize_obj(inst)(5,6);% 5 and 6 are opposite vertices + set_point(7)(0,0,0);% center of octahedron +enddef; + +vardef def_octahedron(expr inst)= + new_obj_points(inst,7);% 6 vertices and the center + new_obj_faces(inst,8);% 8 faces in the definition + set_octahedron_points(inst); + set_obj_face(1,"1,2,5","b4fefe"); + set_obj_face(2,"2,3,5","45d040"); + set_obj_face(3,"3,4,5","4569d4"); + set_obj_face(4,"4,1,5","b49bc0"); + set_obj_face(5,"6,1,4","45a1d4"); + set_obj_face(6,"6,2,1","b4c8fe"); + set_obj_face(7,"6,3,2","b49b49"); + set_obj_face(8,"6,4,3","112da1"); +enddef; + + +%%\newpage\title{DODECAHEDRON (12 faces)\kern1cm\epsfbox{dodeca.ps}} + +%% Two adjacent faces (pentagons) of the dodecahedron are as follows: +%%\figure{vect-fig.13} +%% The angle between the faces is the angle between $\overrightarrow{OA}$ +%% and $\overrightarrow{OB}$. +%% $OA=OB=d_3$ as defined in \figure{vect-fig.14} +%% $d_1=2r\sin(\pi/5)$, $d_2=2r\sin(2\pi/5)$ +%% and $d_3=d_1\sin(2\pi/5)=2r\sin(\pi/5)\sin(2\pi/5)$ +%% +%% The angle $\alpha$ is defined by the following conditions: +%% \figure{vect-fig.15} +%% Thus $d_2^2=d_3^2+d_3^2-2d_3^2\cos\alpha$, which leads to +%% $\cos\alpha=1-{\displaystyle d_2^2\over\displaystyle2d_3^2} +%% =-{\displaystyle\cos(2\pi/5)\over\displaystyle2\sin^2(\pi/5)}$ +%%\newpage + +def set_dodecahedron_points(expr inst)= + new_points(fc)(10);% face centers + set_point_(fc1,0,0,0);set_point(1)(1,0,0); + set_point(2)(cosd(72),sind(72),0);% 72=360/5 + rotate_in_plane(3,fc1,1,2); + rotate_in_plane(4,fc1,2,3); + rotate_in_plane(5,fc1,3,4); + cosan=-cosd(72)/(2*sind(36)*sind(36));sinan=sqrt(1-cosan**2); + an=180-angle((cosan,sinan)); + new_abs_face_point(fc2,fc1,1,2,an); + new_abs_face_point(fc3,fc1,2,3,an); + new_abs_face_point(fc4,fc1,3,4,an); + new_abs_face_point(fc5,fc1,4,5,an); + new_abs_face_point(fc6,fc1,5,1,an); + rotate_in_plane(6,fc2,2,1); + rotate_in_plane(7,fc2,1,6); + rotate_in_plane(8,fc2,6,7); + rotate_in_plane(9,fc3,2,8); + rotate_in_plane(10,fc3,8,9); + rotate_in_plane(11,fc4,3,10); + rotate_in_plane(12,fc4,10,11); + rotate_in_plane(13,fc5,4,12); + rotate_in_plane(14,fc5,12,13); + rotate_in_plane(15,fc6,5,14); + new_abs_face_point(fc7,fc2,6,7,an); + new_abs_face_point(fc8,fc3,8,9,an); + new_abs_face_point(fc9,fc4,10,11,an); + new_abs_face_point(fc10,fc5,12,13,an); + rotate_in_plane(16,fc7,6,15); + rotate_in_plane(17,fc7,15,16); + rotate_in_plane(18,fc8,7,17); + rotate_in_plane(19,fc9,9,18); + rotate_in_plane(20,fc10,11,19); + normalize_obj(inst)(2,20);% opposite vertices + set_point(21)(0,0,0);% center of dodecahedron + free_points(fc)(10); +enddef; +%%\newpage +vardef def_dodecahedron(expr inst)= + save cosan,sinan,an; + new_obj_points(inst,21);% 21 points in the definition + new_obj_faces(inst,12);% 12 faces in the definition + set_dodecahedron_points(inst); + set_obj_face(1,"5,4,3,2,1","ff0fa1"); + set_obj_face(2,"8,7,6,1,2","b40000"); + set_obj_face(3,"10,9,8,2,3","b49b49"); + set_obj_face(4,"12,11,10,3,4","b49bc0"); + set_obj_face(5,"14,13,12,4,5","b4c8fe"); + set_obj_face(6,"6,15,14,5,1","b4fefe"); + set_obj_face(7,"6,7,17,16,15","b4fe40"); + set_obj_face(8,"8,9,18,17,7","45d040"); + set_obj_face(9,"10,11,19,18,9","45a114"); + set_obj_face(10,"11,12,13,20,19","45a1d4"); + set_obj_face(11,"14,15,16,20,13","4569d4"); + set_obj_face(12,"16,17,18,19,20","112da1"); +enddef; + +%%\newpage\title{ICOSAHEDRON (20 faces)\kern1cm\epsfbox{icosa.ps}} + +%%Two faces of an icosahedron are linked in the following way: + +%% \vc{\epsfbox{vect-fig.4}} where $h=c\sqrt3/2$ + +%% $d$ is also a diagonal in a pentagon: \vc{\epsfbox{vect-fig.5}} + +%% $c=2r\sin(\pi/5)$, +%% $d=2r\sin(2\pi/5)=2c\cos(\pi/5)$ + +%% The angle between two faces is computed as follows: +%% \vc{\epsfbox{vect-fig.6}} + +%% We have ${(2\cos(\pi/5))}^2=2{(\sqrt3/2)}^2-2{(\sqrt3/2)}^2\cos\alpha$ + +%% Thus $cos\alpha=1-{8\over3}\cos^2(\pi/5)$ +%%\newpage + +def set_icosahedron_points(expr inst)= + set_point(1)(0,0,0);set_point(2)(1,0,0); + set_point(3)(cosd(60),sind(60),0);% 60=360/6 + cosan=1-8/3*cosd(36)*cosd(36);sinan=sqrt(1-cosan**2); + 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); + normalize_obj(inst)(1,10);% opposite vertices + set_point(13)(0,0,0);% center of icosahedron +enddef; + +vardef def_icosahedron(expr inst)= + save cosan,sinan,an; + new_obj_points(inst,13);% 12 vertices and the center + new_obj_faces(inst,20);% 20 faces in the definition + 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; + +%%\newpage\title{General draw functions} + +def draw_polyhedron(expr name)= + draw_faces(name); +enddef; + +let draw_tetrahedron=draw_polyhedron; +let draw_cube=draw_polyhedron; +let draw_octahedron=draw_polyhedron; +let draw_dodecahedron=draw_polyhedron; +let draw_icosahedron=draw_polyhedron; + +let new_poly=assign_obj; + +endinput + |