题目:10173 - Smallest Bounding Rectangle

求凸包的最小外接矩形的面积。

思路:

旋转卡壳
给定点集S,求S的最小覆盖矩形
最小覆盖矩形的四条边上,其中一条边有至少两个点,其他边上至少有一个点。
然后沿着凸包的边旋转,维护矩形另外三条边上的点。

#include<stdio.h>
#include<cmath>
#include<algorithm>
#define eps 1e-8
#define N 50010
using namespace std;
struct Point
{
double x,y;
Point(){}
Point(double x0,double y0):x(x0),y(y0){}
};
Point p[N];
int con[N];
int cn;
int n;
struct Line
{
Point a,b;
Line(){}
Line(Point a0,Point b0):a(a0),b(b0){}
};
double Xmult(Point o,Point a,Point b)
{
return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
}
double Dmult(Point o,Point a,Point b)
{
return (a.x-o.x)*(b.x-o.x)+(a.y-o.y)*(b.y-o.y);
}
int Sig(double a)
{
return a<-eps?-1:a>eps;
}
double Dis(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int cmp(Point a,Point b)
{
double d=Xmult(p[0],a,b);
if(d>0)
return 1;
if(d==0 && Dis(p[0],a)<Dis(p[0],b))
return 1;
return 0;
}
double min(double a,double b)
{
return a<b?a:b;
}
void Graham()
{
int i,ind=0;
for(i=1;i<n;i++)
if(p[ind].y>p[i].y || (p[ind].y==p[i].y) && p[ind].x>p[i].x)
ind=i;
swap(p[ind],p[0]);
sort(p+1,p+n,cmp);
con[0]=0;
con[1]=1;
cn=1;
for(i=2;i<n;i++)
{
while(cn>0 && Sig(Xmult(p[con[cn-1]],p[con[cn]],p[i]))<=0)
cn--;
con[++cn]=i;
}
int tmp=cn;
for(i=n-2;i>=0;i--)
{
while(cn>tmp && Sig(Xmult(p[con[cn-1]],p[con[cn]],p[i]))<=0)
cn--;
con[++cn]=i;
}
}
double Solve()
{
int t,r,l;
double ans=999999999;
t=r=1;
if(cn<3)
return 0;
for(int i=0;i<cn;i++)
{
while(Sig( Xmult(p[con[i]],p[con[i+1]],p[con[t+1]])-
Xmult(p[con[i]],p[con[i+1]],p[con[t]])   )>0)
t=(t+1)%cn;
while(Sig( Dmult(p[con[i]],p[con[i+1]],p[con[r+1]])-
Dmult(p[con[i]],p[con[i+1]],p[con[r]])   )>0)
r=(r+1)%cn;
if(!i) l=r;
while(Sig( Dmult(p[con[i]],p[con[i+1]],p[con[l+1]])-
Dmult(p[con[i]],p[con[i+1]],p[con[l]])   )<=0)
l=(l+1)%cn;
double d=Dis(p[con[i]],p[con[i+1]]);
double tmp=Xmult(p[con[i]],p[con[i+1]],p[con[t]])*
( Dmult(p[con[i]],p[con[i+1]],p[con[r]])-
Dmult(p[con[i]],p[con[i+1]],p[con[l]]) )/d/d;
ans=min(ans,tmp);
}
return ans;
}
int main()
{
int i;
while(scanf("%d",&n) && n)
{
for(i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
Graham();
printf("%.4f\n",Solve());
}
return 0;
}

UVA10173(求凸包的面积最小外接矩形)相关推荐

  1. opencv findContours()轮廓特征分析大全(求面积、周长、几何矩、质心、凸包、最小外接矩形、最小外接三角形、最小外接椭圆等)

    文章目录 前言 一.效果 二.opencv对应函数介绍 1.轮廓面积 2.轮廓周长 3.轮廓几何矩 4.轮廓的最大外接矩形 5.轮廓的凸包 6.轮廓的最小外接矩形 7.轮廓的最小外接三角形 8.轮廓的 ...

  2. C++/Qt:最小外接矩形

    以凸包的某条边作为矩形的一条边,求包围所有点的面积最小外接矩形.(感觉是对的)下图中蓝色为凸包,红色为MBR.             分享给有需要的人,代码质量勿喷. 一.求凸包,返回 xjList ...

  3. 三维空间点集的最小外接矩形

    文章目录 引言 说明 二维空间内的方案 方案 选定新坐标轴 变换矩阵 G G G 后续 引言 前段时间毕设卡在求一系列点的最小外接矩形, 卡了好久在导师的帮助下终于解决了. 来分享下思路 说明 本篇所 ...

  4. 旋转卡壳算法求最小外接矩形代码

    旋转卡壳原理:旋转卡壳详解_大学要有梦想的博客-CSDN博客_旋转卡壳 思路: 1.选择卡壳算法用于求凸多边形的最小外接矩形 1.多边形最小的外接矩形一定是以多边形的的一条边为底的一部分 2.通过这条 ...

  5. opencv 图像轮廓特征 图像面积,轮廓周长,外接矩形、最小外接矩形、最小外接圆、拟合椭圆

    找出图像轮廓 contours, hierarchy = cv.findContours(thresh, 3, 2) 画出图像轮廓 cnt = contours[1] cv.drawContours( ...

  6. 求取SHP文件的最小外接矩形并裁剪图像

    目的: 求取shp文件中每一个形状的最小外接矩形. 根据每一个形状的最小外接矩形裁剪图像. 已知数据: 一个shp文件,包含若干个形状. 2.shp文件对应的影像. 工具 ARCGIS10.4 pyt ...

  7. opencv 轮廓查找, 凸包,最小外接矩形,最小外接圆,最小外接椭圆

    本章内容: 1. 轮廓查找 2. 绘制轮廓 3. 凸包 4.最小外接矩形 5.最小外接圆 6.最小外接椭圆 1.搜索轮廓 2.绘制轮廓 输出结果 3.凸包 输出结果 4.最小外接矩形 输出结果 5.最 ...

  8. 【千律】OpenCV基础:图像外接矩形、最小外接矩形、凸包、外接圆、拟合椭圆的绘制

    环境:Python3.8 和 OpenCV 内容:图像外接矩形.最小外接矩形.凸包.外接圆.拟合椭圆的绘制 import cv2 as cv import numpy as np import mat ...

  9. matlab外接矩形,matlab求二值圖像最小外接矩形

    全部來自ilovematlab中文論壇,其中matlab較新的版本不再支持其中的有些函數,或者說有些函數的參數做了改變,因此適當修改后貼出來.注:無意侵權,記錄在此自我學習,順帶服務群眾. 首先是尋找 ...

最新文章

  1. 真相!没项目经验高薪就无望?
  2. 获取keras中间层输出、模型保存与加载
  3. c语言中strcmp作用,C语言中strcmp的实现原型
  4. noj数据结构稀疏矩阵的加法十字链表_数据结构之:图
  5. ec200s 方案 移远_移远 4G Cat 1 无线通信模块EC200S
  6. 微信支付开放平台_有了开放数据,您终于可以得到这些年来所支付的费用
  7. 为什么公司要对员工的薪资保密?
  8. 从非数组对象转数组方法小结
  9. SU Demos-03T-F Analysis-01Sugabor
  10. Dbutils常见方法
  11. 【心电信号】基于matlab心电信号PTT+HRV+PRV【含Matlab源码 158期】
  12. php的ob缓存详解
  13. 实时系统解决方案 TIBCO Rendezvous — 技术介绍(消息中间件|基于数据库的主动推送)...
  14. Prometheus(四)——Alertmanager
  15. mysql 计算近30天总金额_计算月嫂每天工资,应该用总工资除以30天还是26天?-免费法律咨询...
  16. 哲理故事与管理之道 20 -用危机激励下属
  17. 记一次生产上线的问题
  18. maya(学习笔记)之骨骼中关节的轴向确定方法
  19. 熔断器Hystrix
  20. 中国石油大学《计算机文化基础》在线考试题

热门文章

  1. mysql在linux下配置_mysql数据库在Linux下安装与配置
  2. InfluxDB基本使用说明
  3. python中showinfo_python – Tkinter中的非阻塞信息对话框
  4. 我犯的错误--关于主键
  5. 2018年中国银行业十件大事,“Fintech深度融合,科技子公司遍地”...
  6. ASP.NET Core MVC 模型绑定用法及原理
  7. 搭建scala 开发spark程序环境及实例演示
  8. weblogic与sitemesh乱码问题
  9. ffmpeg 怎么用
  10. linux为启动菜单加密码