TOJ 1754 Circular Area 两圆相交的面积

来源:互联网 发布:淘宝的市场定位 编辑:程序博客网 时间:2024/05/13 19:57

题意


题目链接:TOJ 1754 Circular Area
就是给出两个圆的圆心坐标和半径,求出俩圆的相交的面积。

SampleInput
20.0 30.0 15.0 40.0 30.0 30.0

SampleOutput
608.366


思路


几何问题
两个圆相含和相离不用多说了–相交就用俩扇形减去那个四边形就行。
注:求角的时候可以使用反三角函数,可以使用直角三角形计算

d2+t2=r21
(ld)2+t2=r22   其中 l 是俩圆心的距离,d是其中一个圆心到两圆交点连线的中点的距离、

这样计算可以避免二次方程。


代码


/*Accepted  1754    C++ 0.7K    0'00.00"    1364K*#include <iostream>#include <cmath>#include <stdio.h>using namespace std;int main(){    double x1,y1,r1,x2,y2,r2,d,l;    while(cin>>x1>>y1>>r1>>x2>>y2>>r2)    {        l=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));        if(l>=(r1+r2)) printf("0.000\n");// 两圆相离        else if(l<=r2-r1)printf("%.3lf\n",3.141592653*r1*r1);//r2包含r1        else if(l<=r1-r2)printf("%.3lf\n",3.141592653*r2*r2);//r1包含r2        else{//相交        double angle1=acos((l*l-r2*r2+r1*r1)/(2*l*r1));//夹角的一半        double angle2=acos((l*l-r1*r1+r2*r2)/(2*l*r2));        double s1=angle1*r1*r1;        double s2=angle2*r2*r2;        double s3=l*r1*sin(angle1);        printf("%.3lf\n",s1+s2-s3);        }    }}
0 0
原创粉丝点击