fixed sidedness
This commit is contained in:
parent
69037ec771
commit
c363bb3901
|
@ -14,16 +14,19 @@ class Side(Enum):
|
|||
|
||||
def sidedness(p1, p2, p3, eps=0.0000001):
|
||||
|
||||
y = p1.y * (p3.x - p2.x)
|
||||
x = p1.x
|
||||
a = (p3.y - p2.y)
|
||||
b = p3.y * (p3.x - p2.x) - a * p3.x
|
||||
# Find line from p1 to p2, ask where p3 is in relation to this
|
||||
|
||||
if y - eps < a * x + b < y + eps:
|
||||
return Side.ON
|
||||
elif y > a * x + b:
|
||||
return Side.ABOVE
|
||||
return Side.BELOW
|
||||
y = p3.y * (p2.x - p1.x)
|
||||
x = p3.x
|
||||
|
||||
a = (p2.y - p1.y)
|
||||
b = p2.y * (p2.x - p1.x) - a * p2.x
|
||||
|
||||
if y - eps < a * x + b < y + eps:
|
||||
return Side.ON
|
||||
elif y > a * x + b:
|
||||
return Side.ABOVE
|
||||
return Side.BELOW
|
||||
|
||||
|
||||
# test
|
||||
|
@ -47,34 +50,34 @@ def genPoint():
|
|||
return p_i
|
||||
|
||||
|
||||
|
||||
def graham_scan(points):
|
||||
|
||||
# A funky issue where both a and b become negative in the sidedness test causes us to have to use
|
||||
# Side.ABOVE for both tests, regardless of UH or LH.
|
||||
# A funky issue where both a and b become negative in the sidedness test causes us to have to use
|
||||
# Side.ABOVE for both tests, regardless of UH or LH.
|
||||
|
||||
|
||||
sorted_points = sorted(points, key=lambda p: p.x)
|
||||
|
||||
UH = sorted_points[:2]
|
||||
#del sorted_points[0]
|
||||
sorted_points = sorted(points, key=lambda p: p.x)
|
||||
|
||||
for s in sorted_points[2:]:
|
||||
while len(UH) > 1 and (sidedness(UH[-2], UH[-1], s) != Side.ABOVE):
|
||||
del UH[-1]
|
||||
UH.append(s)
|
||||
reversed_list = list(reversed(sorted_points))
|
||||
reversed_list.append(UH[0])
|
||||
LH = reversed_list[:2]
|
||||
#del reversed_list[0]
|
||||
UH = sorted_points[:2]
|
||||
#del sorted_points[0]
|
||||
|
||||
for s in sorted_points[2:]:
|
||||
while len(UH) > 1 and (sidedness(UH[-2], UH[-1], s) != Side.ABOVE):
|
||||
del UH[-1]
|
||||
UH.append(s)
|
||||
|
||||
reversed_list = list(reversed(sorted_points))
|
||||
reversed_list.append(UH[0])
|
||||
LH = reversed_list[:2]
|
||||
#del reversed_list[0]
|
||||
|
||||
for s in reversed_list[2:]:
|
||||
while len(LH) > 1 and (sidedness(LH[-2], LH[-1], s) != Side.ABOVE):
|
||||
del LH[-1]
|
||||
LH.append(s)
|
||||
|
||||
return UH, LH
|
||||
|
||||
for s in reversed_list[2:]:
|
||||
while len(LH) > 1 and (sidedness(LH[-2], LH[-1], s) != Side.ABOVE):
|
||||
del LH[-1]
|
||||
LH.append(s)
|
||||
|
||||
return UH, LH
|
||||
|
||||
p = [genPoint() for _ in range(30)]
|
||||
UH, LH = graham_scan(p)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user