summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2010-12-08 00:27:12 +0000
committerKarl Berry <karl@freefriends.org>2010-12-08 00:27:12 +0000
commitec292c03bd7f22b6c53cc292304730e8a07b10b0 (patch)
tree55a168e031f997a8695acc057db2a8db140c92bd /Master/texmf-dist/metapost
parent8eec1138666490fba3cabc5da0e8bbba772373c0 (diff)
new mp package threeddice (8dec10)
git-svn-id: svn://tug.org/texlive/trunk@20675 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/metapost')
-rw-r--r--Master/texmf-dist/metapost/threeddice/threeddice.mp261
1 files changed, 261 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/threeddice/threeddice.mp b/Master/texmf-dist/metapost/threeddice/threeddice.mp
new file mode 100644
index 00000000000..29c2700c6ea
--- /dev/null
+++ b/Master/texmf-dist/metapost/threeddice/threeddice.mp
@@ -0,0 +1,261 @@
+% File threeddice.mp
+% Version 1.0
+%%%%%%%%%%%%%%%%%%%%
+numeric dot_diam, corner_rad, face_margin, die_size;
+
+% diameter of a dot
+dot_diam := 1/6;
+
+% distance from edge of face to edge of dot.
+face_margin := dot_diam/2;
+
+% rounded corner radius
+corner_rad := dot_diam/2;
+
+% size of a single die face:
+die_size := 1cm;
+
+% Outline of a face.
+path die_face;
+die_face := (0,corner_rad){down}
+ ..{right}(corner_rad,0)..(1-corner_rad,0){right}
+ ..{up}(1,corner_rad)..(1,1-corner_rad){up}
+ ..{left}(1-corner_rad,1)..(corner_rad,1){left}
+ ..{down}(0,1-corner_rad)..cycle;
+
+% dot shape
+path dot;
+dot := fullcircle scaled dot_diam;
+
+% distance from nearest edge to center of dot:
+numeric dot_shift;
+dot_shift := dot_diam/2 + face_margin;
+
+% Five of 9 locations where a dot could be located.
+pair die_face[];
+
+die_face 1 := ( 0, 1) + dot_shift*( 1,-1); % TL
+die_face 2 := ( 0,.5) + dot_shift*( 1, 0); % TC
+die_face 3 := (.5,.5) ; % CC
+die_face 4 := ( 1,.5) + dot_shift*(-1, 0); % BC
+die_face 5 := ( 1, 0) + dot_shift*(-1, 1); % BR
+
+
+picture pips[];
+pips 1 := pips 2 := nullpicture;
+
+% dot in center
+addto pips 1 contour dot shifted die_face 3;
+
+% dots in TL and BR corners
+addto pips 2 contour dot shifted die_face 1;
+addto pips 2 contour dot shifted die_face 5;
+
+% dots in TR and BL corners
+pips 7 := pips 2 rotatedabout ((.5,.5), 90);
+
+% 3 dots on TL to BR diagonal
+pips 3 := pips 2;
+addto pips 3 also pips 1;
+
+% 3 dots on BL to TR diagonal
+pips 8 := pips3 rotatedabout ((.5,.5),90);
+
+% Dots in all 4 corners
+pips 4 := pips 2;
+addto pips 4 also pips 7;
+
+% dots in all four corners and center
+pips 5 := pips 4;
+addto pips 5 also pips 1;
+
+% 6 dots, 3 dots on top and three on bottom
+pips 6 := pips 4;
+addto pips 6 contour dot shifted die_face 2;
+addto pips 6 contour dot shifted die_face 4;
+
+% 6 dots, 3 at left and 3 at right
+pips 11 := pips6 rotatedabout ((.5,.5),90);
+
+% When three faces are showing, alternates 7, 8 and 11 for 2, 3 and 6 are
+% used when the total of the pips is odd (). This is an ad hoc rule that
+% matches what I see on my reference die.
+vardef pips_sel_iii (expr X)=
+ X if odd pips_total: if (X=2) or (X=3) or (X=6): + 5 fi fi
+enddef;
+%
+% Choices are less easy when only two faces show:
+vardef pips_sel_ii (expr X,Y)=
+ X if ((X=2) and ((Y=3) or (Y=4))) or
+ ((X=3) and ((Y=1) or (Y=6))) or
+ ((X=6) and ((Y=2) or (Y=5))): + 5
+ fi
+enddef;
+
+% for die with 3 faces showing:
+path topface[], llftface, lrtface;
+topface 1 = die_face rotated 45 yscaled (1/sqrt(3));
+llftface = topface 1 rotated 120;
+lrtface = topface 1 rotated -120;
+
+% for die with 2 faces showing:
+path frontface;
+topface 2 := (die_face shifted (-.5,0)) yscaled (1/sqrt(2));
+frontface := topface 2 rotated 180;
+
+pair D[];
+D1 := dir 30;
+D2 := dir 150;
+
+path corner_connect[];
+corner_connect1 := (point 6 of lrtface){up}..{D2}(point 3 of topface 1);
+corner_connect2 := (point 6 of topface 1){-D1}..{down}(point 3 of llftface);
+corner_connect3 := (point 6 of llftface){-D2}..{D1}(point 3 of lrtface);
+corner_connect4 := (point 0 of frontface){up}..(point 3 of topface 2){up};
+corner_connect5 := (point 0 of topface 2){down}..(point 3 of frontface){down};
+
+% Text parameter is for drawing options (transformation, withcolor, etc.);
+% expression parameters are the # of pips on top, left and right.
+def die_three(expr T, L, R) text _do_ =
+ numeric pips_total;
+ pips_total := T + L + R;
+ draw topface 1 _do_;
+ draw llftface _do_;
+ draw lrtface _do_;
+ for n = 1 upto 3:
+ draw corner_connect[n] _do_;
+ endfor
+ draw pips[pips_sel_iii(T)] rotated 45 yscaled (1/sqrt(3)) _do_;
+ draw pips[pips_sel_iii(L)] rotated 45 yscaled (1/sqrt(3)) rotated 120 _do_;
+ draw pips[pips_sel_iii(R)] rotated 45 yscaled (1/sqrt(3)) rotated -120 _do_;
+enddef;
+
+def die_two (expr T, F) text _do_ =
+ draw topface 2 _do_;
+ draw frontface _do_;
+ draw (pips[pips_sel_ii(T,F)] shifted .5left) yscaled (1/sqrt(2)) _do_;
+ draw (pips[pips_sel_ii(F,T)] shifted .5left) yscaled (1/sqrt(2)) rotated 180 _do_;
+ draw corner_connect4 _do_;
+ draw corner_connect5 _do_;
+enddef;
+
+def die_one (expr F) text _do_ =
+ draw die_face _do_;
+ draw pips[F] _do_;
+enddef;
+
+if known outputtemplate:
+ outputtemplate := "die3d-%c.mps";
+elseif known mpversion:
+ filenametemplate "die3d-%c.mps";
+fi
+% The 8 permissible views (up to rotation) with three faces equally
+% visible of a right handed die:
+beginfig(123);
+ die_three(1,2,3) scaled die_size;
+endfig;
+
+beginfig(135);
+ die_three(1,3,5) scaled die_size;
+endfig;
+
+beginfig(154);
+ die_three(1,5,4) scaled die_size;
+endfig;
+
+beginfig(142);
+ die_three(1,4,2) scaled die_size;
+endfig;
+
+beginfig(246);
+ die_three(2,4,6) scaled die_size;
+endfig;
+
+beginfig(263);
+ die_three(2,6,3) scaled die_size;
+endfig;
+
+beginfig(365);
+ die_three(3,6,5) scaled die_size;
+endfig;
+
+beginfig(456);
+ die_three(4,5,6) scaled die_size;
+endfig;
+
+% The 12 permissible views (up to rotation) with only two faces equally
+% visible of a right handed die:
+beginfig(12);
+ die_two(1,2) scaled die_size;
+endfig;
+
+beginfig(13);
+ die_two(1,3) scaled die_size;
+endfig;
+
+beginfig(14);
+ die_two(1,4) scaled die_size;
+endfig;
+
+beginfig(15);
+ die_two(1,5) scaled die_size;
+endfig;
+
+beginfig(23);
+ die_two(2,3) scaled die_size;
+endfig;
+
+beginfig(24);
+ die_two(2,4) scaled die_size;
+endfig;
+
+beginfig(26);
+ die_two(2,6) scaled die_size;
+endfig;
+
+beginfig(35);
+ die_two(3,5) scaled die_size;
+endfig;
+
+beginfig(36);
+ die_two(3,6) scaled die_size;
+endfig;
+
+beginfig(45);
+ die_two(4,5) scaled die_size;
+endfig;
+
+beginfig(46);
+ die_two(4,6) scaled die_size;
+endfig;
+
+beginfig(56);
+ die_two(5,6) scaled die_size;
+endfig;
+
+% The 6 possible single faces
+beginfig(1);
+ die_one(1) scaled die_size;
+endfig;
+
+beginfig(2);
+ die_one(2) scaled die_size;
+endfig;
+
+beginfig(3);
+ die_one(3) scaled die_size;
+endfig;
+
+beginfig(4);
+ die_one(4) scaled die_size;
+endfig;
+
+beginfig(5);
+ die_one(5) scaled die_size;
+endfig;
+
+beginfig(6);
+ die_one(6) scaled die_size;
+endfig;
+
+end