From c363bb39015c33f605fbe7e83767e97d74be321d Mon Sep 17 00:00:00 2001 From: Alexander Munch-Hansen Date: Thu, 20 Sep 2018 15:38:44 +0200 Subject: [PATCH] fixed sidedness --- h2/sidedness.py | 65 ++++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/h2/sidedness.py b/h2/sidedness.py index 0defecc..6943214 100644 --- a/h2/sidedness.py +++ b/h2/sidedness.py @@ -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)