旋转卡壳——最薄横截带

最薄横截带

考虑下述设备放置问题:一个“消费群体群”的集合是以个体呈现为平面上凸多边形的一个家庭 F 给出的。 我们的目标是找到一个“设备”, 一条平面上的直线, 使得线到消费者的最大距离最小。

最后一点需要澄清。 直线与任何一个多边形的距离都是指多边形上一点到线的正交距离的最小值。 因此,每个多边形到线的距离是唯一的。
现在, 给定家庭中各个呈多边形的成员和平面上的一条直线, 每个多边形都有一个到线的距离。 因此, 对于整个家庭存在一个最大的线-多边形距离。 这个距离同时依赖于线与各个家庭成员多边形。
这个问题的目标是: 给定一个特定的家庭成员多边形集, 找到使得这个最大距离最小的线。 这个问题同样存在着其他版本, 常见的有找一条线使得距离和最小, 或是使得多边形带权距离和最小。

这里的提出的结论是Robert和Toussaint在1990年发表的。
主问题等价于找到一个宽最小的带(一个平面上由两条平行线为边界的区域)和所有的家庭成员多边形相交。因此, 带的中心(与带的边界线平行等距的线)就是所求的使得最大距离最小的线。

为了讨论这个问题我们做如下定义:

平面上的一条直线 l , 其方程为 ax + by + c = 0 (且 b > 0 或 a = -1)将平面分为两个区域:上半平面 Hu( l) 中的点 p = ( px, py) 满足 apx + apy + c >= 0 , 且下半平面 Hl( l) 中的点 p = ( px, py) 满足 apx + apy + c <= 0 。
通过上面的定义, 如果线是铅直的, 上半平面为 x 轴的负方向。

进一步地, 一个带可以定义为一条线的上半平面和另一条(平行)线的下半平面的交集。

给定一个凸多边形 P , 一个方向角 theta , 下切线 tl( P, theta) 是一条与 x 轴正半轴夹角为 theta 的线, 他与 P 相交并且 Ptl( P, theta) 的上半平面。 交点(可能不止一个)称为下顶点。
同样的, 定义上切线和上顶点。
给定一个家庭的多边形集合和一个固定的方向角, 就确定了一个下顶点集和上顶点集。

最后, 考虑下面的结论:
给定家庭 F 的多边形集, 和一个方向角 theta , 一个带 S (由 Hu( l1) 和 Hl( l2) 大于0的交集得到)是 F (在此方向上)最小宽度带, 当且仅当 F 中存在两个多边形 PQ
  • PHu(l1) 的交在 l1 上。
  • QHl(l2) 的交在 l2 上。

其主要的结论是: 一个家庭 F 的凸多边形集的最小宽度带(一个给定方向 theta 上)由 l1 和 l2 确定当
l1= tl( CH( UP( F, theta)), theta) 且
l2= tu( CH( LP( F, theta)), theta) 成立。 

一个家庭的凸多边形集, 以及给定角度上的最小带宽。 下顶点和上顶点的凸包, 上述的结论如图所示。 注意到两个多边形和带的交都只在一个顶点上出现。


因此, 只要确定了家庭多边形集的下顶点和上顶点的序列, 就能通过计算凸包得到给定方向上最小宽度带。就如Robert和Toussaint解释的, 幸运的是这些凸包不需要每次都完全重新计算: 他们需要更新即可。 实际上, 考虑两个接近的方向:许多(或者是全部)多边形对于这两个方向拥有相同的上顶点和下顶点。 这个结果同样暗示这只有有限的方向上(当下顶点或上顶点变化时)需要检测。

这里的焦点在于旋转卡壳模型, 而非关系到算法的细节。 本文打算利用旋转卡壳来计算多边形的上顶点和下顶点。下面是算法的主要实现过程。 给定一个凸多边形 P
  1. 找到拥有最小和最大 y 坐标的顶点。 标记为 pq 并且通过他们构造水平切线。
  2. 逆时针将切线旋转过 theta 角直到其中一条与其中一个多边形的边平行。
  3. 如果顶点在 p 后被击出(按照逆时针方向), 那么 p 就是对于角度0(包括)到角度 theta(不包括) 之间的下顶点。 如果顶点是在 q 后被击出, 那么 q 就是同样角度范围内的上顶点。 这两个情况当边平行的时候也可能同时发生。
  4. 更新当前点为新击出的顶点, 并更新当前角度。
  5. 重复执行步骤2到步骤4, 同时跟新角度区间, 知道新的角度大等于180度(在哪一点先回到了最初的位置, 但此时次序颠倒)。

线与其中一个多边形的一条边平行的方向称之为 临界方向 。 他们只在上顶点和下顶点处发生变化。 对于一个临界方向, 因为线穿过两个顶点, 当逆时针旋转时下顶点或是上顶点之一被定义为多边形与线的一个交点。

一旦临界方向(按照顺序给出)得到, 一个带就能在第一个方向上进行计算。 然后, 在第二个临界方向上, 至少一个上顶点或是下顶点被更新。 因此, 凸包此时需要更新, 而非重新计算一次。 一旦完成上述步骤, 新的带就构造成功了, 并且他的宽度(边界间的正交距离)被算出。 对所有临界方向重复这个操作。 注意到如果任何点处如果产生了一个宽度为0的带f, 这个过程就能够因为找到一条穿过所有家庭多边形的线而终止了。

对于完整的算法描述, 正确性讨论和运行时间分析, 见作者的论文:

J.-M. Robert, G.T. Toussaint. Computational geometry and facility location. Proc. Internatioanl Conf. on Operations Research and Management Science, Manila, The Philippines, Dec. 11-15, 1990. pp B-1 to B-19.

 

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

 

转载请注明出处,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值