【UVA10652】Board Wrapping(凸包+坐标旋转+多边形面积)
提交地址: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(凸包+坐标旋转+多边形面积)相关推荐
- matlab 二维凸包面积,PKU——3348——(凸包和计算多边形面积)
//3348 Accepted 264K 0MS C++ 4016B//典型的凸包和计算多边形面积#include#include#include#include#include#includeusi ...
- 给定点坐标求多边形面积模板
给定点坐标求多边形面积模板 方法:利用向量叉积求三角形面积的方法,把多边形分割成若干个三角形,然后求和得到多边形面积,计算时需要注意,给定的点的顺序必须是逆时针或者顺时针. 逆时针的方向是叉积的正方向 ...
- c语言给坐标求多边形面积,多边形的面积问题
多边形的面积问题 设构成多边形的坐标串为(xi,yi)(i=1,2,--,n),求此多边形面积A. #include #define N 10 float Area(float (*x)[2],int ...
- UVA10652 Board Wrapping(求凸包、计算凸多边形面积)
整理的算法模板合集: ACM模板 有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们包起来,并计算出木板占整个包装面 积的百分比 [输入格式] 输入第一行为数据组数T(T≤50).每组数据第一 ...
- 已知多边形各顶点坐标如何计算多边形面积
多边形的面积可通过分割成很多个三角形面积之和来求得! 通过多边形各顶点坐标可以求得各边长,再采用海伦公式,计算分割后的小三角形的面积. 海伦公式如下: 假设在平面内,有一个三角形,边长分别为a.b.c ...
- python输入坐标求面积_利用python中的坐标计算多边形面积
您没有正确实现Shoelace formula.我修改了一点你的代码来修复它:sum1=0.0 sum2=0.0 b=input("Number of corners: ") ma ...
- 用“平面两点距离”求三角形面积及多边形面积
不小于 3 边的多边形,都可以任一顶点发出的边切分为 n - 2 个三角形. [学习的细节是欢悦的历程] Python 官网:https://www.python.org/ Free:大咖免费&quo ...
- python计算多边形面积_Python求凸包及多边形面积教程
一般有两种算法来计算平面上给定n个点的凸包:Graham扫描法(Graham's scan),时间复杂度为O(nlgn):Jarvis步进法(Jarvis march),时间复杂度为O(nh),其中h ...
- 识别图片文本坐标;透视变换;输入点集坐标,输出凸包(最大多边形)顶点坐标
'''识别图片文本坐标 ''' import cv2 import pytesseract from pytesseract import Output from PIL import Image f ...
- UVa 10652 (简单凸包) Board Wrapping
题意: 有n块互不重叠的矩形木板,用尽量小的凸多边形将它们包起来,并输出并输出木板总面积占凸多边形面积的百分比. 分析: 几乎是凸包和多边形面积的裸题. 注意:最后输出的百分号前面有个空格,第一次交P ...
最新文章
- SEO站内优化细节不可少,教你4个小技巧!
- 区块链培训资料(特别是以太坊)
- dump、load和dumps、loads的联系与区别
- oracle12537错误,ORA-12537:TNS:connection closed错误处理方法
- 有关ACM学习的博客链接
- 集成海康威视Sadp SDK实现获取设备参数配置
- FPGA笔记(八)-驱动12864
- C++实现FPS游戏辅助教程
- redhat红帽官方软件仓库同步方案
- 人工智能守护青山绿水 内蒙古环保厅引入阿里云ET环境大脑
- 基于netty+websocket实现门户游客实时统计功能
- js简单分页,只有上一页和下一页
- C/C++ 使用信号量控制线程运行顺序
- python入门ppt下载_Python3入门ppt
- easyexcel实现导出
- 2018第二十二届软博会将于6月在京拉开帷幕
- rua出300道四则运算题
- k-nearest neighbor,k近邻法
- JavaScript中for循环练习题
- 小游戏 虚拟支付 米大师 90009
热门文章
- kafka 2.10 java api_kafka中常用API的简单JAVA代码
- Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
- css如何设置div中的内容垂直居中?
- SYNPROXY:廉价的抗 DoS 攻击方案
- mvc:annotation-driven /注解意义
- iSCSI远程块存储配置实验
- 第十三讲:软考中高项13_战略管理、业务流程管理、知识管理
- pg_stat wait timeout
- 利用HttpOnly来防御xss攻击
- 基于Berkeley DB实现的持久化队列