1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. const double eps = 1e-;
  9. const int N = ;
  10. int dcmp(double x)
  11. {
  12. if(abs(x) < eps) return ;
  13. if(x < ) return -;
  14. else return ;
  15. }
  16.  
  17. struct Point{
  18. double x,y;
  19. Point(double x = ,double y = ):x(x),y(y){}
  20. bool operator<(const Point &m)const{
  21. return dcmp(x - m.x) < || (dcmp(x - m.x) == && dcmp(y - m.y) < );
  22. }
  23.  
  24. bool operator==(const Point &m)const{
  25. return dcmp(x - m.x) == && dcmp(y - m.y) == ;
  26. }
  27. };
  28.  
  29. Point ch[N<<],p[N<<];
  30.  
  31. typedef Point Vector;
  32.  
  33. Vector operator+(Vector a , Vector b)
  34. {
  35. return Vector(a.x + b.x , a.y + b.y);
  36. }
  37.  
  38. Vector operator-(Point a , Point b)
  39. {
  40. return Vector(a.x - b.x , a.y - b.y);
  41. }
  42.  
  43. Vector operator*(Vector a , double b)
  44. {
  45. return Vector(a.x * b , a.y * b);
  46. }
  47.  
  48. Vector operator/(Vector a , double b)
  49. {
  50. return Vector(a.x / b , a.y/b);
  51. }
  52.  
  53. double Cross(Vector a , Vector b)
  54. {
  55. return a.x * b.y - a.y * b.x;
  56. }
  57.  
  58. Vector GetReverse(Vector a , double rad)
  59. {
  60. double x = a.x * cos(rad) - a.y * sin(rad);
  61. double y = a.x * sin(rad) + a.y * cos(rad);
  62. return Vector(x,y);
  63. }
  64. //计算多边形面积
  65. double ConvexPolygonArea(Point *p , int n)
  66. {
  67. double area = ;
  68. for(int i=;i<n-;i++){
  69. area += Cross(p[i] - p[] , p[i+] - p[]);
  70. }
  71. return area / ;
  72. }
  73. //求形成凸包的最大范围
  74. int ConvexHull(Point *p, int n, Point *ch) //凸包
  75. {
  76. sort(p, p+n);
  77. n = unique(p, p+n) - p; //去重
  78. int m = ;
  79. for(int i = ; i < n; i++)
  80. {
  81. while(m > && Cross(ch[m-]-ch[m-], p[i]-ch[m-]) <= ) m--;
  82. ch[m++] = p[i];
  83. }
  84. int k = m;
  85. for(int i = n-; i >= ; i--)
  86. {
  87. while(m > k && Cross(ch[m-]-ch[m-], p[i]-ch[m-]) <= ) m--;
  88. ch[m++] = p[i];
  89. }
  90. if(n > ) m--;
  91. return m;
  92. }
  93. int main()
  94. {
  95. // freopen("test.in","rb",stdin);
  96.  
  97. int T,n;
  98. double x,y,w,h,_angle; //_angle表示度数,自己还要转化成弧度
  99. scanf("%d",&T);
  100. while(T--){
  101. scanf("%d",&n);
  102. int k=;
  103. double area = ;
  104. for(int i=;i<n;i++)
  105. {
  106. scanf("%lf%lf%lf%lf%lf",&x,&y,&w,&h,&_angle);
  107. area += w*h;
  108. double rad = -_angle * acos(-) / ;
  109. Point o(x,y);
  110. //cout<<" rad: "<<rad<<endl;
  111. p[k++] = GetReverse(Vector(-w/ , h/),rad) + o;
  112. p[k++] = GetReverse(Vector(w/ , h/),rad) + o;
  113. p[k++] = GetReverse(Vector(w/ , -h/),rad) + o;
  114. p[k++] = GetReverse(Vector(-w/ , -h/),rad) + o;
  115. }
  116.  
  117. int m = ConvexHull(p , k , ch);
  118. double sumOfArea = ConvexPolygonArea(ch , m);
  119. double ans = area / sumOfArea * ;
  120.  
  121. printf("%.1f %%\n",ans);
  122. }
  123. return ;
  124. }

UVA 10652 凸包问题的更多相关文章

  1. 简单几何(向量旋转+凸包+多边形面积) UVA 10652 Board Wrapping

    题目传送门 题意:告诉若干个矩形的信息,问他们在凸多边形中所占的面积比例 分析:训练指南P272,矩形面积长*宽,只要计算出所有的点,用凸包后再求多边形面积.已知矩形的中心,向量在原点参考点再旋转,角 ...

  2. UVa 10652 (简单凸包) Board Wrapping

    题意: 有n块互不重叠的矩形木板,用尽量小的凸多边形将它们包起来,并输出并输出木板总面积占凸多边形面积的百分比. 分析: 几乎是凸包和多边形面积的裸题. 注意:最后输出的百分号前面有个空格,第一次交P ...

  3. UVA 10652 Board Wrapping(凸包)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32286 [思路] 凸包 根据角度与中心点求出长方形所有点来,然后就 ...

  4. Uva 10652 Board Wrapping(计算几何之凸包+点旋转)

    题目大意:给出平面上许多矩形的中心点和倾斜角度,计算这些矩形面积占这个矩形点形成的最大凸包的面积比. 算法:GRAHAM,ANDREW. 题目非常的简单,就是裸的凸包 + 点旋转.这题自己不会的地方就 ...

  5. UVA 10652 Board Wrapping(凸包)

    The small sawmill in Mission, British Columbia, hasdeveloped a brand new way of packaging boards for ...

  6. uva 10652 Board Wrapping (计算几何-凸包)

    Problem B Board Wrapping Input: standard input Output: standard output Time Limit: 2 seconds The sma ...

  7. UVA 10652 Board Wrapping(二维凸包)

    传送门 刘汝佳<算法竞赛入门经典>P272例题6包装木板 题意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们抱起来,并计算出木板占整个包装面积的百分比. 输入:t组数据,每组 ...

  8. UVa 10652(旋转、凸包、多边形面积)

    要点 凸包显然 长方形旋转较好的处理方式就是用中点的Vector加上旋转的Vector,然后每个点都扔到凸包里 多边形面积板子求凸包面积即可 #include <cstdio> #incl ...

  9. UVa 10256 凸包简单应用

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. 网盘资源搜索的一些知识 C#

    针对互联网盘上的资源进行搜索查找.写一个网盘资源搜索的要点主要有以下几点. 1.这个网盘资源搜索的原理就是利用互联网搜索引擎的site 命令. 其次就是针对网页链接进行提取以及处理. 首先就是编写一个 ...

  2. Android 重定向 init.rc中服务的输出

    在init.rc中运行的服务,由于系统启动的时候将标准输出重定向到了/dev/null, 所以服务中的打印信息都不可见. 但调试时可能需要看到其中的打印信息,因此就有了logwrapper这个工具:l ...

  3. Android与H5互调(通过实例来了解Hybrid App)

    前些日子,Android原生开发将被取缔的吵得火热,JavaScript是能做一个完全的APP,但只使用JavaScript做出来的APP也不会牛逼到哪里去.最好的是混合(Hybrid)开发,在需要的 ...

  4. Java:核心概念j积累(一)

    1.      抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过 ...

  5. 使用Jenkins进行android项目的自动构建(3)

    建立Jenkins项目 1. “新增作业”->填写作业名称->选择“建置 Maven 2 或 3 專案”->OK.新增成功后会进入“組態設定”,暂时先保留默认值,稍后再进行设定. 2 ...

  6. js模块化方案以及前端打包工具

    图片来自知乎

  7. PHP exif扩展方法开启详解(亲测)

    本节主要介绍了如何开启PHP exif扩展方法,主要在于对php.ini文件的修改 服务器配置说明: 1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号 2. ...

  8. vscode前端开发软件配搭好用的插件

    使用方法,可以在官网中搜索需要的插件或者在VsCode的“”扩展“”中搜索需要的插件添加方法使用Ctrl+P, 输入 ext install xxxx ,搜索要安装的插件,点击安装按钮即可(各取所需插 ...

  9. 免费公共DNS服务器IP地址大全(2017年6月24日)

    收集全球各个常用公共DNS服务器 IP地址,欢迎各位朋友评论补充! 国内常用公共DNS 114 DNS: (114.114.114.114:    114.114.115.115) 114DNS安全版 ...

  10. 阿里云ECS安装sqlserver,本地无法连接问题排查思路

    1. 阿里云控制台-对应的ECS实例的安全组是否添加了响应的端口(1433)可以访问: 2. 服务器-sqlserver服务是否开启: 3. 服务器-sqlserver配置器,对应的端口是否启用,已经 ...