prologues := 2; path circle, hcircle, qcircle; circle = fullcircle scaled 2; hcircle = halfcircle scaled 2; qcircle = quartercircle scaled 2; vardef fcircle(suffix into)(expr r, ang, rad, thic, di) = save v, p, q, ori; pair v, p, q, ori; v := dir(ang); % Passes through p at angle ang q := rad * v + di * (thic/2 - r) * (v rotated 90); % Origin of circle lies on two lines ori = q + whatever * (v rotated 90); ori = .5[q,(0,0)] + whatever * (q rotated 90); into.c := ori; into.radius := abs(ori - q) - r; into.pth := ((qcircle xscaled -1 yscaled -di scaled into.radius rotated ang shifted into.c) cutbefore ((0,0) -- into.c)) ; enddef; def declfcircle(suffix s) = pair s[].c; path s[].pth; enddef; vardef inters(expr p)(suffix s) = save i; pair i; i := p intersectiontimes s[0].pth; if xpart(i) >= 0: point ypart(i) of s[0].pth else: i := p intersectiontimes s[1].pth; if xpart(i) >= 0: point ypart(i) of s[1].pth else: (0,0) fi fi enddef; vardef interppnt(expr ang, r) = save d, pd, ia, ib, fa, fb, fc; pair d; show ang, "FOO"; d := dir(ang); path pd; pd = (0,0) -- 10 * r * d; pair ia, ib; ia = inters(pd , a); ib = inters(pd , b); show ia, ib; numeric fa, fb; fa = abs(ia) - r; fb = abs(ib) - r; if fa < 0: fa := 0; fi if fb < 0: fb := 0; fi numeric fc; fc = fa + fb + r; d * fc % if abs(ia) > abs(ib): % ia % else: % ib % fi enddef; def diag(expr r, aa, ra, ta, ab, rb, tb) = save a, b; declfcircle(a); declfcircle(b); fcircle(a[0], r, aa, ra, ta, 1); fcircle(a[1], r, aa, ra, ta, -1); fcircle(b[0], r, ab, rb, tb, 1); fcircle(b[1], r, ab, rb, tb, -1); draw circle scaled r; % draw circle scaled a0.radius shifted a0.c; draw a0.pth withpen pencircle scaled 1.5pt; draw a1.pth ; draw b0.pth ; draw b1.pth withpen pencircle scaled 1.5pt; % draw circle scaled a1.radius shifted a1.c; % draw circle scaled b0.radius shifted b0.c; % draw circle scaled b1.radius shifted b1.c; draw interppnt(aa+.8, r) for ang = aa+1 step .1 until ab - 1.1: -- interppnt(ang, r) endfor withpen pencircle scaled 3pt; % Blending curve: enddef; beginfig(1); diag(100, 90, 200, 5, 120, 150, 6); endfig; end;