题目描述
Alice有一个无穷大的花园,上面种满了五颜六色的花,非常漂亮。为了浇灌这些花,Alice在花园中修建了两个浇水喷头,每个喷头可以给以它中心的一定距离内的花浇水。现在请你告诉Alice,她修建的两个喷头可以给多大面积的花园浇水。
多组数据输入,现需要你输入下面有关数据:
x1:第一个喷头的横坐标(-100 <= x1 <= 100);
y1:第一个喷头的纵坐标(-100 <= y1 <= 100);
r1:第一个喷头的浇灌半径(-100 <= r1 <= 100);
x2:第二个喷头的横坐标(-100 <= x2 <= 100);
y2:第二个喷头的纵坐标(-100 <= y2 <= 100);
r2:第二个喷头的浇灌半径(-100 <= r2 <= 100);
输出喷头喷水的最大覆盖面积,结果保留小数点后6位。
输入
0 0 1 1 1 1
输出
5.712389
样例输入
-27 -42 8 30 -28 50
样例输出
8055.043564
提示
计算几何问题,注意精度
来源/分类
绿色计算
#include<stdio.h>
#include<math.h>
const double P = acos(-1.0);
int main()
{
double x1, y1, r1, x2, y2, r2;
while (scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &r1, &x2, &y2, &r2) != EOF)
{
double s11,s12,s2,s0,s, d,o1,o2,q,h1,h2;
q = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
d = sqrt((r1 + r2 + q)*(r1 + r2 - q)*(r1 - r2 + q)*(r2 - r1 + q)) / q;
o1 = 2*asin(d / (2 * r1));
o1 = 180.0 * o1 / P;
s11 = o1 /360 * P*r1*r1;
o2 = 2*asin(d / (2 * r2));
o2 = 180.0 * o2 / P;
s12 = o2 /360 * P*r2*r2;
s2 = 1 / 2.0*d*q;
s0 = s11 + s12 - s2;
if (q >= (r1 + r2))
{
s = P * r1*r1 + P * r2*r2;
}
else
{
s = P * r1*r1 + P * r2*r2 - s0;
}
printf("%.6lfn", s);
}
return 0;
}
abs为整型的绝对值,fabs为浮点型的绝对值。