poj2546

裸的 兩圓相交求面積。

設兩圓心分別爲o1、o2,交點爲a、b,則所求面積=是s1(o1弧ab)+s2(o2弧ab)-s3(四邊形o1o2ab)。

 

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define PI 3.1415926535897932384626433832795
struct point
{
    double x,y,r;
}a,b;
double dis(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double interarea(point a,point b)
{
   double d=dis(a,b);
   if(d>=a.r+b.r)return 0;
   double r=a.r>b.r?b.r:a.r;
   if(d<=fabs(a.r-b.r))return PI*r*r;
   double angle1=acos((a.r*a.r+d*d-b.r*b.r)/2.0/a.r/d);
   double angle2=acos((b.r*b.r+d*d-a.r*a.r)/2.0/b.r/d);
   double ans=0;
   ans-=d*a.r*sin(angle1);
   ans+=angle1*a.r*a.r+angle2*b.r*b.r;
   return ans;
}
int main()
{
    while(scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&a.r,&b.x,&b.y,&b.r)!=EOF)
    {
        double area=interarea(a,b);
        printf("%.3lf\n",area);
    }
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章