POJ 2546 Circular Area(两圆相交面积模版题)

来源:互联网 发布:linux打开exe文件类型 编辑:程序博客网 时间:2024/05/16 19:00
Circular Area
Time Limit: 1000MS
Memory Limit: 65536KTotal Submissions: 5901
Accepted: 2298

Description

Your task is to write a program, which, given two circles, calculates the area of their intersection with the accuracy of three digits after decimal point.

Input

In the single line of input file there are space-separated real numbers x1 y1 r1 x2 y2 r2. They represent center coordinates and radii of two circles.

Output

The output file must contain single real number - the area.

Sample Input

20.0 30.0 15.0 40.0 30.0 30.0

Sample Output

608.366


题目链接:poj 2546Circular Area
题目大意,给你两个圆的坐标和半径,求两圆相交的面积有多大,输出保留三位小数。

以下是求两圆相交的模版
double Area_of_overlap(Point c1,double r1,Point c2,double r2){    double d = dist(c1,c2);    if(r1 + r2 < d + eps)return 0;    if(d < fabs(r1 - r2) + eps)    {        double r = min(r1,r2);        return PI*r*r;    }    double x = (d*d + r1*r1 - r2*r2)/(2*d);    double t1 = acos(x / r1);    double t2 = acos((d - x)/r2);    return r1*r1*t1 + r2*r2*t2 - d*r1*sin(t1);}

以下是AC代码
#include<cstdio>#include<iostream>#include<cmath>using namespace std;const double eps=1e-8;  const double PI = acos(-1.0);struct Point{    double x,y;    Point(){}    Point(double _x,double _y)    {        x = _x;y = _y;    }    Point operator -(const Point &b)const    {        return Point(x - b.x,y - b.y);    }    double operator *(const Point &b)const    {        return x*b.x + y*b.y;    }}; double dist(Point a,Point b){    return sqrt((a-b)*(a-b));}double Area_of_overlap(Point c1,double r1,Point c2,double r2){    double d = dist(c1,c2);    if(r1 + r2 < d + eps)return 0;    if(d < fabs(r1 - r2) + eps)    {        double r = min(r1,r2);        return PI*r*r;    }    double x = (d*d + r1*r1 - r2*r2)/(2*d);    double t1 = acos(x / r1);    double t2 = acos((d - x)/r2);    return r1*r1*t1 + r2*r2*t2 - d*r1*sin(t1);}int main(){Point c1,c2;double r1,r2;scanf("%lf%lf%lf%lf%lf%lf",&c1.x,&c1.y,&r1,&c2.x,&c2.y,&r2);double ans= Area_of_overlap(c1 , r1 , c2 , r2 );printf("%.3f\n",ans);return 0;}


原创粉丝点击