两圆面积交

题目:poj2546求两圆面积交
算法
  两圆的位置关系有5种,而这里要求它们的面积交,分三种情况就可以了。
  第一,外离和外切,面积为0
  第二,内切和内含,面积为较小的圆的面积。
  第三,相交。我们可以把它们相交的面积分成两个弓形,进而求这两个弓形的面积。弓形的面积就是扇形的面积减去一个三角形的面积,三角形的面积可以用海伦公式,而对于扇形,我们要用余弦定理先求出它的圆心角再acos一下就ok了。
Sample Input Sample Output
20.0 30.0 15.0 40.0 30.0 30.0 608.366

#include <bits/stdc++.h>
using namespace std;
#define Pi acos(-1.0)
using namespace std;
int main(){
    double x1,x2,r1,r2,y1,y2;//定义两圆心及半径
    while (scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2)!=EOF){//输入
        double x=abs(x1-x2);    //求出X差
        double y=abs(y1-y2);    //求出Y差
        double l=sqrt(x*x+y*y); //求和距离
        if (r1<r2) swap(r1,r2); //保证R1<R2
        if (r1+r2<=l) printf("0.000\n");//两圆分离
        else if (abs(r1-r2)>=l) printf("%.3f\n",Pi*min(r1*r1,r2*r2));//包含关系
        else {//否则就是相交
            double a=r1,b=r2,c=l;//A是半径一,B是半径二
            double A=acos((c*c+b*b-a*a)/(2*c*b));//读出圆一的交弧角度
            double B=acos((c*c+a*a-b*b)/(2*c*a));//读出圆二的交弧角度
            double s=(a+b+c)/2;         //求出三角形周长一半
            s=sqrt(s*(s-a)*(s-b)*(s-c));//海勒公式求面积,这个三角形是底是圆心距,高是连心线到交点垂线距
            double area=a*a*B+b*b*A-2*s;//求出答案
            printf("%.3f\n",area);      //输出
        }//基本思路就是两圆减去两个三角形
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cj1064789374/article/details/84933305