Advertisement
Malinovsky239

Untitled

Oct 20th, 2012
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <string>
  7. #include <vector>
  8. #include <map>
  9. #include <set>
  10. #include <cmath>
  11. #include <ctime>
  12. #include <cassert>
  13.  
  14. using namespace std;
  15.  
  16. #define pb push_back
  17. #define mp make_pair
  18. #define sz(A) (int)(A).size()
  19.  
  20. typedef long long LL;
  21. typedef long double LD;
  22.  
  23. struct vect {
  24.     double x, y;
  25.  
  26.     vect() {}
  27.  
  28.     vect(double a, double b) {
  29.         x = a, y = b;
  30.     }
  31.  
  32.     void read() {
  33.         cin >> x >> y;
  34.     }
  35.  
  36.     double sqr_len() {
  37.         return x * x + y * y;
  38.     }
  39.  
  40.     void norm() {
  41.         double l = sqrt(sqr_len());
  42.         x /= l;
  43.         y /= l;
  44.     }
  45. };
  46.  
  47. vect operator - (vect a, vect b) {
  48.     return vect(a.x - b.x, a.y - b.y);
  49. }
  50.  
  51. vect operator + (vect a, vect b) {
  52.     return vect(a.x + b.x, a.y + b.y);
  53. }
  54.  
  55. double sqr(double a) {
  56.     return a * a;
  57. }
  58.  
  59. double operator * (vect a, vect b) {
  60.     return a.x * b.y - a.y * b.x;
  61. }
  62.  
  63. double eval(vect c, double r, vect v1, vect v2, double d) {
  64.     cerr << r << " ! " << d << endl;
  65.     cerr << (sqr(r) * 2 - sqr(d)) / (2 * sqr(r)) << endl;
  66.     double ang = acos( (sqr(r) * 2 - sqr(d)) / (2 * sqr(r)) );
  67.     double res = (ang / 2) * sqr(r);
  68.     res -= abs((v1 - c) * (v2 - c)) / 2;   
  69.     return res;
  70. }
  71.  
  72. int main() {
  73.     freopen("area.in", "r", stdin);
  74.     freopen("area.out", "w", stdout);  
  75.    
  76.     double r1, r2;
  77.     vect c1, c2;
  78.  
  79.     c1.read();
  80.     cin >> r1;
  81.     c2.read();
  82.     cin >> r2;
  83.  
  84.     c2 = c2 - c1;
  85.     c1 = vect(0, 0);
  86.  
  87.     cout.precision(2);
  88.     if (c2.sqr_len() >= sqr(r1 + r2)) {
  89.         cout << fixed << 0 << endl;
  90.         return 0;      
  91.     }
  92.  
  93.     if (c2.sqr_len() <= sqr(r1 - r2)) {
  94.         r1 = min(r1, r2);
  95.         cout << fixed << M_PI * r1 * r1 << endl;
  96.         return 0;
  97.     }
  98.  
  99.     vect copy2 = c2;
  100.     copy2.norm();
  101.     double dist = (sqr(r1) + c2.sqr_len() - sqr(r2)) / (2 * sqrt(c2.sqr_len()));
  102.     copy2.x *= dist, copy2.y *= dist;
  103.  
  104.     vect v = vect(c1.y - c2.y, c2.x - c1.x);
  105.     v.norm();
  106.     cerr << v.x << " " << v.y << endl; 
  107.  
  108.     double A = c1.x - c2.x, B = c1.y - c2.y;
  109.     vect mid = copy2;
  110.     double C = - A * mid.x - B * mid.y;
  111.     cerr << dist << endl;
  112.     cerr << A << " " << B << " " << C << endl;
  113.     double h = abs(C) / sqrt(A * A + B * B);
  114.     cerr << h << endl;
  115.     double dx = sqrt( sqr(r1) - sqr(h) );          
  116.  
  117.     v.x *= dx, v.y *= dx;
  118.  
  119.     vect v1 = mid - v;
  120.     vect v2 = mid + v;
  121.  
  122.     double res = eval(c1, r1, v1, v2, 2 * dx) + eval(c2, r2, v1, v2, 2 * dx);
  123.     cout << fixed << res << endl;
  124.    
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement