POJ 2546 Circular Area 几何

时间:2022-11-27 23:43:48

http://poj.org/problem?id=2546

晚上发现鼠标快不行了了!!!鼠标你肿么了,肿么突然就按键不灵了,哭,谁送我一只呀,奖励我舍友一只。哈哈。开玩笑滴~

舍友大怒说“晚上要把英语做完才去睡觉!"

我也大怒说“晚上要把这题A出来才去睡觉!”

然后我做出来了,他还没,哈哈哈哈,哥哥可以洗洗睡啦~


----------------------------------------------准备洗洗睡的分割线----------------------------------------------

大意:

给定两个圆,求他们相交的面积。

纯数学题。。高中的数学题目,以前有做过。。。但我忘光了。哭瞎了。数学渣T T

本来还想用积分的 - -||

圆的位置关系有5种:相离,外切,相交,内切,内含。

相离和外切都为0,

内切和内涵(哈哈)都为小圆。

相交嘛就是两个扇形面积减去一个四边形的面积。

#include<cstdio>
#include<cmath>
const double pi=acos(-1.0);
int main()
{
	double x1,y1,r1,x2,y2,r2;
	scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2);
	double dis=sqrt((y2-y1)*(y2-y1) + (x2-x1)*(x2-x1));
	if(dis >= r2+r1)
		printf("0.000\n");
	else if( dis <= fabs(r2-r1))
		printf("%.3lf\n",r2>r1? pi*r1*r1: pi*r2*r2);
	else
	{
		double angle1=acos( (r1*r1 + dis*dis - r2*r2  ) / (2 * r1*dis));
		double angle2=acos( (dis*dis + r2*r2 - r1*r1) / ( 2 * r2 * dis ));
		double s=r1*dis*sin(angle1);
		double s1=angle1*r1*r1;
		double s2=angle2*r2*r2;
		printf("%.3lf\n",s1+s2-s);
	}
	return 0;
}