旋转卡壳——凸多边形的宽度

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

凸多边形的宽度定义为平行切线间的最小距离。 这个定义从宽度这个词中已经略有体现。 虽然凸多边形的切线有不同的方向, 并且每个方向上的宽度(通常)是不同的。 但幸运的是, 不是每个方向上都必须被检测。 


    我们假设存在一个线段 [ a,b ], 以及两条通过  a  和  b  的平行线。 通过绕着这两个点旋转这两条线, 使他们之间的距离递增或递减。 特别的, 总存在一个  特定旋转方向  使得两条线之间的距离通过旋转变小。 

    这个简单的结论可以被应用于宽度的问题中: 不是所有的方向都需要考虑。 假设给定一个多边形, 同时还有两条平行切线。 如果他们都未与边重合, 那么我们总能通过旋转来减小他们之间的距离。 因此, 两条平行切线只有在其中至少一条与边重合的情况下才可能确定多边形的宽度。 

    这就意味着 “对踵点 点-边” 以及 “边-边” 对需要在计算宽度过程中被考虑。 

 

一个凸多边形宽度的示意图。 直径对如图由平行切线(红线)穿过的黑点所示。 直径如高亮的淡蓝色线所示。


    一个与计算 直径 问题非常相似的算法可以通过遍历多边形对踵点对列表得到, 确定顶点-边以及边-边对来计算宽度。 选择过程如下:
  1. 计算多边形 y 方向上的端点。 我们称之为 ymin 和 ymax
  2. 通过 ymin 和 ymax 构造两条水平切线。如果一条(或者两条)线与边重合, 那么一个“对踵点 点-边”对或者“边-边”对已经确立了。 此时, 计算两线间的距离, 并且存为当前最小距离。
  3. 同时旋转两条线直到其中一条与多边形的一条边重合。
  4. 一个新的“对踵点 点-边”对(或者当两条线都与边重合,“边-边”对)此时产生。 计算新的距离, 并和当前最小值比较, 小于当前最小值则更新。
  5. 重复步骤3和步骤4(卡壳)的过程直到再次达到最初平行边的位置。
  6. 将获得的最小值的对作为确定宽度的对输出。

    更为直观的算法再次因为需要引进角度的计算而体现出其不足。 然而, 就如在凸多边形间最大距离问题中一样, 有时候更为简单、直观的旋转卡壳算法必须被引入计算。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值