您的位置:首页 > 其它

hdu 5120 Intersection(求相交圆的面积)

2016-10-17 19:28 363 查看


画画图发现,两个相同的环重合部分的面积就是A大圆和B大圆相交的面积,减去A大圆和B小圆,减去A小圆和B大圆的面积,再加上两个小圆相交的面积,直接套,两圆相交的面积模板

S = A大B大 - A大B小 - A小B大 + A小B小。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
double S1,S2,S3,a1,a2,d,p,ans,mi;
int x1,yy,x2,y2;
struct circle
{
double x,y,r;
};

double area(int rrr,int RRR)//两圆相交的面积
{
circle a,b;
a.x=x1;
a.y=yy;
b.x=x2;
b.y=y2;
a.r=rrr;
b.r=RRR;
d=(double)sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
mi=min(a.r,b.r);
if(d>a.r+b.r||d==a.r+b.r)
ans=0.0;
else if(d<abs(a.r-b.r)||d==abs(a.r-b.r))
ans=acos(-1.0)*mi*mi;
else
{
p=(a.r+b.r+d)/2.0;
a1=acos((a.r*a.r+d*d-b.r*b.r)/(2.0*a.r*d));
a2=acos((b.r*b.r+d*d-a.r*a.r)/(2.0*b.r*d));
S1=a1*a.r*a.r;
S2=a2*b.r*b.r;
S3=2*sqrt(p*(p-a.r)*(p-b.r)*(p-d));
ans=S1+S2-S3;
}
return ans;
}

int main()
{

int casen;
cin>>casen;
for(int tt=1;tt<=casen;tt++)
{
int rr,RR;
cin>>rr>>RR;
cin>>x1>>yy>>x2>>y2;
double BB=area(RR,RR);
double Bb=area(RR,rr);
double bB=area(rr,RR);
double bb=area(rr,rr);
double Ans=BB-Bb-bB+bb;
printf("Case #%d: %.6lf\n",tt,Ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: