Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <cstdlib>
- #include <cstring>
- #include <string>
- #include <vector>
- #include <map>
- #include <set>
- #include <cmath>
- #include <ctime>
- #include <cassert>
- using namespace std;
- #define pb push_back
- #define mp make_pair
- #define sz(A) (int)(A).size()
- typedef long long LL;
- typedef long double LD;
- struct vect {
- double x, y;
- vect() {}
- vect(double a, double b) {
- x = a, y = b;
- }
- void read() {
- cin >> x >> y;
- }
- double sqr_len() {
- return x * x + y * y;
- }
- void norm() {
- double l = sqrt(sqr_len());
- x /= l;
- y /= l;
- }
- };
- vect operator - (vect a, vect b) {
- return vect(a.x - b.x, a.y - b.y);
- }
- vect operator + (vect a, vect b) {
- return vect(a.x + b.x, a.y + b.y);
- }
- double sqr(double a) {
- return a * a;
- }
- double operator * (vect a, vect b) {
- return a.x * b.y - a.y * b.x;
- }
- double eval(vect c, double r, vect v1, vect v2, double d) {
- cerr << r << " ! " << d << endl;
- cerr << (sqr(r) * 2 - sqr(d)) / (2 * sqr(r)) << endl;
- double ang = acos( (sqr(r) * 2 - sqr(d)) / (2 * sqr(r)) );
- double res = (ang / 2) * sqr(r);
- res -= abs((v1 - c) * (v2 - c)) / 2;
- return res;
- }
- int main() {
- freopen("area.in", "r", stdin);
- freopen("area.out", "w", stdout);
- double r1, r2;
- vect c1, c2;
- c1.read();
- cin >> r1;
- c2.read();
- cin >> r2;
- c2 = c2 - c1;
- c1 = vect(0, 0);
- cout.precision(2);
- if (c2.sqr_len() >= sqr(r1 + r2)) {
- cout << fixed << 0 << endl;
- return 0;
- }
- if (c2.sqr_len() <= sqr(r1 - r2)) {
- r1 = min(r1, r2);
- cout << fixed << M_PI * r1 * r1 << endl;
- return 0;
- }
- vect copy2 = c2;
- copy2.norm();
- double dist = (sqr(r1) + c2.sqr_len() - sqr(r2)) / (2 * sqrt(c2.sqr_len()));
- copy2.x *= dist, copy2.y *= dist;
- vect v = vect(c1.y - c2.y, c2.x - c1.x);
- v.norm();
- cerr << v.x << " " << v.y << endl;
- double A = c1.x - c2.x, B = c1.y - c2.y;
- vect mid = copy2;
- double C = - A * mid.x - B * mid.y;
- cerr << dist << endl;
- cerr << A << " " << B << " " << C << endl;
- double h = abs(C) / sqrt(A * A + B * B);
- cerr << h << endl;
- double dx = sqrt( sqr(r1) - sqr(h) );
- v.x *= dx, v.y *= dx;
- vect v1 = mid - v;
- vect v2 = mid + v;
- double res = eval(c1, r1, v1, v2, 2 * dx) + eval(c2, r2, v1, v2, 2 * dx);
- cout << fixed << res << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement