描述
前段时间,不知道为啥“爱的魔力转圈圈”这句歌词HOT起来了。现在xxx与yyy一人转了一个圈圈,已知xxx与yyy两个人转的圈圈的圆心位置和半径,小赖赖想知道这两个圈圈重合部分的面积,小赖赖有点懒,所以把这个问题交给热爱编程的你来解决~
输入
输入共两行,每行有三个数x,y,r,其中(x,y)代表圈圈的圆心位置,r代表圈圈的半径。
输出
输出一个数,表示两个圈圈的重合面积。
(所得结果 小数点后 保留三位)
输入样例 1
0 0 2
2 0 5
输出样例 1
12.566
程序代码
#include <bits/stdc++.h>
#define pi 3.14159265358979
using namespace std;
int main()
{
double x1,y1,r1,x2,y2,r2;
cin>>x1>>y1>>r1>>x2>>y2>>r2;
double d,s,h,a1,a2;
if(r1>r2)
{
h=r1;
r1=r2;
r2=h;
}
d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
if(d>=r1+r2)
{
printf("0.000\n");
}
if(r2-r1>=d)
{
s=pi*r1*r1;
printf("%.3f\n",s);
}
else
{
a1=acos((r1*r1+d*d-r2*r2)/(2*r1*d));
a2=acos((r2*r2+d*d-r1*r1)/(2*r2*d));
s=a1*r1*r1+a2*r2*r2-r1*d*sin(a1);
printf("%.3f\n",s);
}
return 0;
}
扩展资料
转自:http://blog.csdn.net/heshan1992/article/details/77686080
假设半径小的圆为c1,半径大的圆为c2。
c1的半径r1,圆心坐标(x1,y1)。c2的半径r2,圆心坐标(x2,y2)。
d为两圆圆心连线的长度。
相交面积为S
d=sqrt((x1-x2)^2 + (y1-y2)^2)
(1)如果r1+r2<=d
那么两圆相离,相交面积S=0
(2)如果r2-r1>=d
那么半径小的圆内含半径大的圆,那么相交面积为小圆的面积S=pir1r1
(3)既非(1)也非(2)
在图上画两个相交圆,结合图像看。
那么两圆相交,连接小圆的圆心与两个圆的交点,连接大圆的圆心和两个圆的交点。
可以发现形成的图形被两个圆心的连线平分成2个全等三角形。
由小圆圆心和交点所连两条线(长度为半径)以及在大圆之内的弧所形成的扇形为S1
由大圆圆心和交点所连两条线(长度为半径)以及在小圆之内的弧所形成的扇形为S2
由小圆圆心和交点所连两条线以及由大圆圆心和交点所连两条线所形成的四边形的面积为S3
可见相交面积S=S1+S2-S3
要求出扇形的面积,要知道扇形的圆心角。
小圆包含的扇形的圆心角为2*a1(考虑一个三角形)
a1=acos((r1^2 + d^2 - r2^2)/(2.0 * r1 * d)) 余弦定理
a2=acos((r2^2 + d^2 - r1^2)/(2.0 * r2 * d))
S1=pi * r1 * r1 * 2 * a1 / (2 * pi)=a1 * r1 * r1
同理
S2=a2 * r2 * r2
S3为一个三角形面积的2倍
S3=2 * r1 * d * sin(a1) / 2=r1 * d * sin(a1)
则S=a1 * r1 * r1+a2 * r2 * r2-r1 * d * sin(a1)