Итерировать по пикселям вдоль растеризованной дуги окружности

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

template<typename Functor>
void arc(float startRadians, float endRadians, int radius, Functor f);

Быть использованным как:

arc(0.f, M_PI, 10, [](int x, int y) {
std::cout << "got: " << x << " " << y << "\n";
});

Есть несколько уловов:

  • пиксели имеют целочисленные координаты
  • radius также дается как целое число
  • растеризованная дуга — это фактически каждый пиксель в секторе между дугой радиуса radius и дуга радиуса radius-1

На картинке ниже:

  • посещены синие пиксели, следующий — красный пиксель
  • дуга ограничена двумя радиальными линиями, определяемыми начальным / конечным углами, и сектором между двумя дугами radius, radius-1,
  • наконец, если бы нарисовать каждую дугу с радиусом от 0 до 100, углы от 0 до 2 * PI, то мы получили бы заполненный диск / круг радиуса 100 и ни один пиксель не будет посещен дважды.

Я думаю Алгоритм круга Брезенхэма не относится напрямую к этой проблеме из-за ограничений по углу и порядка посещения.

Я полагаю, что в stackoverflow это наиболее тесно связанный вопрос:

Наконец, OpenCV имеет нечто похожее / родственное по духу, но только для строк:

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

2

Решение

Взгляни на cvLinearPolar().

Он отображает изображение из системы координат x, y в полярную. Результирующее изображение представляет собой строки -> угол и столбцы -> радиус. Ваш растр в этой точке будет цикличным порядком столбцов строк без специального функционального растеризации.

Это означает, что каждый ряд dtheta = 2*Pi/(rowNum) поэтому ваша дуга будет
быть startAngle = angle1/dtheta и аналогично endAngle = angle2/dtheta,

Точно так же ваш радиус расчета drad = maxRad/(columnNum),

Итак, чтобы получить вашу дугу от полярного изображения:

for(int i = maxRad; i > 0; i--) // start at longest radius spiral in
{
for(int j = startAngle; j < endAngle;j++) angle
{
// do action on polarImage[i,j];
}

}
0

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

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

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