area

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 686    Accepted Submission(s): 265

Problem Description
小白最近被空军特招为飞行员,参与一项实战演习。演习的内容是轰炸某个岛屿。。。
作为一名优秀的飞行员,任务是必须要完成的,当然,凭借小白出色的操作,顺利地将炸弹投到了岛上某个位置,可是长官更关心的是,小白投掷的炸弹到底摧毁了岛上多大的区域?
岛是一个不规则的多边形,而炸弹的爆炸半径为R。
小白只知道自己在(x,y,h)的空间坐标处以(x1,y1,0)的速度水平飞行时投下的炸弹,请你计算出小白所摧毁的岛屿的面积有多大. 重力加速度G = 10.
 
Input
首先输入三个数代表小白投弹的坐标(x,y,h);
然后输入两个数代表飞机当前的速度(x1, y1);
接着输入炸弹的爆炸半径R;
再输入一个数n,代表岛屿由n个点组成;
最后输入n行,每行输入一个(x',y')坐标,代表岛屿的顶点(按顺势针或者逆时针给出)。(3<= n < 100000)
 
Output
输出一个两位小数,表示实际轰炸到的岛屿的面积。
 
Sample Input
0 0 2000
100 0
100

4
1900 100
2000 100
2000 -100
1900 -100

 
Sample Output
15707.96
  1. #include"cstdio"
  2. #include"cstring"
  3. #include"cstdlib"
  4. #include"cmath"
  5. #include"string"
  6. #include"map"
  7. #include"cstring"
  8. #include"algorithm"
  9. #include"iostream"
  10. #include"set"
  11. #include"queue"
  12. #include"stack"
  13. #define inf 1000000000000
  14. #define M 100009
  15. #define LL long long
  16. #define eps 1e-12
  17. #define mod 1000000007
  18. #define PI acos(-1.0)
  19. using namespace std;
  20. struct node
  21. {
  22. double x,y;
  23. node(){}
  24. node(double xx,double yy)
  25. {
  26. x=xx;
  27. y=yy;
  28. }
  29. node operator -(node s)
  30. {
  31. return node(x-s.x,y-s.y);
  32. }
  33. node operator +(node s)
  34. {
  35. return node(x+s.x,y+s.y);
  36. }
  37. double operator *(node s)
  38. {
  39. return x*s.x+y*s.y;
  40. }
  41. double operator ^(node s)
  42. {
  43. return x*s.y-y*s.x;
  44. }
  45. }p[M];
  46. double max(double a,double b)
  47. {
  48. return a>b?a:b;
  49. }
  50. double min(double a,double b)
  51. {
  52. return a<b?a:b;
  53. }
  54. double len(node a)
  55. {
  56. return sqrt(a*a);
  57. }
  58. double dis(node a,node b)//两点之间的距离
  59. {
  60. return len(b-a);
  61. }
  62. double cross(node a,node b,node c)//叉乘
  63. {
  64. return (b-a)^(c-a);
  65. }
  66. double dot(node a,node b,node c)//点成
  67. {
  68. return (b-a)*(c-a);
  69. }
  70. int judge(node a,node b,node c)//判断c是否在ab线段上(前提是c在直线ab上)
  71. {
  72. if(c.x>=min(a.x,b.x)
  73. &&c.x<=max(a.x,b.x)
  74. &&c.y>=min(a.y,b.y)
  75. &&c.y<=max(a.y,b.y))
  76. return 1;
  77. return 0;
  78. }
  79. double area(node b,node c,double r)
  80. {
  81. node a(0.0,0.0);
  82. if(dis(b,c)<eps)
  83. return 0.0;
  84. double h=fabs(cross(a,b,c))/dis(b,c);
  85. if(dis(a,b)>r-eps&&dis(a,c)>r-eps)//两个端点都在圆的外面则分为两种情况
  86. {
  87. double angle=acos(dot(a,b,c)/dis(a,b)/dis(a,c));
  88. if(h>r-eps)
  89. {
  90. return 0.5*r*r*angle;
  91. }
  92. else if(dot(b,a,c)>0&&dot(c,a,b)>0)
  93. {
  94. double angle1=2*acos(h/r);
  95. return 0.5*r*r*fabs(angle-angle1)+0.5*r*r*sin(angle1);
  96. }
  97. else
  98. {
  99. return 0.5*r*r*angle;
  100. }
  101. }
  102. else if(dis(a,b)<r+eps&&dis(a,c)<r+eps)//两个端点都在圆内的情况
  103. {
  104. return 0.5*fabs(cross(a,b,c));
  105. }
  106. else//一个端点在圆上一个端点在圆内的情况
  107. {
  108. if(dis(a,b)>dis(a,c))//默认b在圆内
  109. {
  110. swap(b,c);
  111. }
  112. if(fabs(dis(a,b))<eps)//ab距离为0直接返回0
  113. {
  114. return 0.0;
  115. }
  116. if(dot(b,a,c)<eps)
  117. {
  118. double angle1=acos(h/dis(a,b));
  119. double angle2=acos(h/r)-angle1;
  120. double angle3=acos(h/dis(a,c))-acos(h/r);
  121. return 0.5*dis(a,b)*r*sin(angle2)+0.5*r*r*angle3;
  122.  
  123. }
  124. else
  125. {
  126. double angle1=acos(h/dis(a,b));
  127. double angle2=acos(h/r);
  128. double angle3=acos(h/dis(a,c))-angle2;
  129. return 0.5*r*dis(a,b)*sin(angle1+angle2)+0.5*r*r*angle3;
  130. }
  131. }
  132. }
  133. int main()
  134. {
  135. double x,y,h,x1,y1,R;
  136. while(scanf("%lf%lf%lf",&x,&y,&h)!=-1)
  137. {
  138. scanf("%lf%lf%lf",&x1,&y1,&R);
  139. int n;
  140. scanf("%d",&n);
  141. for(int i=0;i<n;i++)
  142. {
  143. scanf("%lf%lf",&p[i].x,&p[i].y);
  144. }
  145. p[n]=p[0];
  146. double V=sqrt(2*10*h);
  147. double t0=V/10;
  148. double x0=x+x1*t0;
  149. double y0=y+y1*t0;
  150. node O(x0,y0);
  151. for(int i=0;i<=n;i++)
  152. p[i]=p[i]-O;
  153. O=node(0,0);
  154. double sum=0;
  155. for(int i=0;i<n;i++)
  156. {
  157. int j=i+1;
  158. double s=area(p[i],p[j],R);
  159. if(cross(O,p[i],p[j])>0)
  160. sum+=s;
  161. else
  162. sum-=s;
  163. }
  164. printf("%.2lf\n",fabs(sum));
  165. }
  166. return 0;
  167. }

  

