fork(1) download
  1. #include "bits/stdc++.h"
  2.  
  3. #define int long long
  4. using namespace std;
  5. const int N = 1e5 + 5, mod = 1e9 + 7;
  6. typedef complex<double> point;
  7. #define INF 1e18
  8. #define ld long double
  9. #define eps 1e-4
  10. #define PI acos(-1)
  11. #define X real()
  12. #define Y imag()
  13. #define polar(r, t) ((r)*exp(point(0,(t))))
  14. #define angle(a) (atan2l((a).Y,(a).X))
  15. #define vec(a, b) ((b)-(a))
  16. #define length(a) (hypot((a).Y,(a).X))
  17. #define normalize(a) ((a)/length(a))
  18. #define dp(a, b) ((conj(a)*(b)).X)
  19. #define cp(a, b) ((conj(a)*(b)).Y)
  20. #define length2(a) (dot(a,a))
  21. #define rotate0(a, ang) (polar(a,ang))
  22. #define rotateA(a, ang, A) (rotate0(vec(A,a),ang)+(A))
  23. #define reflect(v, m) (conj((v)/(m))*(m))
  24.  
  25. int dcmp(ld a, ld b) {
  26. if (fabs(a - b) <= eps)return 0;
  27.  
  28. return a < b ? -1 : 1;
  29. }
  30.  
  31.  
  32. double fixAngle(double A) {
  33. return A > 1 ? 1 : (A < -1 ? -1 : A);
  34. }
  35.  
  36. double getAngle_A_abc(double a, double b, double c) {
  37. return acos(fixAngle((b * b + c * c - a * a) / (2 * b * c)));
  38. }
  39.  
  40. // norm(a) // return x^2 + y^2 //a is point //can use dp(a,a)
  41. bool same(point p1, point p2) {// check to points same or not
  42. return dp(vec(p1, p2), vec(p1, p2)) < eps;
  43. }
  44.  
  45. vector<point> intersectCircleCircle(point c1, double r1, point c2, double r2) {
  46. // Handle infinity case first: same center/radius and r > 0
  47. if (same(c1, c2) && dcmp(r1, r2) == 0 && dcmp(r1, 0) > 0)
  48. return vector<point>(3, c1); // infinity 2 same circles (not points)
  49.  
  50. // Compute 2 intersection case and handle 0, 1, 2 cases
  51. double ang1 = angle(vec(c1, c2)), ang2 = getAngle_A_abc(r2, r1, length(vec(c1, c2)));
  52. if (::isnan(ang2)) ang2 = 0; // if r1 or d = 0 => nan in getAngle_A_abc (/0)
  53.  
  54. vector<point> v(1, polar(r1, ang1 + ang2) + c1);
  55. // if point NOT on the 2 circles = no intersection
  56. if (dcmp(dp(vec(c1, v[0]), vec(c1, v[0])), r1 * r1) != 0 ||
  57. dcmp(dp(vec(c2, v[0]), vec(c2, v[0])), r2 * r2) != 0)
  58. return vector<point>();
  59. v.push_back(polar(r1, ang1 - ang2) + c1);
  60. if (same(v[0], v[1])) // if same, then 1 intersection only
  61. v.pop_back();
  62. return v;
  63. }
  64.  
  65. ld circleCircleIntersectionArea(point cen1, ld r1, point cen2, ld r2) {
  66. ld dis = hypot(cen1.X - cen2.X, cen1.Y - cen2.Y);
  67. if (dis > r1 + r2)return 0;
  68. if (dis <= fabs(r2 - r1) && r1 >= r2)
  69. return PI * r2 * r2;
  70. if (dis <= fabs(r2 - r1) && r1 < r2)
  71. return PI * r1 * r1;
  72. ld a = r1 * r1, b = r2 * r2;
  73. ld ang1 = acos((a + dis * dis - b) / (2 * r1 * dis)) * 2;
  74. ld ang2 = acos((b + dis * dis - a) / (2 * r2 * dis)) * 2;
  75. ld ret1 = .5 * b * (ang2 - sin(ang2));
  76. ld ret2 = .5 * a * (ang1 - sin(ang1));
  77. return ret1 + ret2;
  78. }
  79.  
  80. signed main() {
  81. ios_base::sync_with_stdio(false);
  82. cin.tie(nullptr);
  83. cout.tie(nullptr);
  84. ld x1, y1, x2, y2, r1, r2;
  85. cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
  86. point a(x1, y1), b(x2, y2);
  87. auto v = intersectCircleCircle(a, r1, b, r2);
  88. if (v.size() == 3 || v.empty() || dcmp(circleCircleIntersectionArea(a, r1, b, r2),0) == 0) {
  89. cout << -1;
  90. return 0;
  91. }
  92. int x = r1, y = r2;
  93. if (v.size() == 1) {
  94. if (norm(a - b) == (x + y) * (x + y)) {
  95. cout << -1;
  96. return 0;
  97. }
  98. ld R = max(r1, r2);
  99. ld area = R * R * PI - circleCircleIntersectionArea(a, r1, b, r2);
  100. cout << fixed << setprecision(8) << area;
  101. return 0;
  102. }
  103. ld area = circleCircleIntersectionArea(a, r1, b, r2);
  104. ld ans = r1 * r1 * PI;
  105. ans = max(ans, r2 * r2 * PI);
  106. cout << fixed << setprecision(8) << ans - area;
  107. return 0;
  108. }
Success #stdin #stdout 0s 5284KB
stdin
Standard input is empty
stdout
-1