已知半径和两圆相交面积求圆心距

时间:2022-05-07 09:45:15

用两个扇形的面积减去一个四边形的面积就是两圆相交的面积。

海伦公式,扇形的面积公式==(|a|*r*r)/2。

题目要求只需要保留整数部分,所以不需要精确算出来具体的值。


#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#define pi 3.1415926 
using namespace std;
double intersect(double r1,double r2,double l){//求两圆的相交面积
    double s,p,ans;
    if(l>=r1+r2)	ans=0;
    else if(l<=abs(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){
			swap(r1,r2);
        }
        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()
{
	double r1,r2,s;
	int T,x;
	scanf("%d",&T);
	while(T--){
		scanf("%lf%lf%lf",&r1,&r2,&s);
		double l=0.0,r=r1+r2,mid;
		while(l<r){
			mid=(l+r)/2;
			double temp=intersect(r1,r2,mid);
			if((int)r==int(l)){//整数部分相同时
				x=int(r);
				break;
			}
			else if(temp>s)
				l=mid;
			else
				r=mid;
		}
		printf("%d\n",x);
	}
	return 0;
}