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相关推荐

  1. 最小圆覆盖(Smallest Enclosing Discs)

    随机增量算法(a randomized incremental algorithm) #define sqr(x) ((x)*(x)) #define EPS 1e-4struct P{double ...

  2. 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]结尾的最短 ...

  3. UVA 12300 Smallest Regular Polygon(正多边形)

    题意:给出两点,求经过这两点的正n边形的最小面积 题解:这两点一定是最长的弦,我们设正多边形中点c,找到c到每个点的距离(都相同) 我们知道那个等腰三角形的底与每个角度就使用余弦定理 #include ...

  4. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  5. HALCON示例程序measure_metal_part_extended.hdev金属零件尺寸测量

    HALCON示例程序measure_metal_part_extended.hdev金属零件尺寸测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () read_imag ...

  6. 使用MOG2对运动物体进行检测

    本篇内容主要是对运动物体进行检测,通过使用MOG2(高斯混合模型建模)来进行物体运动前背景分离,来检测运动的物体,最后对其进行图像处理,再画出其最小外接矩形,达到对运动物体的分割与检测.具体代码如下: ...

  7. YOLOv5-Lite 详解教程 | 嚼碎所有原理、训练自己数据集、TensorRT部署落地应有尽有...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 YOLOv5 Lite在YOLOv5的基础上进行一系列消融实验 ...

  8. opencv形状识别学习总结

    OpenCV基元检测 Primitive Detection 目录 基元的概念 基元泛指图像中有特点的单元.常说的基元有:边缘.角点.斑点.直线段.圆.等 基元检测是图像分析的基础 边缘(Edge)检 ...

  9. 二维测量--轮辋和轮胎的检查

    对应示例程序: rim.hdev 目标:提取圆孔以及包含印记字符的区域 思路为:       1.读取图像,窗口初始化       2.先定位圆孔的位置和测量直径:          a.分割提取出灰 ...

  10. 深度学习目标检测YOLOV5的主要过程梳理和工程部署的具体手段

    一.YOLOV5训练数据基本格式以及格式的相互转换(labimg标注数据格式) 1.1 VOC数据格式 基本图片数据集,每张图片对应的.xml标注文件,类别classes.txt文件. 其中.xml的 ...

最新文章

  1. Session的lock()方法
  2. 不利于网站优化的操作有哪些?
  3. 学python需要什么基础知识-学Python需要什么基础知识?零基础可以学Python吗?
  4. 2.1TF模型持久化
  5. 线下报名 | NVIDIA JETSON 开发者交流会,走进哈工大!
  6. Three.js入门
  7. MySQL导入MongoDB
  8. 覆盖与隐藏的区别 (一个列子)
  9. java值的传递_Java 8可选–基于值的类使用指南
  10. 【WPF】如何获取命令行参数
  11. 实习成长之路:关于ElasticSearch深度分页带来的思考,如何解决深度分页和跳页
  12. latex zip 数模模板_数学建模美赛LaTeX模板
  13. 心脏除颤器的工作原理
  14. mysql数据表删了怎么恢复_mysql数据库数据删除怎么恢复
  15. 三种不同的梯度下降算法和正则方程的线性回归预测结果对比
  16. java paypal开发详解_PayPal 开发详解(六):下载paypal立即付款SDK 并编译打包
  17. 关于计算机固态硬盘正确的是,如何对固态硬盘进行初始化?选择合适的格式及分区结构很重要...
  18. 【转帖】文件系统驱动编程基础篇
  19. 计算机二级vbf资源百度云,2018年计算机二级考试考前冲刺卷
  20. mariadb数据库基本使用

热门文章

  1. 基于FPGA的数据采集系统(一)
  2. 修改oracle用户密码永不过期的方法
  3. iP138查询网,ip数据库
  4. Surrogate mother是代孕妈妈,那么,Surrogate parent呢?
  5. jenkins插件安装失败更改插件源
  6. 数理统计(三)-假设检验:显著性水平α、检验统计量、原假设、备择假设、拒绝域、临界点、第Ⅰ类错误、第Ⅱ类错误、【检验μ、检方差、检验分布】、临界值法【Z检验法、t检验法、卡方检验法、F检验法】、p值法
  7. Android微信授权登录闪退,如何解决微信闪退问题 四种解决微信闪退无法登录的原因及方...
  8. html meta标签 小图标,meta标签详解及添加ico图标
  9. kindle3nbsp;注册地址,美国地址…
  10. yolov5m.pt triton部署