Например, вот форма предполагаемой спирали (и каждый шаг итерации)
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]..
и т. д.
Я пробовал искать, но не совсем уверен что именно искать, и какие поиски, которые я пробовал, зашли в тупик.
Я даже не уверен, с чего начать, кроме чего-то беспорядочного, неэлегантного и специального, например, создания / кодирования нового спираль для каждого слоя.
Кто-нибудь может помочь мне начать работу?
Кроме того, есть ли способ легко переключаться между часовой стрелкой и против часовой стрелки (ориентация), и в каком направлении "начинать" спираль? (вращение)
Кроме того, есть ли способ сделать это рекурсивно?
Мое приложение
У меня есть разреженная сетка, заполненная точками данных, и я хочу добавить новую точку данных в сетку, чтобы она была «как можно ближе» в заданную другую точку.
Для этого я вызываю grid.find_closest_available_point_to (point)
, который будет проходить по спирали, указанной выше, и возвращать первую пустую и доступную позицию.
Итак, сначала он проверит point + [0,0]
(просто для полноты). Затем он проверит точку + [1,0]
. Затем он проверит точку + [1,1]
. Затем точка + [0,1]
и т. Д. И верните первую, для которой позиция в сетке пуста (или еще не занята точкой данных).
Нет верхней границы для размер сетки.