在著名的“Introduction to Algorithms - 3rd edition”一书中,用于在 2D 空间中找到一组点的凸包的礼品包装算法被描述为需要:
- 2次运行分别找到凸包的左右链
- 相对于凸包的最后一段对极角进行排序
为了使用叉积技巧对极角进行排序并获得正确的结果。
但是,在我看来,只考虑凸包的最新点就足够了。这是我的方法(假设输入中没有 3 个共线点):
pLast = latest found point of the Convex Hull
<p1, p2, ..., pk> = points that are not (yet) in the Convex Hull
pNext = the next point of the Convex Hull (trying to find this)
pNext = p1
for i=2 to k
if (nonLeftTurn(pLast, pNext, pi) == true)
pNext = pi
如果 p3 位于定向线 p1->p2 的右侧,则 nonLeftTurn(p1, p2, p3) 返回 true:
nonLeftTurn(p1, p2, p3):
if ( (p2 - p1) x (p3 - p1) <= 0)
return true
else
return false
在我看来,这种方法是正确的。我错过了什么?您能否提供一个反例,因为我找不到。
谢谢!