Problem:acm.hdu.edu.cn/showproblem.php?pid=5120
求两个一样的圆环的相交部分的面积
这道题不难,就是精度坑
#define PI 3.1415926535 -------> Wrong Answer
#define PI 3.14159265359 ------> Accepted
算圆周率还是用 Pi = arccos(-1)来算好
dd 是圆心距平方,d 是圆心距,因为输入都是整数,在考虑两圆位置关系的时候,换成平方可以避免小数误差(吧)
但是…在算角的时候要用到圆心距的平方,直接用 dd 准确值讲道理应该要对的,错了…反而用 d*d 才过
#include <stdio.h>
#include <math.h>
double area(int x1,int y1,int r1,int x2,int y2,int r2)
{
double Pi = acos(-1);
int dd = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
double d = sqrt(dd),angle1,angle2;
if( dd >= (r1+r2)*(r1+r2) )
return 0;
if( dd <= (r1-r2)*(r1-r2) )
if( r1<r2 )
return Pi*r1*r1;
else
return Pi*r2*r2;
angle1 = acos( (d*d+r1*r1-r2*r2)/2/d/r1 ); // 换成 dd 准确值讲道理应该是对的
angle2 = acos( (d*d+r2*r2-r1*r1)/2/d/r2 ); // 结果反而错了,用 d*d 才对
return z1*r1*r1 + z2*r2*r2 - r1*d*sin(angle1);
}
int main()
{
int t,kase;
scanf("%d",&t);
for(kase=1;kase<=t;kase++)
{
int r,R,x1,x2,y1,y2;
double ans;
scanf("%d%d%d%d%d%d",&r,&R,&x1,&y1,&x2,&y2);
ans = area(x1,y1,R,x2,y2,R) -
2 * area(x1,y1,r,x2,y2,R) + area(x1,y1,r,x2,y2,r);
printf("Case #%d: %.6f\n",kase,ans);
}
return 0;
}