/*
求两圆相交部分的面积
输入两个圆心坐标和半径
直接调用模板就行
*/
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdio.h>
#include<math.h>
#define ll long long
#define INF 2147483647
#define N 25
#define PI acos(-1)
#define EPS 1e-8
using namespace std;
double intersect(double x1,double y1,double r1,double x2,double y2,double r2)
{
double s,temp,p,l,ans;
l=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
if(l>=r1+r2) ans=0;
else if(l<=fabs(r1-r2))
{
if(r1<=r2) ans=PI*r1*r1;
else ans=PI*r2*r2;
}
else
{
p=(l+r1+r2)/2;
s=2*sqrt(p*(p-l)*(p-r1)*(p-r2));
if(r1>r2)
{
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
temp=r1;
r1=r2;
r2=temp;
}
ans=acos((r1*r1+l*l-r2*r2)/(2*r1*l))*r1*r1+acos((r2*r2+l*l-r1*r1)/(2*r2*l))*r2*r2-s;
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
double x1,y1,r1,x2,y2,r2;
cin>>r1>>r2>>x1>>y1>>x2>>y2;
double s=intersect(x1,y1,r1,x2,y2,r2);
printf("%.6lf\n",s);
}
return 0;
}
求两圆相交部分的面积
输入两个圆心坐标和半径
直接调用模板就行
*/
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdio.h>
#include<math.h>
#define ll long long
#define INF 2147483647
#define N 25
#define PI acos(-1)
#define EPS 1e-8
using namespace std;
double intersect(double x1,double y1,double r1,double x2,double y2,double r2)
{
double s,temp,p,l,ans;
l=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
if(l>=r1+r2) ans=0;
else if(l<=fabs(r1-r2))
{
if(r1<=r2) ans=PI*r1*r1;
else ans=PI*r2*r2;
}
else
{
p=(l+r1+r2)/2;
s=2*sqrt(p*(p-l)*(p-r1)*(p-r2));
if(r1>r2)
{
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
temp=r1;
r1=r2;
r2=temp;
}
ans=acos((r1*r1+l*l-r2*r2)/(2*r1*l))*r1*r1+acos((r2*r2+l*l-r1*r1)/(2*r2*l))*r2*r2-s;
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
double x1,y1,r1,x2,y2,r2;
cin>>r1>>r2>>x1>>y1>>x2>>y2;
double s=intersect(x1,y1,r1,x2,y2,r2);
printf("%.6lf\n",s);
}
return 0;
}