小于哥的鱼干


私信TA

用户名:yuhui1207

访问量:18180

签 名:

在人间已是巅,何苦要上青天

等  级
排  名 414
经  验 5013
参赛次数 2
文章发表 32
年  龄 24
在职情况 在职
学  校 常熟理工
专  业

  自我简介:

解题思路:
            

假设半径小的圆为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=pi*r1*r1

(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)


注意事项:

参考代码:

#include<stdio.h>
#include<math.h>
#define PI acos(-1.0)  //acos()是反余弦函数,cosπ = -1,所以π = acos(-1)。
int main()
{
	int n;
    float x1,y1,x2,y2,r1,r2;
	float a1,a2,s1,s2;
    double d,s;
	scanf("%d", &n);
	while(n--)
    {
        scanf("%f%f%f%f%f%f",&x1,&y1,&x2,&y2,&r1,&r2);
		d=sqrt(fabs(x1-x2)*fabs(x1-x2)+fabs(y1-y2)*fabs(y1-y2));
		if(d>=r1+r2)
				s=0;
		else if(d<=fabs(r1-r2))
			s=r1<r2? PI * r1 * r1 : PI * r2 * r2;
		else
		{
			a1=2 * acos((r1 * r1 + d * d - r2 * r2) / (2 * r1 * d));
			a2=2 * acos((r2 * r2 + d * d - r1 * r1) / (2 * r2 * d));
			s1=a1 / 2 * r1 * r1 + a2 / 2 * r2 * r2;
			s2=r1 * r1 * sin(a1) / 2 + r2 * r2 * sin(a2) / 2;
			s=s1-s2;
		}
		printf("%.3f\n",s);
    }
	
   
    return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »