Цикл по настоящей спирали на дискретной сетке

Цель состоит в том, чтобы найти ближайший пиксель с определенным значением. Для этого я хочу перебрать пиксель, начиная с ближайшего, с увеличением расстояния, пока я не достигну пикселя, который соответствует моим требованиям (край сетки или желаемое значение).

Я считаю, что это не дубликат, хотя очень похожие вопросы уже возникали раньше.

Зацикливание по спирали или другое спиральный ответ полезны, но они не приводят к точкам, упорядоченным по расстоянию до центра.

Джастин Л. фактически упоминает свое приложение для поиска ближайшей точки, но упускает из виду фактическое расстояние.

Например, алгоритм на этом изображении найдет [1, 1] перед [0, 1], хотя [0, 1] намного ближе (расстояние 1) по сравнению с [1, 1] (расстояние √2).

введите описание изображения здесь

Я бы хотел получить точки, упорядоченные по расстоянию [1, 0] [0, 1] [-1, 0] [0, -1] [1, 1] ..., иначе это не было бы настоящей спиралью.

Этот ответ предлагает спиральное движение с очень маленьким размером шага, но, поскольку я не знаю, как далеко мне нужно закручивать, это звучит очень неэффективно.

Я надеюсь, что этот рисунок проясняет порядок.

введите описание изображения здесь


person Leander    schedule 05.12.2017    source источник


Ответы (1)


Я бы не назвал это спиральной петлей, которую вы описываете. Спираль - это (связный) путь. То, что вы ищете, - это не путь. В любом случае, я бы сделал следующее:

  1. На этапе предварительной обработки добавьте все координаты сетки, включая их расстояние до центра, например, в std::vector и отсортируйте его по расстоянию до центра. Затем создайте индексную таблицу, сохранив смещение в сетке для каждой координаты.

  2. Во время выполнения используйте индексную таблицу для обхода сетки.

Я не уверен, что этот прагматический подход - это то, что вам нужно. Шаг 2, релевантный для среды выполнения, несомненно, выполняется быстро.

person Pedro    schedule 05.12.2017
comment
Я не мог найти лучшего метода. В итоге я сохранил расстояния в файле, потому что расчет на сетке 2048x2048 был довольно медленным. - person Leander; 08.05.2018