Source code for santa_helpers.neighbors
NEIGHBORS_4 = [
(0, -1), # noqa
(-1, 0), (1, 0), # noqa
(0, 1), # noqa
]
NEIGHBORS_8 = [
(-1, -1), (0, -1), (1, -1), # noqa
(-1, 0), (1, 0), # noqa
(-1, 1), (0, 1), (1, 1), # noqa
]
NEIGHBORS_N = {
4: NEIGHBORS_4,
8: NEIGHBORS_8,
}
[docs]def is_point_in_range(p, p_min=None, p_max=None) -> bool:
"""Check if point lays between two other points.
Args:
p: tuple (x, y)
p_min (optional): min border point
p_max (optional): max border point
Returns:
True if p_max >= p >= p_min
"""
if p_min is None and p_max is None:
return True
x, y = p
if p_min:
x_min, y_min = p_min
if x < x_min or y < y_min:
return False
if p_max:
x_max, y_max = p_max
if x > x_max or y > y_max:
return False
return True
[docs]def neighbors(p, n=4, p_min=None, p_max=None):
"""Point neighbor generator.
Args:
p: tuple (x, y)
n: int 4 (no diagonal) or 8 (with diagonal)
p_min (optional): min grid point, if not given infinite
p_max (optional): max grid point, if not given infinite
Yields:
point (x, y)
"""
neighbor_points = NEIGHBORS_N[n]
x, y = p
for dx, dy in neighbor_points:
new_p = (x + dx, y + dy)
if is_point_in_range(new_p, p_min, p_max):
yield new_p