1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
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;
|