POJ 2546 Circular Area(两个圆相交面积)

POJ 2546 Circular Area(两个圆相交面积)

ACM

题目地址:POJ 2546 Circular Area

题意: 
两个圆相交面积。

分析: 
注意内含与相离的情况。 
G++下只有把PI设为3.141592653才能过TAT...以后几何题是不是都要用C++交了...

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define repf(i,a,b) for(int i=(a);i<=(b);i++)

typedef long long ll;
const double PI = 3.141592653;

struct Round {
	double x, y;
	double r;
} r[2];

double dis(Round a, Round b) {
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

double solve(Round a, Round b) {
	double d = dis(a, b);
	if (d >= a.r + b.r)
		return 0;
	if (d <= fabs(a.r - b.r)) {
		double r = a.r < b.r ? a.r : b.r;
		return PI * r * r;
	}
	double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2. / a.r / d);
	double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2. / b.r / d);
	double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1);
	return ret;
}

int main() {
	while (~scanf("%lf%lf%lf%lf%lf%lf", &r[0].x, &r[0].y, &r[0].r, &r[1].x, &r[1].y, &r[1].r)) {
		printf("%.3f\n", solve(r[0], r[1]));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值