Merge branch 'master' of gitfub.space:Pownie/BerGeo

This commit is contained in:
Casper 2018-09-20 15:45:18 +02:00
commit d0f75a4327

View File

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