def polar_angle_key(pole: Point) -> Callable[[Point], T]:
...
# points = [(x1, y1), (x2, y2), ...]
# pole = (px, py)
sorted_points = sort(points, key=polar_angle_key(pole))
def orientation(o, p, q):
return (p[0] - o[0]) * (q[1] - o[1]) - (p[1] - o[1]) * (q[0] - o[0])
def polar_angle_key(o):
def _comp(p, q):
if (p <= o) != (q <= o):
return -1 if p < q else 1
return -orientation(o, p, q)
return functools.cmp_to_key(_comp)
def polar_angle_key(pole=(0, 0)):
def _key_func(p):
x, y = p[0] - ox, p[1] - oy
if y == 0:
if x == 0:
return (-2, 0)
return (0, 0) if x > 0 else (2, 0)
else:
sign = -1 if y < 0 else 1
return (sign, -x / y)
ox, oy = pole
return _key_func
def polar_angle_key(pole=(0, 0)):
def _key_func(p):
x, y = p[0] - ox, p[1] - oy
if y == 0:
if x == 0:
return -lim * 2
return 0 if x > 0 else lim * 2
else:
return -(x << 32) // y + (-lim if y < 0 else lim)
lim = 1 << 65
ox, oy = pole
return _key_func
def polar_angle_key(pole=(0, 0)):
def _key_func(p):
x, y = p[0] - ox, p[1] - oy
return -INF if y == 0 else -x / y
ox, oy = pole
return _key_func