UVA 12307 Smallest Enclosing Rectangle
https://vjudge.net/problem/UVA-12307
求覆盖所有点的最小矩形面积、周长
相当于求凸包的最小面积外接矩形、最小周长外接矩形
结论:
这个矩形一定有一条边和凸包上一条边重合
证明去看https://wenku.baidu.com/view/f11d0836ee06eff9aef807d9.html
枚举一条边,用旋转卡壳求其他三边
假设现在正枚举到A点,对应紫色边,
显然,紫色边的对边一定 过A点的对踵点且与紫色边平行
那么矩形的高|BH|=AE、AB的叉积/ | AB |
现在只剩下|GD|
把向量CD平移至向量AF
|GD|=cos(∠CDG)*|CD|=cos(∠CDG)*|AF|
AF*AD=|AF|*|AD|*cos(∠DAF)
∵∠CDG=∠DAF
∴AF*AD=|GD|*|AD|
所以|GD|=AF*AD/|AD|
点A是枚举的,如何求点B C K?
上面说了,点B是点A的对踵点,
那么利用叉积,同底三角形面积越大,高越大 即可求出B点
直观上看,K点是距点A最靠右的点
即沿向量AD向右扩展
向右就可以想到两个向量点积>0
即下一个点与这个点组成的向量,如果AD与它的点积>0,K取下一个点更优
C点同理,点积<0
注意C是从点B开始逆时针寻找的最靠左的点
#include<cmath> #include<cstdio> #include<algorithm>#define N 100001using namespace std;const double eps=1e-9;int dcmp(double x) {if(fabs(x)<eps) return 0;return x<0 ? -1 : 1; }struct Point {double x,y;Point(double x=0,double y=0) : x(x),y(y) { }bool operator < (Point p) const{if(!dcmp(x-p.x)) return y<p.y;return x<p.x;}bool operator == (Point p) const{return !dcmp(x-p.x) && !dcmp(y-p.y);} };typedef Point Vector;Point P[N],C[N];Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x; }double Area2(Point A,Point B,Point D) {return Cross(B-A,D-A); }double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y; }double Length(Vector A) {return sqrt(Dot(A,A)); }int ConvexHull(Point *p,int n,Point *c) {sort(p,p+n);n=unique(p,p+n)-p;int m=0;for(int i=0;i<n;++i){while(m>1 && Cross(c[m-1]-c[m-2],p[i]-c[m-2])<=0) m--;c[m++]=p[i];}int k=m;for(int i=n-2;i>=0;--i){while(m>k && Cross(c[m-1]-c[m-2],p[i]-c[m-2])<=0)m--;c[m++]=p[i];}m--;return m; }void RotatingCaliper(Point *c,int m) {double AnsArea=1e20,AnsPeri=1e20;int q=1,l=0,r=0;double d,h,w;for(int p=0;p<m;++p){while(fabs(Cross(c[p]-c[p+1],c[q+1]-c[p+1]))>fabs(Cross(c[p]-c[p+1],c[q]-c[p+1]))) q=(q+1)%m;while(dcmp(Dot(c[p+1]-c[p],c[r+1]-c[r]))>0) r=(r+1)%m;if(!l) l=q;while(dcmp(Dot(c[p+1]-c[p],c[l+1]-c[l]))<0) l=(l+1)%m;d=Length(c[p+1]-c[p]);h=fabs(Area2(c[p],c[p+1],c[q]))/d;w=Dot(c[p+1]-c[p],c[r]-c[l])/d;AnsArea=min(AnsArea,w*h);AnsPeri=min(AnsPeri,(w+h)*2);}printf("%.2lf %.2lf\n",AnsArea,AnsPeri); }int main() {int n,m;while(1){scanf("%d",&n);if(!n) return 0;for(int i=0;i<n;++i) scanf("%lf%lf",&P[i].x,&P[i].y);m=ConvexHull(P,n,C);RotatingCaliper(C,m);} }
转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8253800.html
UVA 12307 Smallest Enclosing Rectangle相关推荐
- 最小圆覆盖(Smallest Enclosing Discs)
随机增量算法(a randomized incremental algorithm) #define sqr(x) ((x)*(x)) #define EPS 1e-4struct P{double ...
- uva 11536——Smallest Sub-Array
题意:给定n个数,这n个数在m的范围之内.v[i]=(v[i-1]+v[i-2]+v[i-3])%m+1; 然后求一个最短连续子序列使得序列内包括1-k个数. 思路:枚举.枚举以v[i]结尾的最短 ...
- UVA 12300 Smallest Regular Polygon(正多边形)
题意:给出两点,求经过这两点的正n边形的最小面积 题解:这两点一定是最长的弦,我们设正多边形中点c,找到c到每个点的距离(都相同) 我们知道那个等腰三角形的底与每个角度就使用余弦定理 #include ...
- 紫书《算法竞赛入门经典》
紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...
- HALCON示例程序measure_metal_part_extended.hdev金属零件尺寸测量
HALCON示例程序measure_metal_part_extended.hdev金属零件尺寸测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () read_imag ...
- 使用MOG2对运动物体进行检测
本篇内容主要是对运动物体进行检测,通过使用MOG2(高斯混合模型建模)来进行物体运动前背景分离,来检测运动的物体,最后对其进行图像处理,再画出其最小外接矩形,达到对运动物体的分割与检测.具体代码如下: ...
- YOLOv5-Lite 详解教程 | 嚼碎所有原理、训练自己数据集、TensorRT部署落地应有尽有...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 YOLOv5 Lite在YOLOv5的基础上进行一系列消融实验 ...
- opencv形状识别学习总结
OpenCV基元检测 Primitive Detection 目录 基元的概念 基元泛指图像中有特点的单元.常说的基元有:边缘.角点.斑点.直线段.圆.等 基元检测是图像分析的基础 边缘(Edge)检 ...
- 二维测量--轮辋和轮胎的检查
对应示例程序: rim.hdev 目标:提取圆孔以及包含印记字符的区域 思路为: 1.读取图像,窗口初始化 2.先定位圆孔的位置和测量直径: a.分割提取出灰 ...
- 深度学习目标检测YOLOV5的主要过程梳理和工程部署的具体手段
一.YOLOV5训练数据基本格式以及格式的相互转换(labimg标注数据格式) 1.1 VOC数据格式 基本图片数据集,每张图片对应的.xml标注文件,类别classes.txt文件. 其中.xml的 ...
最新文章
- Session的lock()方法
- 不利于网站优化的操作有哪些?
- 学python需要什么基础知识-学Python需要什么基础知识?零基础可以学Python吗?
- 2.1TF模型持久化
- 线下报名 | NVIDIA JETSON 开发者交流会,走进哈工大!
- Three.js入门
- MySQL导入MongoDB
- 覆盖与隐藏的区别 (一个列子)
- java值的传递_Java 8可选–基于值的类使用指南
- 【WPF】如何获取命令行参数
- 实习成长之路:关于ElasticSearch深度分页带来的思考,如何解决深度分页和跳页
- latex zip 数模模板_数学建模美赛LaTeX模板
- 心脏除颤器的工作原理
- mysql数据表删了怎么恢复_mysql数据库数据删除怎么恢复
- 三种不同的梯度下降算法和正则方程的线性回归预测结果对比
- java paypal开发详解_PayPal 开发详解(六):下载paypal立即付款SDK 并编译打包
- 关于计算机固态硬盘正确的是,如何对固态硬盘进行初始化?选择合适的格式及分区结构很重要...
- 【转帖】文件系统驱动编程基础篇
- 计算机二级vbf资源百度云,2018年计算机二级考试考前冲刺卷
- mariadb数据库基本使用
热门文章
- 基于FPGA的数据采集系统(一)
- 修改oracle用户密码永不过期的方法
- iP138查询网,ip数据库
- Surrogate mother是代孕妈妈,那么,Surrogate parent呢?
- jenkins插件安装失败更改插件源
- 数理统计(三)-假设检验:显著性水平α、检验统计量、原假设、备择假设、拒绝域、临界点、第Ⅰ类错误、第Ⅱ类错误、【检验μ、检方差、检验分布】、临界值法【Z检验法、t检验法、卡方检验法、F检验法】、p值法
- Android微信授权登录闪退,如何解决微信闪退问题 四种解决微信闪退无法登录的原因及方...
- html meta标签 小图标,meta标签详解及添加ico图标
- kindle3nbsp;注册地址,美国地址…
- yolov5m.pt triton部署