Intersection HDU - 5120
题意:
求两个环,相交部分的面积。
思路:
先普及一下公式:
扇形面积:
s = l ∗ r 2 s = \frac{l*r}{2} s=2l∗r or s = r ∗ r ∗ a 2 s = \frac{r*r*a}{2} s=2r∗r∗a(其中a为弧度角)
介绍圆与圆的关系。(r1为大圆)
- r1 + r2 <= dis。 相离
- r1 - r2 >= dis。 大圆含小圆(相交)
- 下面就是相交
解题
- 先求出 大圆和大圆 相交的面积。(
不共心
) - 之后求出 大圆和小圆 相交的面积。(
不共心
) - 最后再求一下 小圆和小圆的 相交的面积 (
不共心
)
AC
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double PI = acos(-1.0);
double area(int r1, int r2, double dis){
if(r1 + r2 <= dis)return 0;
if(r1 - r2 >= dis)return PI*r2*r2;
double a1 = acos((r1*r1 + dis*dis - r2*r2)/(2*r1*dis));
double s1 = r1*r1*a1;
double a2 = acos((r2*r2 + dis*dis - r1*r1)/(2*r2*dis));
double s2 = r2*r2*a2;
double s3 = sin(a2)*r2*dis;
return s1 + s2 - s3;
}
int main()
{
int tt, kase=0;cin>>tt;
while(tt--){
int r,R;
int x1, y1, x2, y2;
cin>>r>>R;
cin>>x1>>y1>>x2>>y2;
double d = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double s1 = area(R, R, d);//大大
double s2 = area(R, r, d);//大小
double s3 = area(r, r, d);//小小
printf("Case #%d: %.6f\n", ++kase, s1 - 2*s2 + s3);
}
return 0;
}