1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
   | struct circle {     point o;     long double r; };
 
  pair<point, point> perpendicular(const point& lp, const point& rp){     return { (lp + rp) / 2, (lp + rp) / 2 + rotate(rp - lp, PI / 2) }; }
 
  circle cover(const point& a, const point& b, const point& c){     auto lp = perpendicular(a, b);     auto rp = perpendicular(a, c);     point o = intersect(lp.first, lp.second, rp.first, rp.second);     return { o, distance(o, a) }; }
 
  circle inner (const point& a, const point& b, const point& c) {     point ab = b - a;     point ac = c - a;     point ao = (ab / ab.length() + ac / ac.length()) / 2 + a;     point ba = a - b;     point bc = c - b;     point bo = (ba / ba.length() + bc / bc.length()) / 2 + b;     auto o = intersect(a, ao, b, bo);     return { o, abs(distance(a, b, o)) }; }
 
  pair<point, point> intersect(const point& lp, const point& rp, const circle& c) {     point ft = foot(lp, rp, c.o);     long double oft = distance(c.o, ft);     long double k = sqrtl(c.r * c.r - oft * oft);     point lr = (rp - lp) * k / distance(lp, rp);     return { ft + lr, ft - lr }; }
 
  pair<point, point> intersect(const circle& lc, const circle& rc) {     long double d = distance(lc.o, rc.o);     long double k = ((lc.r * lc.r - rc.r * rc.r) / d + d) / 2;     long double o = acos(k / lc.r);     point lr = rc.o - lc.o;     point lu = rotate(lr, o);     lu = lu / lu.length() * lc.r;     point ld = rotate(lr, -o);     ld = ld / ld.length() * lc.r;     return { lc.o + lu, lc.o + ld }; }
  |