This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub ngthanhtrung23/ACM_Notebook_new
struct Circle : Point { double r; Circle(double _x = 0, double _y = 0, double _r = 0) : Point(_x, _y), r(_r) {} Circle(Point p, double _r) : Point(p), r(_r) {} bool contains(Point p) { return (*this - p).len() <= r + EPS; } double area() const { return r*r*M_PI; } // definitions in https://en.wikipedia.org/wiki/Circle // assumption: 0 <= theta <= 2*PI // theta: angle in radian double sector_area(double theta) const { return 0.5 * r * r * theta; } // assumption: 0 <= theta <= 2*PI // theta: angle in radian double segment_area(double theta) const { return 0.5 * r * r * (theta - sin(theta)); } }; istream& operator >> (istream& cin, Circle& c) { cin >> c.x >> c.y >> c.r; return cin; } ostream& operator << (ostream& cout, const Circle& c) { cout << '(' << c.x << ", " << c.y << ") " << c.r; return cout; } // Find common tangents to 2 circles // Tested: // - http://codeforces.com/gym/100803/ - H // Helper method void tangents(Point c, double r1, double r2, vector<Line> & ans) { double r = r2 - r1; double z = sqr(c.x) + sqr(c.y); double d = z - sqr(r); if (d < -EPS) return; d = sqrt(fabs(d)); Line l((c.x * r + c.y * d) / z, (c.y * r - c.x * d) / z, r1); ans.push_back(l); } // Actual method: returns vector containing all common tangents vector<Line> tangents(Circle a, Circle b) { vector<Line> ans; ans.clear(); for (int i=-1; i<=1; i+=2) for (int j=-1; j<=1; j+=2) tangents(b-a, a.r*i, b.r*j, ans); for(int i = 0; i < (int) ans.size(); ++i) ans[i].c -= ans[i].a * a.x + ans[i].b * a.y; vector<Line> ret; for(int i = 0; i < (int) ans.size(); ++i) { if (std::none_of(ret.begin(), ret.end(), [&] (Line l) { return areSame(l, ans[i]); })) { ret.push_back(ans[i]); } } return ret; } // Circle & line intersection // Tested: // - http://codeforces.com/gym/100803/ - H vector<Point> intersection(Line l, Circle cir) { double r = cir.r, a = l.a, b = l.b, c = l.c + l.a*cir.x + l.b*cir.y; vector<Point> res; double x0 = -a*c/(a*a+b*b), y0 = -b*c/(a*a+b*b); if (c*c > r*r*(a*a+b*b)+EPS) return res; else if (fabs(c*c - r*r*(a*a+b*b)) < EPS) { res.push_back(Point(x0, y0) + Point(cir.x, cir.y)); return res; } else { double d = r*r - c*c/(a*a+b*b); double mult = sqrt (d / (a*a+b*b)); double ax,ay,bx,by; ax = x0 + b * mult; bx = x0 - b * mult; ay = y0 - a * mult; by = y0 + a * mult; res.push_back(Point(ax, ay) + Point(cir.x, cir.y)); res.push_back(Point(bx, by) + Point(cir.x, cir.y)); return res; } } // helper functions for commonCircleArea double cir_area_solve(double a, double b, double c) { return acos((a*a + b*b - c*c) / 2 / a / b); } double cir_area_cut(double a, double r) { double s1 = a * r * r / 2; double s2 = sin(a) * r * r / 2; return s1 - s2; } // Tested: http://codeforces.com/contest/600/problem/D double commonCircleArea(Circle c1, Circle c2) { //return the common area of two circle if (c1.r < c2.r) swap(c1, c2); double d = (c1 - c2).len(); if (d + c2.r <= c1.r + EPS) return c2.r*c2.r*M_PI; if (d >= c1.r + c2.r - EPS) return 0.0; double a1 = cir_area_solve(d, c1.r, c2.r); double a2 = cir_area_solve(d, c2.r, c1.r); return cir_area_cut(a1*2, c1.r) + cir_area_cut(a2*2, c2.r); } // Check if 2 circle intersects. Return true if 2 circles touch bool areIntersect(Circle u, Circle v) { if (cmp((u - v).len(), u.r + v.r) > 0) return false; if (cmp((u - v).len() + v.r, u.r) < 0) return false; if (cmp((u - v).len() + u.r, v.r) < 0) return false; return true; } // If 2 circle touches, will return 2 (same) points // If 2 circle are same --> be careful // Tested: // - http://codeforces.com/gym/100803/ - H // - http://codeforces.com/gym/100820/ - I vector<Point> circleIntersect(Circle u, Circle v) { vector<Point> res; if (!areIntersect(u, v)) return res; double d = (u - v).len(); double alpha = acos((u.r * u.r + d*d - v.r * v.r) / 2.0 / u.r / d); Point p1 = (v - u).rotate(alpha); Point p2 = (v - u).rotate(-alpha); res.push_back(p1 / p1.len() * u.r + u); res.push_back(p2 / p2.len() * u.r + u); return res; }
#line 1 "Geometry/circle.h" struct Circle : Point { double r; Circle(double _x = 0, double _y = 0, double _r = 0) : Point(_x, _y), r(_r) {} Circle(Point p, double _r) : Point(p), r(_r) {} bool contains(Point p) { return (*this - p).len() <= r + EPS; } double area() const { return r*r*M_PI; } // definitions in https://en.wikipedia.org/wiki/Circle // assumption: 0 <= theta <= 2*PI // theta: angle in radian double sector_area(double theta) const { return 0.5 * r * r * theta; } // assumption: 0 <= theta <= 2*PI // theta: angle in radian double segment_area(double theta) const { return 0.5 * r * r * (theta - sin(theta)); } }; istream& operator >> (istream& cin, Circle& c) { cin >> c.x >> c.y >> c.r; return cin; } ostream& operator << (ostream& cout, const Circle& c) { cout << '(' << c.x << ", " << c.y << ") " << c.r; return cout; } // Find common tangents to 2 circles // Tested: // - http://codeforces.com/gym/100803/ - H // Helper method void tangents(Point c, double r1, double r2, vector<Line> & ans) { double r = r2 - r1; double z = sqr(c.x) + sqr(c.y); double d = z - sqr(r); if (d < -EPS) return; d = sqrt(fabs(d)); Line l((c.x * r + c.y * d) / z, (c.y * r - c.x * d) / z, r1); ans.push_back(l); } // Actual method: returns vector containing all common tangents vector<Line> tangents(Circle a, Circle b) { vector<Line> ans; ans.clear(); for (int i=-1; i<=1; i+=2) for (int j=-1; j<=1; j+=2) tangents(b-a, a.r*i, b.r*j, ans); for(int i = 0; i < (int) ans.size(); ++i) ans[i].c -= ans[i].a * a.x + ans[i].b * a.y; vector<Line> ret; for(int i = 0; i < (int) ans.size(); ++i) { if (std::none_of(ret.begin(), ret.end(), [&] (Line l) { return areSame(l, ans[i]); })) { ret.push_back(ans[i]); } } return ret; } // Circle & line intersection // Tested: // - http://codeforces.com/gym/100803/ - H vector<Point> intersection(Line l, Circle cir) { double r = cir.r, a = l.a, b = l.b, c = l.c + l.a*cir.x + l.b*cir.y; vector<Point> res; double x0 = -a*c/(a*a+b*b), y0 = -b*c/(a*a+b*b); if (c*c > r*r*(a*a+b*b)+EPS) return res; else if (fabs(c*c - r*r*(a*a+b*b)) < EPS) { res.push_back(Point(x0, y0) + Point(cir.x, cir.y)); return res; } else { double d = r*r - c*c/(a*a+b*b); double mult = sqrt (d / (a*a+b*b)); double ax,ay,bx,by; ax = x0 + b * mult; bx = x0 - b * mult; ay = y0 - a * mult; by = y0 + a * mult; res.push_back(Point(ax, ay) + Point(cir.x, cir.y)); res.push_back(Point(bx, by) + Point(cir.x, cir.y)); return res; } } // helper functions for commonCircleArea double cir_area_solve(double a, double b, double c) { return acos((a*a + b*b - c*c) / 2 / a / b); } double cir_area_cut(double a, double r) { double s1 = a * r * r / 2; double s2 = sin(a) * r * r / 2; return s1 - s2; } // Tested: http://codeforces.com/contest/600/problem/D double commonCircleArea(Circle c1, Circle c2) { //return the common area of two circle if (c1.r < c2.r) swap(c1, c2); double d = (c1 - c2).len(); if (d + c2.r <= c1.r + EPS) return c2.r*c2.r*M_PI; if (d >= c1.r + c2.r - EPS) return 0.0; double a1 = cir_area_solve(d, c1.r, c2.r); double a2 = cir_area_solve(d, c2.r, c1.r); return cir_area_cut(a1*2, c1.r) + cir_area_cut(a2*2, c2.r); } // Check if 2 circle intersects. Return true if 2 circles touch bool areIntersect(Circle u, Circle v) { if (cmp((u - v).len(), u.r + v.r) > 0) return false; if (cmp((u - v).len() + v.r, u.r) < 0) return false; if (cmp((u - v).len() + u.r, v.r) < 0) return false; return true; } // If 2 circle touches, will return 2 (same) points // If 2 circle are same --> be careful // Tested: // - http://codeforces.com/gym/100803/ - H // - http://codeforces.com/gym/100820/ - I vector<Point> circleIntersect(Circle u, Circle v) { vector<Point> res; if (!areIntersect(u, v)) return res; double d = (u - v).len(); double alpha = acos((u.r * u.r + d*d - v.r * v.r) / 2.0 / u.r / d); Point p1 = (v - u).rotate(alpha); Point p2 = (v - u).rotate(-alpha); res.push_back(p1 / p1.len() * u.r + u); res.push_back(p2 / p2.len() * u.r + u); return res; }