题目链接:
Description
Your task is to write a program, which, given two circles, calculates the area of their intersection with the accuracy of three digits after decimal point.
Input
In the single line of input file there are space-separated real numbers x1 y1 r1 x2 y2 r2. They represent center coordinates and radii of two circles.
Output
The output file must contain single real number - the area.
Sample Input
20.0 30.0 15.0 40.0 30.0 30.0
Sample Output
608.366
大意是给出两圆心,及圆的半径,求两个圆相交部分的面积,求解关键是对分好case进行处理
Accepted:
1 #include2 #include 3 #include 4 #define Pi 3.1415926 5 6 using namespace std; 7 typedef struct Point 8 { 9 float x, y;10 }Point;11 typedef struct Circle12 {13 Point p;14 float r;15 }Circle;16 double Dis(Point p1, Point p2);17 double CArea( Circle c1, Circle c2);18 int main()19 {20 float x1, y1, r1, x2, y2, r2;21 cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;22 double s = 0;23 Circle c1, c2;24 Point p1, p2;25 if(r1 <= r2)26 {27 p1.x = x1, p1.y = y1, c1.p = p1, c1.r = r1;28 p2.x = x2, p2.y = y2, c2.p = p2, c2.r = r2;29 }30 else31 {32 p1.x = x2, p1.y = y2, c1.p = p1, c1.r = r2;33 p2.x = x1, p2.y = y1, c2.p = p2, c2.r = r1;34 }35 36 s = CArea(c1, c2);37 cout << setiosflags(ios::fixed)< << s << endl;38 return 0;39 }40 double CArea( Circle c1, Circle c2)41 {42 double s = 0;43 double x = 0, y = 0, h = 0;44 double alpha = 0, beta = 0;45 double d = Dis(c1.p, c2.p);46 if(d >= (c1.r + c2.r))47 {48 s = 0;49 //cout << "case 1" << endl;50 }51 else if(c2.r >= (c1.r + d))52 {53 s = Pi*c1.r*c1.r;54 //cout << "case 2" << endl;55 }56 else if(d >= sqrt(pow(c2.r, 2) - pow(c1.r, 2)) && d < c2.r + c1.r)57 {58 x = (pow(c2.r, 2) - pow(c1.r, 2) + pow(d, 2)) / (2*d);59 h = sqrt(pow(c2.r, 2) - pow(x, 2));60 alpha = asin(h/c1.r);61 beta = asin(h/c2.r);62 s = alpha*pow(c1.r, 2) + beta*pow(c2.r, 2) - d*h;63 //cout << "case 3" << endl;64 }65 else if(d <= sqrt(pow(c2.r, 2) - pow(c1.r, 2)) && d >= c2.r - c1.r)66 {67 68 y = (pow(c2.r, 2) - pow(c1.r, 2) - pow(d, 2)) /(2*d);69 h = sqrt(pow(c1.r, 2) - pow(y, 2));70 alpha = asin(h/c1.r);71 beta = asin(h/c2.r);72 s = (Pi - alpha)*pow(c1.r, 2) + h*y + beta*pow(c2.r, 2) - h*(d+y);73 //cout << "case 4" << endl;74 }75 return s;76 }77 double Dis(Point p1, Point p2)78 {79 return sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y));80 }