Алгоритм для итерации по внешней спирали на дискретной 2D-сетке от начала координат

Например, вот форма предполагаемой спирали (и каждый шаг итерации)

          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] и т. Д. И верните первую, для которой позиция в сетке пуста (или еще не занята точкой данных).

Нет верхней границы для размер сетки.

29
задан Justin L. 14 September 2010 в 06:22
поделиться