6 proofrulethickness 1pt#;
7 makegrid(0pt,0pt for i:=-5pt step 1pt until 5pt: ,i endfor)
8 (0pt,0pt for i:=-5pt step 1pt until 5pt: ,i endfor);
9 proofrulethickness .1pt#;
10 makegrid(0pt,0pt for i:=-4.8pt step .2pt until 4.8pt: ,i endfor)
11 (0pt,0pt for i:=-4.8pt step .2pt until 4.8pt: ,i endfor);
16 tracingequations := tracingonline := 1;
24 def scaledabout(expr point, scale) =
25 shifted -point scaled scale shifted point
30 % make a local (restored after endgroup) copy of t_var
32 def local_copy(text type, t_var)=
43 % Urgh! Want to do parametric types
46 def del_picture_stack=
47 save save_picture_stack, picture_stack_idx;
50 % better versions of Taupin/Egler savepic cmds
53 def make_picture_stack =
54 % override previous stack.
56 picture save_picture_stack[];
57 numeric picture_stack_idx;
58 picture_stack_idx := 0;
59 def push_picture(expr p) =
60 save_picture_stack[picture_stack_idx] := p ;
61 picture_stack_idx := picture_stack_idx + 1;
63 def pop_picture = save_picture_stack[decr picture_stack_idx] enddef;
64 def top_picture = save_picture_stack[picture_stack_idx] enddef;
69 % why can't I delete individual pens?
73 numeric pen_stack_idx;
75 def push_pen(expr p) =
76 save_pen_stack[pen_stack_idx] := p ;
77 pen_stack_idx := pen_stack_idx +1;
79 def pop_pen = save_pen_stack[decr pen_stack_idx] enddef;
80 def top_pen = save_pen_stack[pen_stack_idx] enddef;
83 save save_pen_stack, pen_stack_idx;
90 def simple_serif(expr p,q, a)=
91 p{dir(angle(q-p) -a)} .. q{ - dir(angle(p -q) + a)}
97 % err_x: drift of y axis at top
98 % err_y: drift of x axis at right
99 def distorted_ellipse(expr a,b,err_y,err_x,super) =
100 superellipse((a,err_x),(-err_y,b),(-a,-err_x),(err_y,-b),super);
103 % stolen from feta-eindelijk, but still
105 def draw_block (expr bottom_left, top_right) =
106 pickup pencircle scaled blot_diameter;
110 bot y1 = ypart bottom_left;
111 top y2 = ypart top_right;
115 rt x1 = xpart top_right;
117 lft x3 = xpart bottom_left;
120 filldraw z1--z2--z3--z4--cycle;
124 def draw_brush(expr a,w,b,v) =
127 penpos3(w,angle(z2-z1)+90);
128 penpos4(w,angle(z2-z1));
129 penpos5(v,angle(z1-z2)+90);
130 penpos6(v,angle(z1-z2));
134 fill z3r{z3r-z5l}..z4l..{z5r-z3l}z3l..z5r{z5r-z3l}..z6l..{z3r-z5l}z5l..cycle;
137 def draw_flare(expr pos,alpha,beta,line,flare) =
140 penpos1(line,180+beta+alpha);
142 penpos2(flare,180+beta+alpha);
144 penpos3(flare,0+alpha);
145 z3l=z1r+(1/2+0.43)*flare*dir(alpha+beta);
146 z4=z2r-line*dir(alpha);
150 fill z1r{dir(alpha)}..z3r{dir(180+alpha-beta)}..z2l{dir(alpha+180)}
151 ..z3l{dir(180+alpha+beta)}..tension t
152 ..z4{dir(180+alpha+beta)}..z1l{dir(alpha+180)}..cycle;
156 def brush(expr a,w,b,v) =
166 def balled_crook(expr a, w, balldiam, stem) =
169 penpos1(balldiam/2,-90);
170 penpos2(balldiam/2,0);
171 penpos3(balldiam/2,90);
172 penpos4(balldiam/2,180);
173 x4r=xpart a-w; y3r=ypart a+balldiam/4;
177 x5=x4r+9/8balldiam; y5r=y1r;
179 x6l=xpart a; y6l=ypart a;
180 penstroke z1e..z2e..z3e..z4e..z1e..z5e{right}..z6e;
181 penlabels(1,2,3,4,5,6);
186 currentpicture := currentpicture yscaled -1;
187 set_char_box(charbp, charwd, charht, chardp);
192 currentpicture := currentpicture scaled -1;
193 set_char_box(charwd, charbp, charht, chardp);
198 % center_factor: typically .5, the larger, the larger the radius of the bulb
199 % radius factor: how much the bulb curves inward
201 def draw_bulb(expr turndir, zl, zr, bulb_rad, radius_factor)=
207 z0 = zr + bulb_rad * (zl-zr)/length(zr -zl);
210 z1 = z0 + radius_factor* rad * dir(ang + turndir* 100);
211 z2 = z0 + rad * dir(ang + turndir*300);
213 fill zr{dir (ang + turndir* 90)} .. z1 .. z2 -- cycle;