游客 Signup | Login
中文 | En

1737 - 班级聚会上的游戏

前不久小明所在的班级为了庆祝在运动会上夺得第一名,开了一场班级聚会。在聚会上大家玩了这样一个游戏:
在地上放一个圆形硬纸片,然后参加游戏的人手里拿一个尺寸随机的圆形硬纸片,向地上的硬纸片扔过去,如果两个圆形硬纸片有相交的部分,则可以获得一次抽奖的机会。
现在,告诉你两个圆形硬纸片的圆心坐标和半径长度,请你计算它们相交的面积。

Input

输入包含多组测试数据。
每组输入为一行,输入6个实数x1,y1,r1,x2,y2,r2(-1000<=x1,y1,x2,y2<=1000,0<r1,r2<=1000),表示两个圆形硬纸片的圆心坐标和半径长度。

Output

对于每组输入,输出两个圆形硬纸片的相交面积,结果保留3位小数。

Examples

Input

20.0 30.0 15.0 40.0 30.0 30.0

Output

608.366

Solution C

#include<stdio.h>
#include<math.h>
#define PI acos(-1.0)
int main()
{
    double x1,y1,r1,x2,y2,r2,a1,a2,dis,area;
    while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2)!=EOF)
    {
        dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));//两圆心之间的距离
        if(r1+r2<=dis) //相离或相切
        {
            printf("0.000\n");
            continue;
        }
        if(fabs(r1-r2)>=dis)  //包含
        {
            printf("%.3lf\n",PI*(r1>r2?r2:r1)*(r1>r2?r2:r1));
            continue;
        }
        //相交的情况
        a1=(r1*r1+dis*dis-r2*r2)/(2*r1*dis);//余弦定理
        a2=(r2*r2+dis*dis-r1*r1)/(2*r2*dis);
        a1=2*acos(a1);
        a2=2*acos(a2);
        area=r1*r1*(a1-sin(a1))/2+ r2*r2 * (a2 - sin(a2))/2;
        printf("%.3lf\n",area);
    }
    return 0;
}

Solution C++

#include <stdio.h>
#include <math.h>

const double eps = 1e-8;
const double pi = acos(-1);

double x[2], y[2], r[2];

double dis(double x1, double y1, double x2, double y2) {
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

double fusiform(double a, double c, double b) {
	double angle = acos((a * a + b * b - c * c) / (2 * a * b)) * 2;
	double s1 = a * a * pi * (angle / (2 * pi));
	double s2 = a * a * sin(angle) / 2;
	return s1 - s2;
}

double common(double x1, double y1, double r1, double x2, double y2, double r2) {
	double d = dis(x1, y1, x2, y2);
	if (d + eps >= r1 + r2)
		return 0;
	if (d - eps <= fabs(r1 - r2)) {
		if (r1 > r2)
			return pi * r2 * r2;
		else
			return pi * r1 * r1;
	}
	return fusiform(r1, r2, d) + fusiform(r2, r1, d);
}

int main() {
	while (scanf("%lf%lf%lf%lf%lf%lf", &x[0], &y[0], &r[0], &x[1], &y[1], &r[1]) != EOF)
		printf("%.3lf\n", common(x[0], y[0], r[0], x[1], y[1], r[1]));
	return 0;
}
Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题