首页 > 其他 > 详细

HDU5120-Intersection-两个圆环相交面积

时间:2020-04-17 23:15:29      阅读:83      评论:0      收藏:0      [点我收藏+]

 

 

终究还是我太蠢了!!!!


原来这是两个同心圆的相交部分,(最中间是空的)我画的1和2部分加起来就是了。

无法理解字面意思。害

技术分享图片

 

 

题意:计算两个一样的圆环相交的面积,给出r1小的圆的半径,r2是大的圆的半径,接下去给出两行x、y,代表两个圆环的圆心。

 

思路:

两个大的圆的相交部分-左边大圆和右边小圆的相交部分-左边小圆和右边大圆的相交部分+左右小圆的相交部分。

 

AC代码:

技术分享图片
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<string.h>
 6 
 7 using namespace std;
 8 typedef long long ll;
 9 #define inf 0x3f3f3f3f
10 #define PI acos(-1.0)//不是-1
11 #define eps 1e-9
12 
13 struct node
14 {
15     int x,y;
16 }a,b;
17 
18 double s(double r1,double r2)
19 {
20     double d=sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y)*1.0);
21     if(r1+r2<d+eps)
22         return 0;//相离
23     if(d<fabs(r1-r2)+eps)
24     {
25         double minn=min(r1,r2);
26         return PI*minn*minn;
27     }
28     double t=(d*d+r1*r1-r2*r2)/(2*d);
29     double x=acos(t/r1),y=acos((d-t)/r2);
30     return r1*r1*x+r2*r2*y-d*r1*sin(x);
31 }
32 
33 int main()
34 {
35     int T,cas=1;
36     scanf("%d",&T);
37     while(T--)
38     {
39         double r1,r2;
40         scanf("%lf %lf",&r1,&r2);
41         scanf("%d %d %d %d",&a.x,&a.y,&b.x,&b.y);
42         double ans=s(r2,r2)-s(r1,r2)-s(r2,r1)+s(r1,r1);
43         printf("Case #%d: %.6lf\n",cas++,ans);
44     }
45     return 0;
46 }
View Code

 

HDU5120-Intersection-两个圆环相交面积

原文:https://www.cnblogs.com/OFSHK/p/12722788.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!