Poj.2546 Circular Area【两圆相交面积】 2015/09/23

Circular Area
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 5475 Accepted: 2170

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

Source

Northeastern Europe 2000, Far-Eastern Subregion
同ZOJ1597,模板
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

double overlop_area(double x1,double y1,double r1,double x2,double y2,double r2){
    double d = sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) );
    double angle1,angle2,h1,h2,s1,s2;
    if( d >= r1+r2 )
        return 0;
    if( d <= fabs(r1-r2) )
        return min( acos(-1.0)*r1*r1 , acos(-1.0)*r2*r2 );
    angle1 = acos( (d*d+r1*r1-r2*r2) / (2*d*r1) );
    angle2 = acos( (d*d+r2*r2-r1*r1) / (2*d*r2) );
    h1 = angle1 * r1 * r1;
    h2 = angle2 * r2 * r2;
    s1 = r1 * r1 * cos(angle1) * sin(angle1);
    s2 = r2 * r2 * cos(angle2) * sin(angle2);
    return h1 + h2 - (s1+s2);
}

int main(){
    double x1,x2,r1,y1,y2,r2;
    while( ~scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2) ){
        printf("%.3lf\n",overlop_area(x1,y1,r1,x2,y2,r2));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值