pointOnHull = leftmost point in S
i = 0
repeat
P[i] = pointOnHull
endpoint = S[0] // initial endpoint for a candidate edge on the hull
for j from 1 to |S|-1
if (endpoint == pointOnHull) or (S[j] is on left of line from P[i] to endpoint)
endpoint = S[j] // found greater left turn, update endpoint
i = i+1
pointOnHull = endpoint
until endpoint == P[0] // wrapped around to first hull point
你说得对:
^{pr2}$
还有这个:P[i] = pointOnHull
但我不确定的是:(S[j] is on left of line from P[i] to endpoint)
取而代之的是它与所有其他点所形成的角中最小的角。但是根据维基百科,你想要的是所有角度中最左边的角度。我有一些处理角度的代码:def normalizeangle(radians):
return divmod(radians, math.pi*2)[1]
def arclength(radians1, radians2 = 0):
radians1, radians2 = normalizeangle(radians1), normalizeangle(radians2)
return min(normalizeangle(radians1 - radians2), normalizeangle(radians2 - radians1))
def arcdir(radians1, radians2 = 0):
radians1, radians2 = normalizeangle(radians1), normalizeangle(radians2)
return cmp(normalizeangle(radians1 - radians2), normalizeangle(radians2 - radians1))
arcdir将告诉您某个角度是在另一个角度的左侧还是右侧,因此您可以使用它来查看某个角度是否更左,因此应该使用该角度。在
如果您沿着这些点移动,总是选择最左边的角度到下一个点,您将围绕多边形的周长再次到达起点(因为您选择了最左边的点,您知道它必须在周长上,并且会再次到达)