凸包及最小外围矩形
- 格式:doc
- 大小:27.00 KB
- 文档页数:4
识别多边形中心点的方法全文共四篇示例,供读者参考第一篇示例:多边形是一个平面图形,由若干个线段组成,每个线段都相邻接且不相交,而且首尾相连,形成一个封闭图形。
多边形的中心点是指多边形的质心,也是多边形的重心。
识别多边形中心点是在计算机视觉和图像处理中一个重要的问题,可以帮助我们进行图像分析、目标定位等相关任务。
本文将介绍几种常用的方法来识别多边形的中心点。
方法一:几何中心法在数学几何中,多边形中心点通常是指多边形的“几何中心”,也称几何质心。
几何中心法是最简单直观的方法,通过计算多边形的顶点坐标的平均值来得到多边形的中心点。
具体步骤如下:1. 对多边形的所有顶点坐标进行求和,并除以顶点的个数,得到一个平均坐标作为中心点的坐标。
2. 将得到的中心点坐标绘制在多边形的内部,即可得到多边形的中心点。
这种方法简单易行,适用于正规的凸多边形。
但对于不规则的凸多边形或凹多边形,可能会得到与我们期望不同的结果。
重心法也是一种常用的计算多边形中心点的方法。
重心是一个物理学和工程学概念,是指一个图形的“平均质量点”。
在数学上,一个多边形的重心定义为其所有小面积的中点的平均。
计算多边形的重心的方法是将多边形分解成多个三角形,计算每个三角形的重心,最后取所有三角形重心的平均值作为多边形的重心。
具体步骤如下:1. 将多边形分解成若干个三角形,可以采用三角剖分算法进行分解。
2. 计算每个三角形的重心,即三个顶点坐标的平均值。
通过重心法计算多边形中心点,可以更准确地反映多边形的形状和结构。
但对于复杂的多边形,计算过程可能比较复杂。
方法三:最小外接矩形法最小外接矩形法是另一种计算多边形中心点的方法。
这种方法不需要对多边形进行三角剖分,而是根据多边形的外包矩形来确定多边形的中心点。
计算多边形的最小外接矩形的步骤如下:1. 找到多边形的外包矩形,即包含多边形的最小矩阵。
最小外接矩形法适用于不规则多边形的中心点计算,并且计算效率高,较为简单。
最小边界矩形最小边界矩形是一种广泛应用于计算几何和算法设计中的概念,它可以用来描述二维图形的最小包围矩形。
下面将对最小边界矩形的定义、求解方法和应用进行详细介绍。
一、最小边界矩形的定义最小边界矩形是一个垂直于坐标轴的矩形,它恰好能够覆盖给定的二维图形,并且矩形的面积最小。
可以想象一下,在给定平面上的任意点集中,最小边界矩形将是一个框住这些点的最小面积矩形。
二、最小边界矩形的求解方法1.暴力法最暴力的方法是枚举所有可能的矩形,计算每个矩形的覆盖面积,并从中选出面积最小的矩形作为最小边界矩形。
实际上,这种方法非常耗时,不适用于大规模的数据。
2.旋转卡壳法旋转卡壳法利用了极角排序和凸包的概念,其基本思想是先求出凸包,然后从凸包的每个顶点开始,假设矩形的边沿着平面上的某一条直线,然后旋转这条直线,找到能够覆盖所有点的最小矩形。
最终从所有旋转的结果中选出面积最小的矩形作为结果。
3.最小面积闭包法最小面积闭包法的基本思路是先求出给定点集的凸包,然后找到凸包上的所有边,将这些边向外扩展,直到有两条边相交,这样就形成了一个闭合的多边形。
接下来就是在闭合的多边形中找最小的矩形。
三、最小边界矩形的应用最小边界矩形广泛应用于计算几何和算法设计中,主要体现在以下几个方面:1.图形识别最小边界矩形可以作为基本的特征描述符,可以用于识别二维图形中的物体。
例如,如果要识别手写数字,可以通过求解数字的最小边界矩形来描述数字的形状。
2.矩形包裹最小边界矩形可以用来包裹其他图形,例如多边形、圆形等。
通过求解最小边界矩形,可以获得该图形的相对位置信息,从而进行空间变换和处理。
3.物流配送在物流配送中,最小边界矩形可以用来描述不同大小和形状的货物,以便优化运输方案。
例如,在集装箱装载过程中,可以通过求解最小边界矩形来确定货物的摆放位置,以最大化装载量。
以上主要介绍了最小边界矩形的定义、求解方法和应用。
最小边界矩形的求解方法虽然复杂,但其性能优秀,应用广泛。
题目简述:給出一个平面点集S,求一个面积最小的矩形使其包含S所有的点。
预备知识:在求解这道题之前我们先要了解一些关于凸包的知识。
什么是凸包?简单地说,对于一个平面点集S,我们把完全包含该点集的最小的凸多边形叫做点集S的凸包H。
凸包一个很重要的性质就是它“凸”的性质。
这个性质对我们理解和计算凸包都有很大的帮助。
I)对点集S中任意一点a,当且仅当存在直线p过a点并使得S中除a外所有点均在p的一侧,则a为凸包上的一顶点。
II)对点集S中任意两点a,b,当且仅当S中除a,b以外所有点都在过点a,b 的直线p的一侧,则线段ab为凸包上的一条边。
III)对点集S中任意四点a,b,c,d,当d在三角形a bc中(包括边),则d不是凸包上的点。
上面的几条关于凸包“凸”的性质为我们计算凸包提供了一个基础。
这里我们将介绍两种简单且被广泛运用的算法――Gift-Wrappin g和Grah am-Scan算法。
Gift-Wrappin g算法:通过性质(I),我们可以找到一个特殊点,如具有最小y坐标且x坐标尽可能小的点。
将它作为计算凸包的第一个顶点。
确定了起点后,我们就可以通过Gift-Wrappin g算法计算出点集的凸包。
下面的步骤很直观的描述了这个算法:1)把点集中所有点都看成是固定在平面上的柱子,想象我们在起始点柱子上系上一根身子。
2)把绳子沿水平方向向右拉直,并逆时针旋转,当绳子碰上一根柱子,则对应了凸包上的一点3)继续旋转绳子,每次确定一个凸包上的顶点,直至绳子回到起点。
图一:Gift-Wrappin g算法计算凸包的过程每次通过旋转绳子找到下一个凸包顶点需要对点集中所有剩余点进行一次比较,所以这一步的时间复杂度是O(n)。
每个凸包上的顶点都需要进行一次旋转操作,而最坏情况下,凸包顶点个数可以和点集个数相等,所以整个Gif t-Wrappin g算法的时间复杂度是O(n2)的。
旋转卡壳法
旋转卡壳法(也称为旋转卡尺法)是一种凸包算法,它可以在线性时间内求解如凸包直径、最小矩形覆盖等和凸包性质相关的问题。
该算法通过枚举凸包上某一条边的同时维护其他需要的点,能够在线性时间内求解凸包直径、最小矩形覆盖等和凸包性质相关的问题。
旋转卡壳法是在凸包算法的基础上,通过在枚举凸包上某一条边时,维护其他需要的点,以便在线性时间内求解与凸包性质相关的问题。
在旋转卡壳法中,通常按照向某一方向旋转的顺序来枚举边,因此整个过程就像是在旋转一个卡尺,所以被称为“旋转卡壳法”。
该算法在凸包直径的求解中具有应用,凸包直径是距离最远的两条平行凸多边形切线,而对踵点对是卡住凸多边形两侧切线的切点对。
旋转卡壳法的核心思想是在边旋转时将切点对进行动态调整,以确保对于当前枚举的边的最优性。
旋转卡壳法还可以用于求解点集中构成面积最大的三角形的三个顶点,这三个顶点一定出现在凸包的顶点上。
如果三角形三个顶点在凸包内部则可以将顶点分别平移至凸包边界上,此时得到面积更大的三角形,之后任取一边为底边,可以把剩余的一个顶点平移至该边的切点位置,这样可以进一步扩大三角形面积,对每条边进行同样处理可以发现最终三个顶点都位于凸包顶点处。
总之,旋转卡壳法是一种有效的凸包算法,可以用于求解凸包直径、最小矩形覆盖以及最大面积三角形等与凸包性质相关的问题。
凸包计算边界框凸包是计算机图形学中的一个重要概念,它可以用来描述一组点所形成的最小凸多边形。
而利用凸包计算边界框,可以方便地得到一组点的最小外接矩形,从而很好地描述了这组点的整体形状和大小。
一、什么是凸包凸包是指包含给定点集合的最小凸多边形或凸包围多边形。
凸多边形是指多边形内任意两点连线上的所有点都在多边形内部,而凸包则是包含了给定点集合的最小凸多边形。
二、凸包的计算方法计算凸包有多种方法,其中一种常用且简单的方法是使用“Graham扫描法”。
该方法的基本思想是:首先找到给定点集合中的一个基点(通常是最下方的点或最左方的点),然后按照与基点的极角大小对其他点进行排序。
接下来,按照排序后的次序依次遍历每个点,并判断其与前两个点的转向关系。
如果转向关系为右转,则将前一个点从凸包中删除,直到所有的点都被遍历完毕。
最后得到的就是凸包的顶点集合。
三、利用凸包计算边界框边界框是指能够完全包围给定点集合的最小矩形。
而利用凸包计算边界框的方法相对简单直观。
首先,我们先计算出凸包的顶点集合。
然后,我们可以找到凸包中的最左、最右、最上、最下的点,分别记为leftmost、rightmost、topmost、bottommost。
最后,我们可以根据这四个点的坐标来构建边界框,即边界框的左上角坐标为(leftmost.x, topmost.y),右下角坐标为(rightmost.x, bottommost.y)。
四、凸包计算边界框的应用利用凸包计算边界框的方法在计算机图形学和计算机视觉中有着广泛的应用。
例如,在图像处理中,可以利用该方法来获取图像中目标物体的外接矩形,从而进行目标检测和识别。
另外,在地理信息系统中,该方法也可以用来计算地理区域的边界框,从而方便地进行地理数据的分析和可视化。
五、总结通过凸包计算边界框的方法,我们可以简单而直观地得到一组点的最小外接矩形。
该方法的基本思想是通过计算凸包的顶点,然后根据这些顶点的坐标来构建边界框。
多边形最小外接矩形算法概要
该算法的基本思想是通过枚举多边形的每一条边作为矩形的长边,然后计算矩形的宽和面积。
通过遍历所有可能的长边,找到最小的面积即可得到最小外接矩形。
具体步骤如下:
1.输入多边形的顶点坐标,按顺时针或逆时针顺序给出。
2.初始化最小面积为正无穷大。
3.对于每一条多边形的边,计算其与X轴的夹角θ(假设X轴方向为0度),并计算其长度。
4.将边的长度投影到X轴和Y轴上,得到长边的长度l和宽边的长度w。
5.根据矩形的长度l和宽度w计算其面积,如果该面积小于当前最小面积,则更新最小面积并记录当前矩形的长度和宽度。
6.重复步骤3-5,直到计算完所有可能的边作为长边为止。
7.输出最小面积对应的矩形的长度和宽度即可。
这个算法的时间复杂度为O(n^2),其中n为多边形的顶点数。
因为需要计算每条边的长度和面积,并进行比较来找到最小面积。
在实际应用中,可以使用优化算法来加速计算,如通过构建凸包来减少边的数量。
总结起来,多边形最小外接矩形算法是一个通过枚举多边形的边,计算矩形的长度和宽度,并找到最小面积的过程。
通过该算法可以方便地求
解多边形的最小外接矩形,对于一些需要进行碰撞检测或包围盒计算的应用场景具有重要的意义。
拟合最小矩形拟合最小矩形是指在给定一组点的情况下,找到能够包含所有点的最小面积矩形。
在计算机图形学和计算几何学中,拟合最小矩形是一项重要的任务,常被应用于图像处理、模式识别和计算机视觉等领域。
本文将介绍拟合最小矩形的原理、算法和应用。
一、原理拟合最小矩形的原理是基于几何学的知识。
对于给定的一组点,我们可以通过计算点之间的距离和角度来确定矩形的位置和大小。
具体来说,拟合最小矩形的原理可以分为以下几个步骤:1. 计算凸包:首先需要计算给定点集的凸包,即能够包含所有点的最小凸多边形。
计算凸包的常用算法有Graham扫描算法和Jarvis 步进法等。
2. 寻找最小矩形:在得到凸包之后,我们需要找到能够包含凸包的最小矩形。
最小矩形的边与凸包的边平行或垂直,因此我们可以通过旋转凸包来得到不同方向上的矩形,并计算其面积。
最小面积的矩形即为拟合最小矩形。
二、算法拟合最小矩形的算法有多种,常用的有旋转卡壳算法和最小面积矩形算法等。
下面分别介绍这两种算法的原理和步骤。
1. 旋转卡壳算法:旋转卡壳算法通过旋转凸包的边来找到最小矩形。
具体步骤如下:a. 计算凸包;b. 初始化最小矩形的面积为无穷大;c. 遍历凸包的边,计算当前边与其他边的夹角;d. 旋转凸包,计算旋转后的矩形的面积;e. 更新最小矩形的面积;f. 重复步骤d-e,直到遍历完所有边。
2. 最小面积矩形算法:最小面积矩形算法通过计算凸包的边界点和对角点来找到最小矩形。
具体步骤如下:a. 计算凸包;b. 初始化最小矩形的面积为无穷大;c. 遍历凸包的边界点,计算当前点与其他点的连线;d. 计算连线所构成的矩形的面积;e. 更新最小矩形的面积;f. 重复步骤c-e,直到遍历完所有点。
三、应用拟合最小矩形在计算机视觉和图像处理中有广泛的应用。
以下是一些常见的应用场景:1. 目标检测:在目标检测中,我们需要找到图像中目标的位置和大小。
通过拟合最小矩形,我们可以得到目标的边界框,从而实现目标检测。
轮廓常见特征值1. 引言轮廓是指物体边界在图像中的外形。
在计算机视觉中,轮廓是一种重要的特征,可用于分割、识别和跟踪图像中的物体。
轮廓常见特征值是指用来描述轮廓形状和结构的数值指标。
本文将从不同的角度探讨常见的轮廓特征值,并介绍其在计算机视觉中的应用。
2. 常见轮廓特征值2.1 周长周长是指轮廓的封闭曲线的长度。
在计算中,可以通过对轮廓上所有像素点的距离进行累加来计算周长。
周长通常用来衡量物体的大小,对于物体的分割和测量非常有用。
2.2 面积面积是指轮廓所围成的区域的大小。
计算轮廓的面积可以采用像素计数法或多边形面积计算法。
轮廓面积在图像分割、形状匹配等任务中起着重要的作用。
2.3 矩矩是一种表示轮廓形状和结构的数值特征。
矩可以分为几何矩和中心矩两种。
几何矩描述了轮廓的位置、大小和朝向,而中心矩描述了轮廓的平均灰度和形状。
矩在形状匹配、图像识别和目标跟踪中被广泛应用。
2.4 最大外接矩形和最小外接矩形最大外接矩形是能够完全包围轮廓的最小面积矩形。
最小外接矩形是能够刚好包围轮廓的最小面积矩形。
最大外接矩形可以用来估计物体的朝向和形状,最小外接矩形可以用来计算轮廓的紧凑性和几何特征。
2.5 凸包凸包是能够完全包围轮廓的最小凸多边形。
凸包可以用来检测和描述轮廓的几何形状。
对于不规则形状的轮廓,凸包可以提供有效的形状变量。
2.6 离心率离心率是描述椭圆轮廓形状的一个指标。
离心率接近于0时,表示轮廓接近于一个圆形;离心率接近于1时,表示轮廓接近于一个线段。
离心率在图像分割和形状匹配中经常被使用。
3. 轮廓特征值的应用3.1 目标检测和识别轮廓特征值可以用来描述和比较不同目标的形状和结构。
通过提取目标的轮廓特征值,可以实现目标的检测和识别。
例如,可以通过比较目标的矩特征来判断是否为同一类别的物体。
3.2 图像分割轮廓特征值可以用来分割图像中的不同物体和区域。
通过计算轮廓的面积、周长和形状特征,可以实现图像的自动分割。
ACM 计算几何之凸包问题整理编辑----Blue Seven1、何谓凸包问题所谓凸包,是指平面上一点集Q ,将其中某些点连起来得到一凸边形,使得满足Q 中的所有的点都在该凸边形内(或其边上),则称该凸边形为点集Q 的凸包(convex hull)。
如上图中灰色线段组成的凸边形即为点集Q={p0,p1,p2,...,p11,p12}的凸包。
一组平面上的点,求一个包含所有点的最小凸边形,既是凸包问题。
形象地说:在一平木板(平面)上钉若干钉子(点),将一橡皮筋套上去后,会把钉子圈起来,形成一个凸边形,即为该点集的凸包。
2、解决凸包问题的常用算法及分析常用来解决凸包问题的算法有Graham 扫描法和Jarvis 步进法。
接下来简单介绍Graham 扫描法(极角序),至于Jarvis 步进法可参考《算法导论》。
首先我们可以肯定的是,点集Q 中最左下角的一个点P 必是凸包ch ( Q)的一个顶点。
将其记为P0,接着从P0出发,按逆时针方向扫描点集Q 除P0外其余的每一个点,其顺序是依据各点在逆时针方向上相对P0的极角的递增次序。
极角的大小、可以通过计算叉积)(*)(00P P P P j i --来确定: 若叉积>0,则说明相对P0来说,Pj 的极角大于Pi 的极角,Pi 先于Pj 被扫描;若叉积<0,则说明Pj 的极角小于Pi 的极角,Pj 先于Pi 被扫描;若叉积=0,则说明两个极角相等。
在这种情况下,由于Pi 和Pj 中距离P0较近的点不可能是凸包的顶点,因此我们只需扫描其中一个与P0距离较远的点。
接下来的问题是如何确定当前被扫描的点Pi(1 < i < n-1)是凸包上的点呢?我们设置一个关于候选点的堆栈S 来解决凸包问题。
初始时P0和排序后的P1,P2作为初始凸包相继人栈。
扫描过程中,Q 集合中的其它点都被推入堆栈一次,而不是凸包ch(Q)顶点的点最终将弹出堆栈。
当算法结束时,堆栈S 中仅包含ch ( Q)的顶点,其顺序为各点在边界上出现的逆时针方向排列的顺序。
矩形大法巧解高中竞赛题矩形大法是一种常用的解题方法,尤其在高中竞赛中,经常能够用到该方法来解决与矩形相关的题目。
本文将详细介绍矩形大法的原理和具体应用,并提供一些相关参考内容供读者学习参考。
一、矩形大法的原理矩形大法是通过将原问题转化为矩形相关的问题来解答。
矩形作为一种简单且易于处理的图形,具有很多特殊性质,通过利用矩形的性质,能够简化问题、加快解题速度。
二、矩形大法的具体应用1. 最小矩形覆盖问题给定一些点,要求通过平移、旋转矩形使得这些点都在矩形内部,问所需矩形的最小面积。
这类问题可以通过计算所有点的最小包围矩形来解决。
2. 矩形面积最大问题给定一些点,要求通过平移、旋转矩形使得这些点都在矩形内部,问所需矩形的最大面积。
这类问题可以通过计算所有点的凸包并求凸包的最小面积矩形来解决。
3. 矩形覆盖问题给定一些点的坐标,要求通过平移、旋转矩形使得这些点都在矩形内部,问是否存在合适的矩形覆盖所有点。
这类问题可以通过计算所有点的最小包围矩形,然后判断最小包围矩形的长宽是否满足条件来解决。
4. 矩形交集问题给定两个矩形的坐标,要求计算两个矩形的交集矩形的面积。
这类问题可以通过判断两个矩形的边界是否相交,并计算相交部分的面积来解决。
三、矩形大法的相关参考内容1. 《计算几何算法与实现》- 该书详细介绍了矩形大法的原理和具体应用,并给出了详细的算法实现代码,对于学习矩形大法非常有帮助。
2. 《高中竞赛数学解题方法与技巧总结》- 该文总结了高中竞赛中常见的矩形问题,并提供了详细的解题思路和步骤,对于熟悉矩形大法有很大帮助。
3. 网上相关博客和论坛文章- 在网络上有很多数学爱好者和竞赛高手分享了自己的解题经验和技巧,通过搜索关键词“矩形大法解题”可以找到很多相关的博客和论坛文章,可以从中学习到更多的解题方法和技巧。
总结:矩形大法是一种常用的解题方法,在高中竞赛中经常能够用到。
通过将原问题转化为矩形相关的问题,可以简化问题、加快解题速度。
题目简述:
給出一个平面点集S,求一个面积最小的矩形使其包含S所有的点。
预备知识:
在求解这道题之前我们先要了解一些关于凸包的知识。
什么是凸包?简单地说,对于一个平面点集S,我们把完全包含该点集的最小的凸多边形叫做点集S的凸包H。
凸包一个很重要的性质就是它“凸”的性质。
这个性质对我们理解和计算凸包都有很大的帮助。
I)对点集S中任意一点a,当且仅当存在直线p过a点并使得S中除a外所有点均在p的一侧,则a为凸包上的一顶点。
II)对点集S中任意两点a,b,当且仅当S中除a,b以外所有点都在过点a,b 的直线p的一侧,则线段ab为凸包上的一条边。
III)对点集S中任意四点a,b,c,d,当d在三角形abc中(包括边),则d不是凸包上的点。
上面的几条关于凸包“凸”的性质为我们计算凸包提供了一个基础。
这里我们将介绍两种简单且被广泛运用的算法――Gift-Wrapping和Graham-Scan算法。
Gift-Wrapping算法:
通过性质(I),我们可以找到一个特殊点,如具有最小y坐标且x坐标尽可能小的点。
将它作为计算凸包的第一个顶点。
确定了起点后,我们就可以通过Gift-Wrapping算法计算出点集的凸包。
下面的步骤很直观的描述了这个算法:
1)把点集中所有点都看成是固定在平面上的柱子,想象我们在起始点柱子上系上一根身子。
2)把绳子沿水平方向向右拉直,并逆时针旋转,当绳子碰上一根柱子,则对应了凸包上
的一点
3)继续旋转绳子,每次确定一个凸包上的顶点,直至绳子回到起点。
图一:Gift-Wrapping算法计算凸包的过程
每次通过旋转绳子找到下一个凸包顶点需要对点集中所有剩余点进行一次比较,所以这
一步的时间复杂度是O(n)。
每个凸包上的顶点都需要进行一次旋转操作,而最坏情况下,凸包顶点个数可以和点集个数相等,所以整个Gift-Wrapping算法的时间复杂度是O(n2)的。
Graham-Scan算法:
Gift-Wrapping算法无论从理解还是从实现上来说,它都是十分简单的。
但由于它的复杂度并不理想,我们无法利用它来求解大规模的凸包问题。
因而,我们将介绍一种高效的计算凸包的算法――Graham-Scan。
Graham-Scan算法主要可分成两部分:
1)同Gift-Wrapping一样,需要先找出一个起始点。
将这个点作为原点,进行夹角排序。
2)先将起始点压入堆栈H中,再按照已经排好的顺序对每一个点进行扫描,同时维护堆栈H。
这个堆栈表示的是到目前为止,所有已经扫描过的点对应的凸包。
每当扫描一个点p 的时候:
a) 如果堆栈的元素少2个或者堆栈顶端的两个点与p构成左转关系,则将p压入堆栈中。
b) 否则,栈顶元素出栈并继续进行a的判断。
当所有点都扫描完后,堆栈H即为我们要求的凸包。
图二:Graham-Scan算法的扫描过程(堆栈H储存的即实线连接起来的点)
分析Graham-Scan的复杂度:第一步中找出起点并进行极角排序的复杂度是 O(n log n)。
第二步中每一个点仅会被扫描一次并相应维护一次堆栈H 。
而维护堆栈过程中每次访问堆栈H中的点,要么这个点被删除,要么就停止堆栈的维护,所以所有堆栈维护加起来最多只访问了2n次。
故这部分的复杂度是O(n)。
综合起来,Graham-Scan算法的时间复杂度是O(n log n)的。
算法分析:
现在考虑这道题目,题目要我们求出一个最小面积的矩形能够覆盖给定的所有点。
易知矩形覆盖所有点当且仅当它覆盖这些点的凸包。
故而,问题可以转化为对于一个凸包,求出一个面积最小的矩形来覆盖它。
那么这个覆盖凸包的最小矩形有什么性质呢?
首先,这个矩形的四条边上必然都有凸包的顶点。
这个很容易想清楚,如果矩形的某条边没有碰上凸包的顶点,那么我们一定能把这条边向里压,从而得到一个更小的满足条件的矩形。
其次,这个矩形至少有一条边与凸包上的一边重合。
这个性质不容易直观地想清楚,需要书面证明一下。
由于完整的证明需要分成很多情况来讨论,比较繁琐,所以这里仅选取其中的一种情况来证明,其他情况可以类似地进行证明。
利用反证法,我们假设覆盖凸包的最小矩形所有边都没有和凸包的边有重合,也就是说,最小矩形的每条边上仅有一个凸包的顶点。
如图三所示,矩形ABCD是覆盖凸包的最小矩形,M、N、P、Q为凸包在矩形四条边上的顶点。
我们分别作MM’⊥ CD,NN’⊥ AD。
则矩形ABCD 的面积S = MP×Cos(∠PMM’)×NQ×Cos(∠QNN’)。
我们将矩形旋转X度(顺时针为正,逆时针为负),仍使矩形覆盖凸包且M、N、P、Q分别在它的四边上。
则此时新矩形的面积S = MP×Cos(∠PMM’+ X)×NQ×Cos(∠QNN’- X) 。
我们仅需考虑Cos(∠PMM’+ X)×Cos(∠QNN’- X)的单调性。
Cos(∠PMM’+ X)×Cos(∠QNN’- X)
= 1/2[Cos(∠PMM’+ X + ∠QNN’- X) + Cos(∠PMM’+ X - ∠QNN’+ X)]
= 1/2[Cos(∠PMM’+ ∠QNN’) + Cos(∠PMM’- ∠QNN’+ 2X)]
∵0≤∠PMM’<π/2 , 0≤∠QNN’<π/2
∴-π/2 <∠PMM’- ∠QNN’<π/2
∴Cos(∠PMM’- ∠QNN’)不可能取到最小值
∴x在0左边的一个区间中f(x) = Cos(∠PMM’- ∠QNN’+ 2X)递增,或x在0右边一个区间中f(x) = Cos(∠PMM’- ∠QNN’+ 2X)递减。
因而,对于这样的矩形,我们总可以顺时针或逆时针旋转一个小角度,从而获得一个更小的矩形,这与假设矛盾。
故最小矩形至少有一条边与凸包一边重合。
了解到最小矩形所具有的这两个性质后,我们就能够很容易的想到一种算法,枚举凸包上哪条边与矩形的边重合,再找出在这条直线投影的正负方向上最远的和到直线距离最远的三点,从而确定和计算出矩形的面积,最后选取最小值,即为覆盖凸包的最小矩形的面积。
我们用最朴素的方法去实现它,枚举每条边后再把剩余的点都扫描一遍,来找出另外三点,计算出矩形的面积。
这样做时间复杂度是O(n2)得。
就本题来说已经可以接受了。
但如果规模再大一点,怎么办呢?我们能不能做得更好呢?
答案是能!我们还有一个很重要的信息没有利用到,对凸包上任意一条边,依次计算出凸包顶点到它的距离或投影距离,构成的序列总是一个先增再降的。
同时,注意到如果逆时针顺序枚举重合的边时,每次找出来的另外三点也总是在向逆时针方向移动。
由此,我们就得到了一个更加高效的算法。
枚举过程中,逆时针旋转到下一条边后不需要再重新扫描所有点,只要分别从上一条边确定的三点出发,向后比较,找到最大值,来更新这三个点即可。
在枚举过程中,三个点的指针都只会对每个顶点访问一次,所以这个过程的平摊复杂度是O (n)的。
结合前面计算凸包的过程,在O(n log n)的时间内我们就能够圆满地解决这题了。
了解到最小矩形所具有的这两个性质后,我们就能够很容易的想到一种算法,枚举凸包上哪条边与矩形的边重合,再找出在这条直线投影的正负方向上最远的和到直线距离最远的三点,从而确定和计算出矩形的面积,最后选取最小值,即为覆盖凸包的最小矩形的面积。