#include <iostream>
#include <cmath>
#include <cstdio>
#include<iomanip>
using namespace std;
const double eps=1e-6;
struct point
{
double x,y;
point(double x,double y):x(x),y(y) {}
};
double dis(point a,point b)
{
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
double area_of_overlap(point c1, double r1, point c2, double r2)
{
double a = dis(c1, c2), b = r1, c = r2;
double cta1 = acos((a * a + b * b - c * c) / 2 / (a * b)),
cta2 = acos((a * a + c * c - b * b) / 2 / (a * c));
double s1 = r1*r1*cta1 -
r1*r1*sin(cta1)*(a * a + b * b - c * c) / 2 / (a * b);
double s2 = r2*r2*cta2 -
r2*r2*sin(cta2)*(a * a + c * c - b * b) / 2 / (a * c);
return s1 + s2;
}
int main()
{
freopen("in.txt","r",stdin);
int T;
int cas=0;
cin >> T;
int x1,x2,y1,y2,r1,r2;
while (T--)
{
cin >> x1 >> y1 >> r1;
cin >> x2 >> y2 >> r2;
point a = point(x1,y1);
point b = point(x2,y2);
double ans;
cout << "Case " << ++cas << ": " ;
cout << fixed << setprecision(9) ;
if (dis(a,b)<=fabs(r1-r2)+eps)
{
ans = acos(-1)*pow(min(r1,r2),2);
}
else if (dis(a,b)+eps>r1+r2)
{
ans = 0;
}
else
{
ans = area_of_overlap(a,r1,b,r2);
}
cout << ans << endl;
}
}
求两圆交面积
最新推荐文章于 2023-05-15 21:36:49 发布