Poj--2546(两圆相交)
2014-11-28 23:55:59
思路:两圆相交模板题,找了一发模板,挺好的。
1 /************************************************************************* 2 > File Name: 2546.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Fri 28 Nov 2014 11:39:45 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <map> 14 #include <set> 15 #include <stack> 16 #include <queue> 17 #include <iostream> 18 #include <algorithm> 19 using namespace std; 20 #define lp (p << 1) 21 #define rp (p << 1|1) 22 #define getmid(l,r) (l + (r - l) / 2) 23 #define MP(a,b) make_pair(a,b) 24 typedef long long ll; 25 const int INF = 1 << 30; 26 const double PI = acos(-1.0); 27 28 struct circle{ 29 double x,y,r; 30 }; 31 32 double Cal_area(circle a,circle b){ 33 double d = sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); 34 if(d >= a.r + b.r) 35 return 0; 36 double r = min(a.r,b.r); 37 if(d <= fabs(b.r - a.r)) 38 return PI * r * r; 39 double a1 = acos((a.r * a.r + d * d - b.r * b.r) / (2.0 * a.r * d)); 40 double a2 = acos((b.r * b.r + d * d - a.r * a.r) / (2.0 * b.r * d)); 41 double ans = -d * a.r * sin(a1); 42 ans += a1 * a.r * a.r + a2 * b.r * b.r; 43 return ans; 44 } 45 46 int main(){ 47 circle a,b; 48 while(scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&a.r,&b.x,&b.y,&b.r) != EOF){ 49 printf("%.3f\n",Cal_area(a,b)); 50 } 51 return 0; 52 }

浙公网安备 33010602011771号