Алгоритм итерации по внешней спирали на дискретной двумерной сетке от начала координат - PullRequest
29 голосов
/ 14 сентября 2010

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

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

Верхняя граница размера сетки отсутствует.

Ответы [ 11 ]

0 голосов
/ 14 сентября 2010

Попробуйте поискать либо параметрические, либо полярные уравнения. Оба подходят для построения спиральных вещей. Вот страница с множеством примеров, с картинками (и уравнениями). Это должно дать вам еще несколько идей о том, что искать.

...