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 }; }
|