Поиск всех пикселей в пределах определенного диапазона в полярных координатах

Я хочу найти все пиксели изображения (в декартовых координатах), которые лежат в пределах определенного полярного диапазона, r_min r_max theta_min и theta_max. Другими словами, у меня есть некоторая кольцевая секция, определенная с параметрами, упомянутыми выше, и я хочу найти целые координаты x, y пикселей, которые лежат внутри нее. Решение грубой силы приходит к середине пути (просматривая все пиксели изображения и проверяя, находится ли оно внутри него), но мне интересно, есть ли для него какое-то более эффективное решение.

Спасибо


person user3847160    schedule 08.04.2015    source источник
comment
Какой язык? В зависимости от того, какой язык вы рассматриваете, подход грубой силы на самом деле может быть весьма эффективным.   -  person rayryeng    schedule 08.04.2015


Ответы (2)


В решении грубой силы вы можете сначала определить плотную ограничивающую рамку области, вычислив четыре вершины и включив четыре кардинальные крайние точки по мере необходимости. Затем для каждого пикселя вам нужно будет вычислить две окружности (квадратичные выражения) и две прямые линии (линейные выражения). Выполняя вычисления постепенно (X => X+1), количество операций уменьшается практически до нуля.

Внутри круга

f(X,Y) = X²+Y²-2XXc-2YYc+Xc²+Yc²-R² <= 0

Постепенно,

f(X+1,Y) = f(X,Y)+2X+1-2Xc <= 0

Если вы действительно хотите избежать этих накладных расходов, вы прибегнете к методам преобразования строки сканирования. Сначала подумайте о заполнении наклонного прямоугольника. Проведя две горизонтальные линии по промежуточным вершинам, вы разложите прямоугольник на два треугольника и параллелограмм. Тогда для любой линии сканирования, которая пересекает одну из этих фигур, вы заранее знаете, какую пару сторон вы пересечете. Оттуда вы знаете, какую часть строки сканирования вам нужно заполнить.

Вы можете обобщить любую форму, в частности, сегмент круга. Будьте готовы к относительно тонкому анализу случаев, но найти сами пересечения не так сложно. Это может помочь разделить домен вертикалью, проходящей через центр, чтобы любая горизонталь всегда встречалась с контуром дважды, а не четырежды. введите здесь описание изображения

person Yves Daoust    schedule 08.04.2015

Предположим, что центр сечения находится в точке 0,0 для простоты. Если нет, то это легко изменить, сместив все координаты.

Для каждой возможной координаты y от r_max до -r_max найдите координаты x окружности обоих радиусов: -sqrt(r*r-y*y) и sqrt(r*r-y*y). Каждая точка внутри круга r_max и за пределами круга r_min может быть частью сечения и потребует дальнейшего тестирования.

Теперь выполните те же вычисления координаты x, но на этот раз с отрезками, описываемыми углами. Вам понадобится некоторая условная логика, чтобы определить, какая сторона линии находится внутри, а какая снаружи, и влияет ли она на верхнюю или нижнюю часть раздела.

person Mark Ransom    schedule 08.04.2015