现在的位置: 首页 > 综合 > 正文

旋转卡壳—凸多边形间最小距离

2013年09月16日 ⁄ 综合 ⁄ 共 1363字 ⁄ 字号 评论关闭

 

       给定两个不相连(也就是不相交)的凸多边形 P 和 Q, 目标是找到它们之间的最小距离的点对 (p,q) (p 属于 P 且 q 属于Q)。

      事实上, 多边形不相交十分重要, 因为我们所说的多边形包含其内部的所有点。 如果多边形相交, 那么最小距离就变得没有意义了。 然而, 这就是问题的另一方面, 凸多边形顶点对间最小距离在相交和非相交的情况中都存在。

      回到我们的主要问题: 直观的, 确定最小距离的点不可能包含所在多边形的内部。 与最大距离问题相似, 我们有以下结论:

      两个凸多边形 P 和 Q 之间的最小距离由多边形间的对踵点对确定。 在凸多边形间存在三种它们之间的对踵点对, 因此就有三种可能存在的最小距离模式:

                      1、“顶点-顶点”的情况

                  2、“顶点-边”的情况

                  3、“边-边”的情况

      换句话说, 确定最小距离的点对不一定必须是点。 下面的三个图例表明了以上结论: 

       通过上面的结论, 一个基于旋转卡壳的算法自然而然的产生了: 

       考虑下面的算法, 算法的输入是两个分别有 m 和 n 个顺时针给定顶点的凸多边形 P 和 Q。

                        1、计算 P 上 y 坐标值最小的顶点(称为 yminP ) 和 Q 上 y 坐标值最大的顶点(称为 ymaxQ)。

                        2、为多边形在 yminP 和 ymaxQ 处构造两条切线 LP 和 LQ 使得他们对应的多边形位于他们的右侧。 此时 LP和 LQ 拥有不同的方向, 并且 yminP 和 ymaxQ 成为了多边形间的一个对踵点对。

                        3、计算距离(yminP,ymaxQ) 并且将其维护为当前最小值。

                        4、顺时针同时旋转平行线直到其中一个与其所在的多边形的边重合。

                        5、如果只有一条线与边重合, 那么只需要计算“顶点-边”对踵点对和“顶点-顶点”对踵点对距离。 都将他们与当前最小值比较, 如果小于当前最小值则进行替换更新。 如果两条切线都与边重合, 那么情况就更加复杂了。 如果边“交叠”, 也就是可以构造一条与两条边都相交的公垂线(但不是在顶点处相交), 那么就计算“边-边”距离。 否则计算三个新的“顶点-顶点”对踵点对距离。 所有的这些距离都与当前最小值进行比较,
若小于当前最小值则更新替换。

                        6、重复执行步骤4和步骤5, 直到新的点对为(yminP,ymaxQ)。

                        7、输出最小距离。

       旋转卡壳模式保证了所有的对踵点对(和所有可能的子情况)都被考虑到。 此外, 整个算法拥有线性的时间复杂度, 因为(除了初始化), 只有与顶点数相同的操作需要执行。 

最小距离和最大距离的问题表明了旋转卡壳模型有不同的用法(与先前的直径和宽度问题比较)。 这个算法可以应用于两个多边形的问题中。

      “最小盒子”问题(最小面积的外接矩形)通过同一多边形上两个正交切线集合展示了另一种旋转卡壳的应用。

抱歉!评论已关闭.