* Metafun: shifting picture
[not found] <mailman.1677.1308729404.4231.ntg-context@ntg.nl>
@ 2011-06-22 10:40 ` dalyoung
0 siblings, 0 replies; only message in thread
From: dalyoung @ 2011-06-22 10:40 UTC (permalink / raw)
To: ntg-context
[-- Attachment #1: Type: text/plain, Size: 425 bytes --]
Hi,
I am trying to draw dominos using metapost and ConTeXt.
I borrow part of the code in Threeddice.mp by Dan Lueking for drawing dots.
To display blank dominos where I want and drawing one domino work well but drawing several dominos where I want is not working well.
(compare domino0 and domino1 in the example)
Why do the dominos overlap or locate on the wrong place?
Thank you for reading.
Best regards,
Dalyoung
[-- Attachment #2: DominoMp.tex --]
[-- Type: application/octet-stream, Size: 5998 bytes --]
% 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
[-- Attachment #3: Type: text/plain, Size: 1 bytes --]
[-- Attachment #4: Type: text/plain, Size: 485 bytes --]
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
archive : http://foundry.supelec.fr/projects/contextrev/
wiki : http://contextgarden.net
___________________________________________________________________________________
^ permalink raw reply [flat|nested] only message in thread