vardef radical_axis(expr ca, cb) =
numeric t, d, ra, rb;
ra = abs(center ca - point 0 of ca);
rb = abs(center cb - point 0 of cb);
d = abs(center cb - center ca);
2t = 1 + (ra+rb) / d * (ra-rb) / d;
(up -- down) scaled 89
rotated angle (center cb - center ca)
shifted t[center ca, center cb]
enddef;
vardef invert_point(expr P, o, r) =
save p, d; pair p; numeric d;
p = P - o; d = abs p;
if d > 0:
o + unitvector p scaled (r/d*r)
else:
errmessage("Inversion undefined at center.")
fi
enddef;
vardef pole(expr Line, Circle) =
save p, o, r; pair o, p; numeric r;
o = center Circle;
r = 1/2 abs (point 4 of Circle - point 0 of Circle);
p = whatever [point 1 of Line, point 0 of Line];
p - o = whatever * direction 0 of Line rotated 90;
invert_point(p, o, r)
enddef;
vardef polex(expr a, b, o, r) =
save p; pair p;
p = whatever [a, b];
p - o = whatever * (a-b) rotated 90;
invert_point(p, o, r)
enddef;
vardef three_point_circle(expr a,b,c) =
save m; pair m;
m = whatever [a,b] rotatedaround(.5[a,b],90)
= whatever [b,c] rotatedaround(.5[b,c],90);
fullcircle scaled 2 length(m-a) shifted m
enddef;
vardef through(expr a, b, o) =
save d; numeric d; d = abs(a-b);
(1+o/d)[b, a] -- (1+o/d)[a, b]
enddef;