题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120
题意:求两圆环相交面积,模板题。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps = 1e-8;
const double pi = acos(-1.0);
int sgn(double x)
{
if(fabs(x) <= eps)
return 0;
return x > 0 ? 1 : -1;
}
struct node
{
double x,y;
};
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
double Area(node p1,double r1,node p2,double r2)
{
double d = dis(p1,p2);
if(sgn(r1 + r2 - d < 0))
return 0;
if(sgn(d - fabs(r1 - r2)) <= 0)
{
double r = min(r1,r2);
return pi*r*r;
}
double x = (d*d + r1*r1 - r2*r2)/(2*d);
double t1 = acos(x/r1);
double t2 = acos((d - x)/r2);
return r1*r1*t1 + r2*r2*t2 - d*r1*sin(t1);
}
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
double r,R;
scanf("%lf %lf",&r,&R);
node p1,p2;
scanf("%lf %lf",&p1.x,&p1.y);
scanf("%lf %lf",&p2.x,&p2.y);
double s1 = Area(p1,R,p2,R);
double s2 = Area(p1,r,p2,r);
double s3 = Area(p1,R,p2,r);
printf("Case #%d: %.6lf\n",cas++,s1+s2-2*s3);
}
return 0;
}