标签:
题目大意:给你两个圆环,让你求出来圆环的面积交,需要用到圆的面积交,然后容斥一下,就可以得到圆环的面积交。画一下图就会很清晰。
2 2 3 0 0 0 0 2 3 0 0 5 0
Case #1: 15.707963 Case #2: 2.250778
#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <math.h> #include <time.h> #include <stack> #include <map> #include <set> #define eps 1e-8 ///#define LL long long #define LL __int64 #define INF 0x3f3f3f #define PI acos(-1) #define mod 1000000007 using namespace std; struct Point { double x, y; }; double Distance(Point a, Point b) { return sqrt(((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y))*1.0); } double area_of_overlap(Point c1, double r1, Point c2, double r2) { double a = Distance(c1, c2); double b = r1; double c = r2; if((a >= b+c)) return 0.0; if(a < abs(b-c)) { double r = min(r1, r2); return PI*r*r; } double cta1 = acos((a*a+b*b-c*c)/2.0/(a*b)), cta2 = acos((a*a+c*c-b*b)/2.0/(a*c)); double s1 = r1*r1*cta1 -r1*r1*sin(cta1)*(a*a+b*b-c*c)/2/(a*b); double s2 = r2*r2*cta2 -r2*r2*sin(cta2)*(a*a+c*c-b*b)/2/(a*c); return s1+s2; } int main() { int T; int Case = 1; scanf("%d",&T); while(T--) { double r1, r2; Point a, b; scanf("%lf %lf",&r1, &r2); scanf("%lf %lf", &a.x, &a.y); scanf("%lf %lf", &b.x, &b.y); printf("Case #%d: ",Case++); if(a.x == b.x && a.y == b.y) { printf("%.6lf\n",PI*(r2*r2-r1*r1)); continue; } double sum = 0; sum += area_of_overlap(a, r2, b, r2); sum -= area_of_overlap(a, r1, b, r2); sum -= area_of_overlap(a, r2, b, r1); sum += area_of_overlap(a, r1, b, r1); printf("%.6lf\n",sum); } return 0; } /* 5 1 4 0 0 0 6 */
标签:
原文地址:http://blog.csdn.net/xu12110501127/article/details/42809137