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

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

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

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

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

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

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

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

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

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

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

0

Решение

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

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]