Цикл по реальной спирали на дискретной сетке
Цель состоит в том, чтобы найти ближайший пиксель с определенным значением. Чтобы сделать это, я хочу перебрать пиксель, начиная с ближайшего, с увеличением расстояния, пока не достигну пикселя, который соответствует моим требованиям (край сетки или желаемое значение).
Я считаю, что это не дубликат, хотя очень похожие вопросы уже появлялись раньше.
Цикл по спирали или другой спиральный ответ полезны, но они не приведут к точкам, упорядоченным по расстоянию до центра.
Джастин Л. фактически упоминает о своем заявлении, чтобы найти ближайшую точку, но не учитывает фактическое расстояние.
Например, алгоритм на этом изображении нашел бы [1, 1] перед [0, 1], хотя [0, 1] намного ближе (расстояние 1) по сравнению с [1, 1] (расстояние √2).
Я хотел бы получить очки, упорядоченные по расстоянию[1, 0] [0, 1] [-1, 0] [0, -1] [1, 1] ...
иначе это не было бы настоящей спиралью.
Этот ответ предполагает спираль с очень маленьким размером шага, но, поскольку я не знаю, как далеко я должен спирали, это звучит очень неэффективно.
Я надеюсь, что этот рисунок делает порядок чище.
1 ответ
Я бы не назвал это спиральной петлей, которую вы описываете. Спираль - это (связанный) путь. То, что вы ищете, не путь. В любом случае, я бы сделал следующее:
На шаге предварительной обработки добавьте все координаты сетки, включая их расстояние до центра, например,
std::vector
и отсортировать его по расстоянию до центра. Затем создайте таблицу индексов, сохранив смещение в сетке для каждой координаты.Во время выполнения используйте индексную таблицу, чтобы пройти через сетку.
Я не уверен, однако, если этот прагматичный подход - то, что вы ищете. Шаг 2, соответствующий времени выполнения, очень быстрый.