旋转卡壳---凸包的宽度

 

       凸多边形的宽度被定义为平行切线间的最小距离。 这个定义在宽度这个词中已经给出了暗示。 然而,凸多边形的切线允许有任意的方向, 并且对于每个方向上的宽度(通常)是不同的。 但幸运的是, 不是每个方向上都必须被检测。 

 

        我们设一个线段 [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、付费专栏及课程。

余额充值