% The CMUMC (CMU Math Club) logo, as proposed 7 Dec 2004.
% METAFONT source code by Arthur O'Dwyer.
% Released to the public domain, 10 Dec 2004.
font_size 10pt#;
df := 0.7807764064;
cf := 1.3721867191; % 1 + df**4 + df**8 + df**12 + ...
u# := 4pt#;
% When 'simple_shapes' is 'true', use a circular pen and simple strokes.
% When it's false, try to make the text as "normal-looking" as possible.
boolean simple_shapes;
mode_setup;
define_pixels(u);
pair ofs;
%
% This subroutine is used by the main loop to keep drawing strokes
% until we get to the point where the stroke's boundary is no longer
% wide enough to count as a proper path.
%
boolean halt;
def throwing_penstroke text t =
forsuffixes e = l,r: path_.e:=t; endfor
if cycle path_.l: cyclestroke_
else:
path path__; path__ := path_.l -- reverse path_.r -- cycle;
if turningnumber path__ = 0: halt:=true else: fill path__ fi;
fi
enddef;
%
% The following two subroutines draw the letters "C" and "M", given
% the suffixes of four points marking the UL, UR, LL, and LR corners
% of the bounding rectangle, respectively.
%
def draw_letter_C(suffix $, $$, @, @@)(expr pc, t) =
for i=0 upto 5: x[i].c := whatever; y[i].c := whatever;
x[i].c.l := whatever; y[i].c.l := whatever;
x[i].c.r := whatever; y[i].c.r := whatever;
endfor;
z0c = 0.5[z$,z@@];
z1c = 0.8[z0c,z$$];
z2c = 0.8[z0c,0.5[z$,z@]];
z3c = 0.8[z0c,z@@];
z4c = 0.5[z1c,0.8[z0c,z$]];
z5c = 0.5[z3c,0.8[z0c,z@]];
if (simple_shapes):
y5c := df[y@, y5c];
y3c := df[y@, y3c];
pickup pencircle scaled pc;
draw ((z1c..z4c{left}..z2c{down}..z5c{right}..z3c) transformed t)
shifted ofs;
else:
y1c := y1c - 0.5pc;
y3c := y3c + 0.2pc;
penpos1c(2.2pc,90);
penpos4c(1.7pc,90);
penpos2c(1.7pc,180);
penpos5c(1.7pc,270);
penpos3c(1.7pc,270);
pickup penrazor;
throwing_penstroke ((z1c.e..z4c.e{left}..z2c.e{down}..z5c.e{right}..z3c.e)
transformed t) shifted ofs;
fi
enddef;
def draw_letter_M(suffix $, $$, @, @@)(expr pc, t) =
for i=0 upto 5: x[i].m := whatever; y[i].m := whatever;
x[i].m.l := whatever; y[i].m.l := whatever;
x[i].m.r := whatever; y[i].m.r := whatever;
endfor;
z0m = 0.5[z$,z@@];
z1m = 0.8[z0m,z@];
z2m = 0.8[z0m,z$];
z4m = 0.8[z0m,z$$];
z5m = 0.8[z0m,z@@];
if (simple_shapes):
z3m = z0m;
pickup pencircle scaled pc;
draw ((z1m--z2m--z3m--z4m--z5m) transformed t) shifted ofs;
else:
z3m = 0.7[z0m, 0.5[z@,z@@]];
y1m := y1m - 0.6pc; y5m := y1m;
penpos1m(2pc,0); penpos2m(1.6pc,0);
penpos3m(if (pc > u/20): 1.5pc else: 1pc fi,0);
penpos4m(1.6pc,0); penpos5m(2pc,0);
throwing_penstroke ((z1m.e--z2m.e) transformed t) shifted ofs;
throwing_penstroke ((z2m.e--z3m.e) transformed t) shifted ofs;
throwing_penstroke ((z3m.e--z4m.e) transformed t) shifted ofs;
throwing_penstroke ((z4m.e--z5m.e) transformed t) shifted ofs;
fi
enddef;
def create_logo(expr code, name) =
beginchar(code,(2df+1)*u#,(2df+1)*df*u#,0); name;
transform t;
t := identity; pc := 0.2pt;
ofs := u*(cf,cf*df);
halt:=false;
for i=1 upto 42: exitif halt;
% Mark the extreme corners of the line of text. Note that y0tl > y0tr.
z0bl = u*(-cf,-cf*df);
z0br = u*(1+2df-cf,-cf*df);
z0tl = z0bl+u*up;
z0tr = z0br+u*df*up;
% Mark the five interletter corners, top to bottom, left to right.
z1 = z0tl+u*right; z2 = z0tr+2u*df*left; z3 = z0bl+u*right;
z4 = z0tr+u*df*left; z5 = z0br+u*df*left;
% Draw the letter "C", which is a sideways "U".
draw_letter_C(0tl,1,0bl,3, pc, t);
% Draw the letter "M" next to it.
draw_letter_M(2,4,3,5, pc, t);
% Update the transform.
transform nt;
z0tl transformed nt = z5 transformed t;
z0bl transformed nt = z0br transformed t;
z1 transformed nt = z4 transformed t;
t := nt;
if (simple_shapes):
pc := df*pc;
else:
pc := (pc/0.2pt)[
1/4length((z0tl transformed nt) - (z0bl transformed nt)),
.7[df,1]*pc
];
fi
endfor;
% Erase the initial "C" (left-hand bottom of the logo).
z10a = origin;
z10b = origin + u*right + (2df+1)*df*u*up;
erase fill z10a--(x10a,y10b)--z10b--(x10b,y10a)--cycle;
% Now replace it with a stacked "M" "C".
z101 = origin + (2df+1)*df*u*up;
z102 = origin + u*right + (2df+1)*df*u*up;
z103 = origin + 1/2(2df+1)*df*u*up;
z104 = origin + u*right + 1/2(2df+1)*df*u*up;
z105 = origin;
z106 = origin + u*right;
ofs:=0.2pt*up;
draw_letter_M(101,102,103,104, 0.4pt, identity);
ofs:=0.1pt*up;
draw_letter_C(103,104,105,106, 0.4pt, identity);
endchar;
enddef;
simple_shapes:=true;
create_logo("s", "simple CMUMC logo");
simple_shapes:=false;
create_logo("n", "normal CMUMC logo");