多边形和圆的相交面积(模板)hdu2892、hdu4404的更多相关文章

  1. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板

    链接:https://www.nowcoder.com/acm/contest/141/J来源:牛客网 Eddy has graduated from college. Currently, he i ...

  2. HDU 5130 Signal Interference --计算几何,多边形与圆的交面积

    题意: 求所有满足PB <= k*PA 的P所在区域与多边形的交面积. 解法: 2014广州赛区的银牌题,当时竟然没发现是圆,然后就没做出来,然后就gg了. 圆的一般式方程: 设A(x1,y1) ...

  3. codeforce gym/100495/problem/K—Wolf and sheep 两圆求相交面积 与 gym/100495/problem/E—Simple sequence思路简述

    之前几乎没写过什么这种几何的计算题.在众多大佬的博客下终于记起来了当时的公式.嘚赶快补计算几何和概率论的坑了... 这题的要求,在对两圆相交的板子略做修改后,很容易实现.这里直接给出代码.重点的部分有 ...

  4. hdu5858 Hard problem(求两圆相交面积)

    题目传送门 Hard problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  5. hdu 3264(枚举+二分+圆的公共面积)

    Open-air shopping malls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  6. I - Intersection HDU - 5120(圆环相交面积)

    Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...

  7. 牛客网暑期ACM多校训练营(第三场)J 多边形与圆相交的面积

    链接:https://www.nowcoder.com/acm/contest/141/J 题目描述 Eddy has graduated from college. Currently, he is ...

  8. poj3675 求多边形与圆的面积交

    题意:给出多边形的顶点坐标.圆的圆心坐标和半径,求面积交 sol:又是模板题啦= = 注意poj的C++好像认不出hypot函数,要稍微改写一下. hypot(double x,double y):即 ...

  9. hdu3060Area2(任意多边形相交面积)

    链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...

随机推荐

  1. n0_n1

    #include<stdio.h>int a[10];void quanpailie(int i){ if(i==10)  {for(i=0;i<10;i++)  {   print ...

  2. Python创建list和按照索引访问list

    Python创建list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素.比如,列出班里所有同学的名字,就可以用一个list表示:>> ...

  3. Difference Search Path

    1.Framework Search Path           where to search frameworks (.framework bundles) in addition to sys ...

  4. docker-compose bug

    annot mount volume over existing file, file exists /var/lib/docker/aufs/mnt/0ac71fed1af802a4ecf4a93b ...

  5. CDH商业版本的搭建(hadoop+hive+sqoop)

    一:准备工作 1.步骤 1)hadoop ->下载解压 ->修改配置文件 ->hadoop-env JAVA_HOME ->core-site fs.defaultFS had ...

  6. Qt 自定义 滚动条 样式(模仿QQ)

    今天是时候把软件中的进度条给美化美化了,最初的想法就是仿照QQ. 先前的进度条是这样,默认的总是很难受欢迎的:美化之后的是这样,怎么样?稍微好看一点点了吧,最后告诉你实现这个简单的效果在Qt只需要加几 ...

  7. SQL backup&restore

    --完整备份Backup Database NorthwindCSTo disk='G:\Backup\NorthwindCS_Full_20070908.bak' --差异备份Backup Data ...

  8. PHP---关联模型

    MANY_TO_MANY

  9. ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接

    原文:ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接 安装ArcSDE for SQL Server,最后一步成功后的界面如下: 在ArcMap中创建ArcSDE ...

  10. c# 过滤字符串中的重复字符

    有字符串"a,s,d,v,a,v",如果想去除其中重复的字符,怎么做? 下面是一个方法,用Hashtable来记录唯一字符,排除重复字符,仅供参考. 1.过滤方法: public ...