summaryrefslogtreecommitdiff
path: root/usergrps/uktug/baskervi/4_4/burns.mf
diff options
context:
space:
mode:
Diffstat (limited to 'usergrps/uktug/baskervi/4_4/burns.mf')
-rw-r--r--usergrps/uktug/baskervi/4_4/burns.mf171
1 files changed, 171 insertions, 0 deletions
diff --git a/usergrps/uktug/baskervi/4_4/burns.mf b/usergrps/uktug/baskervi/4_4/burns.mf
new file mode 100644
index 0000000000..e60d2309bf
--- /dev/null
+++ b/usergrps/uktug/baskervi/4_4/burns.mf
@@ -0,0 +1,171 @@
+% burns.mf by Raymond Chen (rjc@math.princeton.edu)
+
+% Monty Burns.
+
+pictureof(Burns, 24u#, 24u#, 0);
+ pickup thinpen;
+
+ localpath ear;
+ ear = (8u, 15u) .. (6u, 15.9u) .. (4.4u, 14.5u) .. (5.5u, 12.4u) ..
+ (6.7u, 12.8u);
+ % We don't draw the ear until it's been clipped by Burns' sideburns.
+
+ localpath head;
+ z1h = (9u, 20.6u); % join point for Burns' hair
+ z2h = (7u, 13u); % terminal join point for interpathing
+ z1e = (12u, 15u); % beginning of Burns' eye
+ z2e = (16u, 12u); % end of Burns' eye
+ z3e = (20u, 14u); % where Burns' eyebrow might be
+ z4e = (20.5u, 17u); % the forward lobe of his forehead
+ labels(1h, 2h, 1e, 2e, 3e, 4e);
+ head = postclip(
+ z1e .. tension 3 and 1 ..
+ z2e{dir -5} ..
+ z3e ..
+ z4e{up} ..
+ (16 u, 21.8u) ..
+ (12 u, 21.6u) ..
+ z1h .. tension 1 and 2 ..
+ ( 5.7u, 19 u) .. % inflection upwards slightly
+ ( 3.7u, 16.5u){down} ..
+% ( 5 u, 14 u)
+ z2h
+ , ear);
+
+% Now split the head at z1h into the forehead and the hair.
+% Although the intersectiontimes should give us an integer, we round just
+% in case something got lost in translation.
+
+ numeric t; t = round xpart(head intersectiontimes z1h);
+ if t < 0: errmessage("Unable to find Burns' hairline"); fi
+
+ localpath outerhair;
+ outerhair = subpath(t, infinity) of head;
+ head := subpath(0, t) of head;
+
+ localpath innerhair; % the inner boundary of Burns' hair,
+ % and his sideburns.
+ innerhair =
+ z1h{direction 0 of outerhair} ..
+ (8.8u, 16u){down} ..
+ (8.3u, 12.5u) ..
+ (8u, 12.3u) .. tension 2 ..
+ z2h .. tension 2 ..
+ (8u, 16u) ..
+ (8.5u, 18u) ..
+ {up} z1h;
+
+ draw preclip(ear, innerhair); % now the ear can be drawn
+ drawtau( (5.2u, 14.5u), (6.7u, 15u), (6.1u, 13.4u), (6.3u, 15.5u) );
+
+% Now split innerhair at z2h.
+
+ numeric t; t = round xpart(innerhair intersectiontimes z2h);
+ if t < 0: errmessage("Unable to find Burns' sideburns"); fi
+
+ localpath interhair;
+ interhair = reverse subpath(t, length innerhair - .5) of innerhair;
+ innerhair := subpath(0,t) of innerhair;
+
+% Now we can clip the innerhair so his sideburns stop at the hairline
+ draw innerhair;
+ draw preclip(interhair, innerhair);
+
+% Now what's left of Burns' hair can be drawn
+ for i= 0 step .3 until .8:
+ draw prepostclip(interpath(i, outerhair, interhair), innerhair, ear);
+ endfor
+
+ localpath beak;
+ z1b = (17 u, 12.5u); % first two beak points
+ z2b = (20.3u, 8.5u);
+ % Beak contains an inflection point
+ beak = z1b{(z2b-z1b) rotated -5} .. z2b ..
+ (21.6u, 6 u) .. tension 1 and 3 ..
+ (21.7u, 3.8u) .. tension 3 and 3 ..
+ (20.3u, 5.3u) ..
+ (18 u, 7 u) ..
+ (17 u, 8 u){up} ..
+ {right}(18.4u, 9 u);
+
+ draw (reverse beak) hardjoin head;
+
+% Now Burns' right eye.
+ draw subpath(0,1) of head;
+ localpath eye_bottom;
+ eye_bottom = z1e {direction 0 of head} ..
+ (14.5u, 10.9u) .. {dir 40} z2e;
+ draw eye_bottom;
+% The bag under Burns' eye.
+ draw (subpath(.4, 1) of eye_bottom) shifted (-.3u, -.5u);
+
+% Burns' left eye.
+ draw prepostclip(
+ (18u, 10.5u) .. (19.8u, 12u) .. (19u, 13u),
+ beak, head);
+
+ localpath mouth;
+ mouth = preclip(
+ (18.5u, 7u) .. tension 1 and 2 ..
+ (18u, 4.5u) .. tension 2 and 1 ..
+ (10u, 7.8u) ..
+ (8.2u, 7.5u), beak);
+ draw mouth;
+
+if false:
+ % back of neck
+ localpath neck;
+ neck = preclip(
+ (9u, 7u){down} .. %tension .9 and 3 ..
+ {-(1,1.5)}(7.2u, 0u), ear);
+ draw neck;
+
+fi
+
+ % Burns' fangs, err, teeth. Must be drawn after the chin.
+ numeric n; n = 5; % number of teeth, minus 1
+ % n points equally spaced.
+ numeric t[];
+
+ % The following wild macro makes t0 ... t[n] equally spaced.
+
+ for i = 1 upto n: t[i] - t[i-1] = endfor whatever;
+ t0 = 1.1; t[n] = 2;
+
+ localpath teeth;
+ teeth =
+ for i = 1 upto n:
+ hide( makelabel.top(decimal(i-1), point t[i-1] of mouth); )
+ bend(60, point t[i-1] of mouth, point t[i] of mouth) &
+ endfor
+ bend(60, point 2 of mouth, point 3 of mouth);
+ draw teeth;
+
+ z1c = (13.3u, 5.5u); % the inner cavity of the chin
+ z2c = (9.5u, 0u); % the bottom tip of the neck
+ z3c = (5.5u, 4u); % the bottom of the back of the neck
+ labels(1c, 2c, 3c);
+
+ localpath neck;
+ neck = prepostclip( (15u, 7u) .. z1c .. tension 2 .. z2c &
+ bend(20, z2c, z3c) &
+ z3c{dir 80}.. (6.4u, 13u), teeth, ear);
+ draw neck;
+
+ % Draw Burns' suit jacket
+ draw z3c .. {curl5} (2.5u, 0u);
+ draw z3c .. (6u, 0u);
+
+ z1j = neck intersectionpoint ((0u, 3u) .. (24u, 3u));
+ draw z1j .. (14.3u, 0u);
+ draw z1j .. (11.4u, 0u);
+
+% Burns' age spots.
+ localpath agespot;
+ agespot = fullcircle xscaled 1.5 scaled .4u rotated -15;
+ draw agespot shifted (12u, 19.5u);
+ draw agespot shifted (10.4u, 17.4u);
+ draw agespot shifted (12.8u, 15.8u);
+
+ eyepos(Burns, 14.2u#, 12.1u#, 18.6u#, 12.0u#);
+endpicture;