花园浇水面积

题目描述

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;
//求弦长,公式(a+b+c)(a+b-c)(a-b+c)(b-a+c)a,b为半径,c为两圆心的距离
		
		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("%.6lf\n", s);
	}
	return 0;
}

abs为整型的绝对值,fabs为浮点型的绝对值。

猜你喜欢

转载自blog.csdn.net/weixin_43726468/article/details/84668556