/drawarc { % unit-label, x1, l1, x2, l2, ... xn, ln, n (number of edges) dup 2 mul 1 add copy % x1, l1, x2, l2, ... xn, ln, n, x1, l1, x2, l2, ... xn, ln, n 0 exch % x1, l1, x2, l2, ... xn, ln, n, x1, l1, x2, l2, ... xn, ln, 0, n {exch pop add} repeat % x1, l1, x2, l2, ... xn, ln, n, total dup 2 div dup 90 exch sub exch 90 add % x1, l1, x2, l2, ... xn, ln, n, total a1 a2 currentpoint 4 copy % x1, l1, x2, l2, ... xn, ln, n, total a1 a2 x y a1 a2 x y newpath % this keeps a straight line from being prepended to the arc r1 5 -2 roll % x1, l1, x2, l2, ... xn, ln, n, total a1 a2 x y x y r1 a1 a2 exch arcn 4 copy % x1, l1, x2, l2, ... xn, ln, n, total a1 a2 x y a1 a2 x y r2 5 -2 roll % x1, l1, x2, l2, ... xn, ln, n, total a1 a2 x y x y r2 a1 a2 arc % x1, l1, x2, l2, ... xn, ln, n, total a1 a2 x y 3 -1 roll pop % x1, l1, x2, l2, ... xn, ln, n, total a1 x y 4 -1 roll pop % x1, l1, x2, l2, ... xn, ln, n, a1 x y 4 -1 roll % x1, l1, x2, l2, ... xn, ln, a1 x y n { 5 copy % x1, l1, x2, l2, ... xn ln a1 x y xn ln a1 x y 5 -1 roll 2 div % x1, l1, x2, l2, ... xn ln a1 x y ln a1 x y xn/2 4 -1 roll add % x1, l1, x2, l2, ... xn ln a1 x y ln x y t dup sin r3 mul exch cos r3 mul % x1, l1, x2, l2, ... xn ln a1 x y ln x y r*sin(t) r*cos(t) 4 -1 roll add 3 1 roll add moveto cshow 4 -1 roll pop % x1, l1, x2, l2, ... xn a1 x y 4 2 roll add % x1, l1, x2, l2, ... x y t 3 copy % x1, l1, x2, l2, ... x y t x y t dup sin exch cos % x1, l1, x2, l2, ... x y t x y sin(t) cos(t) 4 copy % x1, l1, x2, l2, ... x y t x y sin(t) cos(t) x y sin(t) cos(t) r1 mul 4 -1 roll add % x1, l1, x2, l2, ... x y t x y sin(t) cos(t) y sin(t) cos(t)*r1+x 3 1 roll r1 mul add moveto % x1, l1, x2, l2, ... x y t x y sin(t) cos(t) r2 mul 4 -1 roll add 3 1 roll r2 mul add lineto % x1, l1, x2, l2, ... x y t 3 1 roll } repeat % unit-label t x y 3 2 roll 3 add dup cos r3 mul exch sin r3 mul % unit-label x y cos(t) sin(t) 4 copy pop pop 4 -1 roll 3 -1 roll add 3 1 roll add moveto % unit-label x y 3 -1 roll cshow stroke moveto } def /cshow { gsave 0.1 setlinewidth currentpoint 2 copy % a x y x y newpath 2 copy exch r4 add exch moveto r4 0 360 arc 3 copy pop pop % a x y a stringwidth pop -2 div 3 -1 roll add exch -0.5 r4 mul add moveto show closepath stroke grestore } def