题目:
POJ 2546 Circular Area
题意:
计算两圆公共部分面积
//260K 0MS G++提交WA,C++提交AC o(╯□╰)o
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
using namespace std;
const double eps=1e-8;
const double PI=acos(-1.0);
struct Circle{
double x,y,r;
};
double GetDis(Circle c1,Circle c2)//计算圆心距
{
return sqrt((c1.x-c2.x)*(c1.x-c2.x)+(c1.y-c2.y)*(c1.y-c2.y));
}
double CalcArea(Circle c1,Circle c2)
{
double dis=GetDis(c1,c2);
if(dis-(c1.r+c2.r)>=eps){ //两圆相离
return 0;
}else if(c1.r>=c2.r+dis){ //c1包含c2
return PI*c2.r*c2.r;
}else if(c2.r>=c1.r+dis){ //c2包含c1
return PI*c1.r*c1.r;
}
/*
处理两圆相交情况
分析交点及两圆圆心组成的四边形和交点与两圆圆心组成的两个扇形
假设c1圆扇形角为2*alpha,那么四边形的面积s等于:0.5*dis*c1.r*sin(alpha)*2=dis*c1.r*sin(alpha);
记c1,c2扇形面积分别为s1,s2.那么s1=(2*alpha/(2*PI))*PI*c1.r*c1.r=alpha*c1.r*c1.r;
而且alpha可以用余弦定理计算出来:cos(alpha)=(d^2+c1.r^2-c2.r^2)/(2*d*c1.r);
同理也可以计算出s2,所以相交部分面积为:s1+s2-s.
*/
double angle1=acos((dis*dis+c1.r*c1.r-c2.r*c2.r)/(2*dis*c1.r));
double s1=angle1*c1.r*c1.r; //c1圆扇形面积
double s=dis*c1.r*sin(angle1); //四边形面积
double angle2=acos((dis*dis+c2.r*c2.r-c1.r*c1.r)/(2*dis*c2.r)); //c2圆扇形面积
double s2=angle2*c2.r*c2.r;
return s1+s2-s;
}
int main()
{
Circle a,b;
while(cin>>a.x>>a.y>>a.r>>b.x>>b.y>>b.r){
double ans=CalcArea(a,b);
printf("%.3lf\n",ans);
}
return 0;
}
2732

被折叠的 条评论
为什么被折叠?



