小于哥的鱼干


私信TA

用户名:yuhui1207

访问量:16865

签 名:

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

等  级
排  名 405
经  验 4874
参赛次数 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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区