Skip to content

[mypy-fix] Type fixes for graham_scan #5589

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 26, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions other/graham_scan.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from sys import maxsize


def graham_scan(points: list[list[int, int]]) -> list[list[int, int]]:
def graham_scan(points: list[tuple[int, int]]) -> list[tuple[int, int]]:
"""Pure implementation of graham scan algorithm in Python

:param points: The unique points on coordinates.
Expand Down Expand Up @@ -57,7 +57,7 @@ def graham_scan(points: list[list[int, int]]) -> list[list[int, int]]:
# remove the lowest and the most left point from points for preparing for sort
points.pop(minidx)

def angle_comparer(point: list[int, int], minx: int, miny: int) -> float:
def angle_comparer(point: tuple[int, int], minx: int, miny: int) -> float:
"""Return the angle toward to point from (minx, miny)

:param point: The target point
Expand All @@ -66,13 +66,13 @@ def angle_comparer(point: list[int, int], minx: int, miny: int) -> float:
:return: the angle

Examples:
>>> angle_comparer([1,1], 0, 0)
>>> angle_comparer((1,1), 0, 0)
45.0

>>> angle_comparer([100,1], 10, 10)
>>> angle_comparer((100,1), 10, 10)
-5.710593137499642

>>> angle_comparer([5,5], 2, 3)
>>> angle_comparer((5,5), 2, 3)
33.690067525979785
"""
# sort the points accorgind to the angle from the lowest and the most left point
Expand All @@ -83,7 +83,7 @@ def angle_comparer(point: list[int, int], minx: int, miny: int) -> float:

sorted_points = sorted(points, key=lambda point: angle_comparer(point, minx, miny))
# This insert actually costs complexity,
# and you should insteadly add (minx, miny) into stack later.
# and you should instead add (minx, miny) into stack later.
# I'm using insert just for easy understanding.
sorted_points.insert(0, (minx, miny))

Expand All @@ -95,7 +95,7 @@ class Direction(Enum):
right = 3

def check_direction(
starting: list[int, int], via: list[int, int], target: list[int, int]
starting: tuple[int, int], via: tuple[int, int], target: tuple[int, int]
) -> Direction:
"""Return the direction toward to the line from via to target from starting

Expand All @@ -105,13 +105,13 @@ def check_direction(
:return: the Direction

Examples:
>>> check_direction([1,1], [2,2], [3,3])
>>> check_direction((1,1), (2,2), (3,3))
Direction.straight

>>> check_direction([60,1], [-50,199], [30,2])
>>> check_direction((60,1), (-50,199), (30,2))
Direction.left

>>> check_direction([0,0], [5,5], [10,0])
>>> check_direction((0,0), (5,5), (10,0))
Direction.right
"""
x0, y0 = starting
Expand All @@ -132,12 +132,12 @@ def check_direction(
# If they are same, it means they are on a same line of convex hull.
if target_angle > via_angle:
return Direction.left
if target_angle == via_angle:
elif target_angle == via_angle:
return Direction.straight
if target_angle < via_angle:
else:
return Direction.right

stack = deque()
stack: deque[tuple[int, int]] = deque()
stack.append(sorted_points[0])
stack.append(sorted_points[1])
stack.append(sorted_points[2])
Expand Down