OFFSET
1,13
EXAMPLE
Path begins:
25--24--23--22--21--20--19 Y=3
| |
26 9--10--11--12--13 18 Y=2
| | | |
27 8 5---4---3 14 17 Y=1
| | | | | |
28 7---6 1---2 15--16 Y=0
----------------------------
X = -3 -2 -1 0 1 2 3
The map starts: (0, 0), (1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0), (-2, 0), (-2, 1), (-2, 2), (-1, 2), (0, 2), (1, 2), (2, 2), (2, 1), (2, 0), (3, 0), (3, 1), (3, 2), (3, 3), (2, 3), (1, 3), (0, 3), (-1, 3), (-2, 3), (-3, 3), (-3, 2), (-3, 1), (-3, 0), (-4, 0), (-4, 1), (-4, 2), (-4, 3), (-4, 4), (-3, 4), (-2, 4), ...
The enumeration can be seen as shells growing around the origin:
(0, 0);
(1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0);
(-2, 0), (-2, 1), (-2, 2), (-1, 2), (0, 2), (1, 2), (2, 2), (2, 1), (2, 0);
(3, 0), (3, 1), (3, 2), (3, 3), (2, 3), (1, 3), (0, 3), (-1, 3), (-2, 3), (-3, 3), (-3, 2), (-3, 1), (-3, 0);
PROG
(Python)
from itertools import chain
def traverse_upper_halfplane(n):
points = [(0, 0)]
arch = 1
sign = 1
while len(points) < n:
for y in range(arch+1):
points.append((sign*arch, y))
for x in range(arch-1, -arch-1, -1):
points.append((sign*x, arch))
for y in range(arch-1, -1, -1):
points.append((-sign*arch, y))
arch += 1
sign = - sign
return points[:n]
print(list(chain(*traverse_upper_halfplane(100))))
CROSSREFS
KEYWORD
sign
AUTHOR
Jens Ahlström, Oct 20 2025
STATUS
approved
