Circular Area
来源:Circular Area
题意:
给出两个圆的位置和半径,求两圆相交面积
思路:
分三种情况
- 两圆相离或外切时,答案为0(d >= r1 + r2)
- 两圆属于包含关系或内切时,答案为小圆面积(d <= abs(r1 - r2))
- 其余情况为相交
其中第三种情况画个图就很好看出来了
在这个图中很好的看出来,答案就是蓝色扇形面积 + 绿色扇形面积 - 粉色四边形的面积
之后可以去画一画其他的相交情况,比如d < min(r1, r2), min(r1, r2) < d < max(r1, r2),最后会发现都是一样的(别问我为什么画了这么多情况)
接下来说怎么求面积
-
四边形面积 = 两个 三角形面积,三边为r1, r2, d(海伦公式)
-
扇形面积 = θ * r * r / 2(θ 为弧度角),所以在三角形中通过余弦定理和arccos就能求出弧度角了(arccos调用acos函数)
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
typedef long long ll;
using namespace std;
#define pi acos(-1.0)
int main(void)
{
double x1, y1, a, x2, y2, b;
while (cin >> x1 >> y1 >> a >> x2 >> y2 >> b) {
if (a < b) swap(a, b);
double x = fabs(x1 - x2), y = fabs(y1 - y2);
double l = sqrt(x * x + y * y);
if (l >= a + b) printf("0.000\n");
else if (l <= a - b) printf("%.3f\n", pi * b * b);
else {
double ra = acos((a * a + l * l - b * b) / (2 * a * l));
double rb = acos((b * b + l * l - a * a) / (2 * b * l));
double s = (a + b + l) / 2;
s = sqrt(s * (s - a) * (s - b) * (s - l));
double ans = a * a * ra + b * b * rb - 2 * s;
printf("%.3f\n", ans);
}
}
return 0;
}