double calc(const point &a, const point &b) { point p[2]; int num = 0; int ina = dcmp(a.norm()- r) < 0; int inb = dcmp(b.norm() - r) < 0; if (ina) { if (inb) { return fabs(det(a, b)) / 2; } else { circle_inter_line(a, b, point(0, 0), r, p, num); return sector_area(b, p[0]) + fabs(det(a, p[0])) / 2; } } else { if (inb) { circle_inter_line(a, b, point(0, 0), r, p, num); return sector_area(p[0], a) + fabs(det(p[0], b)) / 2; } else { circle_inter_line(a, b, point(0, 0), r, p, num); if (num == 2) { return sector_area(a, p[0]) + sector_area(p[1], b) + fabs(det(p[0], p[1])) / 2; } else { return sector_area(a, b); } } } }
friend double norm(const point & p) { return p.norm(); }