Например, вот форма предполагаемой спирали (и каждого шага итерации)
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]
(просто ради полноты). Тогда он проверит point+[1,0]
. Тогда он проверит point+[1,1]
. Затем point+[0,1]
и т. Д. И верните первое, для которого позиция в сетке пуста (или уже не занята точкой данных).
Верхняя граница размера сетки отсутствует.