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