pair<circle, circle> tangent_circles(const line& l, const line& m, double r) { double th = arg(m.b - m.a) - arg(l.b - l.a); double ph = (arg(m.b - m.a) + arg(l.b - l.a)) / 2.0; point p = crosspointLL(l, m); point d = polar(r / sin(th / 2.0), ph); return mp(circle(p - d, r), circle(p + d, r)); }
// 左側切除 Polygon convex_cut(const Polygon &p, const Line &l){ Polygon res; for(int i = 0; i < p.size(); ++i){ P a = curr(p,i), b = next(p,i); Line tl = Line(a, b); if(ccw(l[0], l[1], a) != -1) res.push_back(a); if(ccw(l[0], l[1], a) * ccw(l[0], l[1], b) < 0) res.push_back(crosspointLL(tl, l)); } return res; }
circle circum_circle(point a, point b, point c) { point o = crosspointLL(bisector(a, b), bisector(a, c)); return circle(o, abs(a - o)); }