Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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 sqr(double a) {
- return a * a;
- }
- 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);
- }
- 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 < ans.size(); ++i)
- ans[i].c -= ans[i].a * a.x + ans[i].b * a.y;
- vector < Line > ret;
- for (int i = 0; i < ans.size(); ++i) {
- bool ok = true;
- for (int j = 0; j < ret.size(); ++j)
- if (areSame(ret[j], ans[i])) {
- ok = false;
- break;
- }
- if (ok) ret.push_back(ans[i]);
- }
- return ret;
- }
- 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;
- }
- }
- 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;
- }
- double commonCircleArea(Circle c1, Circle c2) {
- 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 * 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);
- }
- 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;
- }
- 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement