提交地址:https://vjudge.net/problem/UVA-10652

题目:


pdf:https://uva.onlinejudge.org/external/106/10652.pdf

解题思路:


凸包模版题,求完凸包再求这个凸包(多边形)的面积。

有两个需要注意的小点:

(1)转角的范围: 且这个木板是以木板中心(x,y)为旋转中心旋转的,若要求出旋转后的四个点坐标,坐标中心应该是(x,y),不能先求出平放时的四点坐标再旋转,因为那样旋转中心是(x,y)对应的(0,0)。

(2)Rotate(Vecotr p, double rad)中的参数rad是逆时针旋转时的弧度数,要将输入的度数转化一下。

ac代码:


#include <bits/stdc++.h>
using namespace std;
const int maxn = 4*610;
const double pi = acos(-1.0);
const double eps = 1e-10;
struct Point
{double x,y;Point(double x=0,double y=0):x(x),y(y){}friend bool operator < (Point a, Point b){return a.x == b.x ? a.y < b.y : a.x < b.x;}
};
typedef Point Vector;Vector operator - (Vector a, Vector b)//向量减法
{return Vector(a.x - b.x, a.y - b.y);
}
Vector operator + (Vector a, Vector b)//向量加法
{return Vector(a.x + b.x, a.y + b.y);
}int dcmp(double x)//精度三态函数(>0,<0,=0)
{if (fabs(x) < eps)return 0; //等于else return x < 0 ? -1 : 1;//小于,大于
}
double Cross(Vector a, Vector b)//外积
{return a.x * b.y - a.y * b.x;
}
Vector Rotate(Vector a, double rad)//逆时针旋转rad弧度
{return Vector(a.x*cos(rad) - a.y*sin(rad), a.x*sin(rad) + a.y*cos(rad));
}int ConvexHull(Point *p, int n, Point* ch)//凸包
{sort(p, p+n);//先x后yint m = 0;//ch存最终的凸包顶点,下标从0开始for(int i = 0; i < n; i++){//m是待确定的while(m > 1 && dcmp(Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])) <= 0) m--;ch[m++] = p[i];}int k = m;for(int i = n-2; i >= 0; i--){while(m > k && dcmp(Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])) <= 0) m--;//同样的方向ch[m++] = p[i];}if(n>1) m--;//m是凸包上的点数+1,相当于n,ch[m]和ch[0]相同,遍历的时候<m即可return m;
}
double PolygonArea(Point* p, int n)//多边形面积
{double area = 0;for(int i = 1; i < n - 1; i++)//下标从0开始存坐标,共n个点area += Cross(p[i] - p[0], p[i + 1] - p[0]);return area/2.0;
}int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);int t, n;double x, y, w, h, ang;Point allp[maxn], ch[maxn];//p存所有点scanf("%d", &t);while(t--){double barea = 0;int cnt = 0;scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%lf %lf %lf %lf %lf", &x, &y, &w, &h, &ang);double hw = w/2.0, hh = h/2.0;if(ang >= 0) ang = 2*pi-(pi*ang)/180.0;else ang = -pi*ang/180.0;//本身就是逆时针的度数Point c = Point(x, y);//绕着中心旋转,中心c不动,而不是水平时的四个坐标旋转(此时的旋转中心是(0,0),中心的坐标也会变)allp[cnt++] = c + Rotate(Point(-hw, -hh), ang);allp[cnt++] = c + Rotate(Point(hw, -hh), ang);allp[cnt++] = c + Rotate(Point(-hw, hh), ang);allp[cnt++] = c + Rotate(Point(hw, hh), ang);barea += w*h;}int m = ConvexHull(allp, cnt, ch);double tarea = PolygonArea(ch, m);printf("%.1lf %%\n", barea*100/tarea);}return 0;
}

【UVA10652】Board Wrapping(凸包+坐标旋转+多边形面积)相关推荐

  1. matlab 二维凸包面积,PKU——3348——(凸包和计算多边形面积)

    //3348 Accepted 264K 0MS C++ 4016B//典型的凸包和计算多边形面积#include#include#include#include#include#includeusi ...

  2. 给定点坐标求多边形面积模板

    给定点坐标求多边形面积模板 方法:利用向量叉积求三角形面积的方法,把多边形分割成若干个三角形,然后求和得到多边形面积,计算时需要注意,给定的点的顺序必须是逆时针或者顺时针. 逆时针的方向是叉积的正方向 ...

  3. c语言给坐标求多边形面积,多边形的面积问题

    多边形的面积问题 设构成多边形的坐标串为(xi,yi)(i=1,2,--,n),求此多边形面积A. #include #define N 10 float Area(float (*x)[2],int ...

  4. UVA10652 Board Wrapping(求凸包、计算凸多边形面积)

    整理的算法模板合集: ACM模板 有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们包起来,并计算出木板占整个包装面 积的百分比 [输入格式] 输入第一行为数据组数T(T≤50).每组数据第一 ...

  5. 已知多边形各顶点坐标如何计算多边形面积

    多边形的面积可通过分割成很多个三角形面积之和来求得! 通过多边形各顶点坐标可以求得各边长,再采用海伦公式,计算分割后的小三角形的面积. 海伦公式如下: 假设在平面内,有一个三角形,边长分别为a.b.c ...

  6. python输入坐标求面积_利用python中的坐标计算多边形面积

    您没有正确实现Shoelace formula.我修改了一点你的代码来修复它:sum1=0.0 sum2=0.0 b=input("Number of corners: ") ma ...

  7. 用“平面两点距离”求三角形面积及多边形面积

    不小于 3 边的多边形,都可以任一顶点发出的边切分为 n - 2 个三角形. [学习的细节是欢悦的历程] Python 官网:https://www.python.org/ Free:大咖免费&quo ...

  8. python计算多边形面积_Python求凸包及多边形面积教程

    一般有两种算法来计算平面上给定n个点的凸包:Graham扫描法(Graham's scan),时间复杂度为O(nlgn):Jarvis步进法(Jarvis march),时间复杂度为O(nh),其中h ...

  9. 识别图片文本坐标;透视变换;输入点集坐标,输出凸包(最大多边形)顶点坐标

    '''识别图片文本坐标 ''' import cv2 import pytesseract from pytesseract import Output from PIL import Image f ...

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

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

最新文章

  1. SEO站内优化细节不可少,教你4个小技巧!
  2. 区块链培训资料(特别是以太坊)
  3. dump、load和dumps、loads的联系与区别
  4. oracle12537错误,ORA-12537:TNS:connection closed错误处理方法
  5. 有关ACM学习的博客链接
  6. 集成海康威视Sadp SDK实现获取设备参数配置
  7. FPGA笔记(八)-驱动12864
  8. C++实现FPS游戏辅助教程
  9. redhat红帽官方软件仓库同步方案
  10. 人工智能守护青山绿水 内蒙古环保厅引入阿里云ET环境大脑
  11. 基于netty+websocket实现门户游客实时统计功能
  12. js简单分页,只有上一页和下一页
  13. C/C++ 使用信号量控制线程运行顺序
  14. python入门ppt下载_Python3入门ppt
  15. easyexcel实现导出
  16. 2018第二十二届软博会将于6月在京拉开帷幕
  17. rua出300道四则运算题
  18. k-nearest neighbor,k近邻法
  19. JavaScript中for循环练习题
  20. 小游戏 虚拟支付 米大师 90009

热门文章

  1. kafka 2.10 java api_kafka中常用API的简单JAVA代码
  2. Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
  3. css如何设置div中的内容垂直居中?
  4. SYNPROXY:廉价的抗 DoS 攻击方案
  5. mvc:annotation-driven /注解意义
  6. iSCSI远程块存储配置实验
  7. 第十三讲:软考中高项13_战略管理、业务流程管理、知识管理
  8. pg_stat wait timeout
  9. 利用HttpOnly来防御xss攻击
  10. 基于Berkeley DB实现的持久化队列