summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/simpsons/burns.mf
blob: e60d2309bfed73e15e780ff3209f2f60b421211c (plain)
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;