Например, вот форма предполагаемой спирали (и каждый шаг итерации)
y
|
|
16 15 14 13 12
17 4 3 2 11
-- 18 5 0 1 10 --- x
19 6 7 8 9
20 21 22 23 24
|
|
Если линии представляют собой оси x и y.
Здесь будут фактические значения, которые алгоритм "возвращал" с каждой итерацией (координаты точек):
[0,0],
[1,0], [1,1], [0,1], [-1,1], [-1,0], [-1,-1], [0,-1], [1,-1],
[2,-1], [2,0], [2,1], [2,2], [1,2], [0,2], [-1,2], [-2,2], [-2,1], [-2,0]..
и др.
Я пробовал поиск, но я не совсем уверен, что искать точно, и какие поисковые запросы, которые я пробовал, приходят с тупиками.
Я даже не знаю, с чего начать, кроме чего-то грязного и неэлегантного и ad-hoc, например создания/кодирования новой спирали для каждого слоя.
Кто-нибудь может помочь мне начать?
Кроме того, есть ли способ, который может легко переключаться между по часовой стрелкой и против часовой стрелки (ориентация) и с какого направления "запускать" спираль? (вращение)
Кроме того, есть ли способ сделать это рекурсивно?
Мое приложение
У меня есть разреженная сетка, заполненная точками данных, и я хочу добавить новую точку данных в сетку, и пусть она будет "как можно ближе" к данной другой точке.
Чтобы сделать это, я назову grid.find_closest_available_point_to(point)
, который будет перебирать по приведенной выше спирали и возвращать первую позицию, которая пуста и доступна.
Итак, сначала проверьте point+[0,0]
(просто ради полноты). Затем он проверит point+[1,0]
. Затем он проверит point+[1,1]
. Затем point+[0,1]
и т.д. И верните первый, для которого позиция в сетке пуста (или не занята уже точкой данных).
Верхняя граница размера сетки отсутствует.