旋转卡壳——凸多边形最小周长外接矩形

来源:互联网 发布:java8 base64源码 编辑:程序博客网 时间:2024/04/28 16:26

出处:http://blog.csdn.net/acmaker/article/details/3188177

凸多边形最小周长外接矩形

这个问题和最小面积外接矩形相似。 我们的目标是找到一个最小盒子(就周长而言)外接多边形 P 。 

有趣的是通常情况下最小面积的和最小周长的外接矩形是重合的。 有人不禁想问这是不是总成立的。 下面的例子回答了这个问题: 多边形(灰色的)及其最小面积外接矩形(左边的)和最小周长外接矩形(右边的)。 

 


现在, 给定一个方向, 我们可以算出 P 的端点, 以此来确定一个外接矩形。 但是, 就如同面积问题中一样, 由于有下面的结论, 我们不必检测每个状态来获得拥有最小周长的矩形: 

凸多边形 P 的最小周长外接矩形存在一条边和多边形的一条边重合。 

这个结论通过枚举多边形的一条重合边有力地限制了矩形的可能范围。 

 

图示上述结论: 四条切线(红色), 其中一条与多边形边重合, 确定了外接矩形(蓝色)。


因为与其面积问题相当, 这个问题可以通过一个基于旋转卡壳的相似的算法来解决。 
下属算法的输入是顺时针顺序给定的一个凸多边形的 n 个顶点。 

  1. 计算全部四个多边形的端点, 称之为 xminP, xmaxP, yminP, ymaxP
  2. 通过四个点构造 P 的四条切线。 他们确定了两个“卡壳”集合。
  3. 如果一条(或两条)线与一条边重合, 那么计算由四条线决定的矩形的面积, 并且保存为当前最小值。 否则将当前最小值定义为无穷大。
  4. 顺时针旋转线直到其中一条和多边形的一条边重合。
  5. 计算新矩形的周长, 并且和当前最小值比较。 如果小于当前最小值则更新, 并保存确定最小值的矩形信息。 
  6. 重复步骤4和步骤5, 直到线旋转过的角度大于90度。
  7. 输出外接矩形的最小周长。

因为两对的“卡壳”确定了一个外接矩形, 这个算法考虑到了所有可能算出最小周长的矩形。 进一步, 除了初始值外, 算法的主循环只需要执行顶点总数多次。 因此算法是线性时间复杂度的。 

问题处理同样包含三角形。 有两个特例, 具体参见洋葱三角剖分螺旋三角剖分

 

原文地址:http://cgm.cs.mcgill.ca/~orm/mper.html

原创粉丝点击