c++ - 沿光栅化圆弧遍历像素

标签 c++ algorithm math geometry rasterizing

我想遍历光栅化圆弧上的像素,给定它的半径、以弧度为单位的开始和结束角度,例如:

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 的实心圆盘/圆,并且没有像素会被访问两次.

我认为Bresenham's circle algorithm由于角度限制和访问顺序,不直接适用于此问题。

在 stackoverflow 中,我认为这是最密切相关的问题:

最后,OpenCV 在精神上有类似/相关的东西,但仅限于线条:

enter image description here

最佳答案

看看cvLinearPolar() .

它将图像从 x,y 坐标系映射到极坐标。生成的图像是行 -> 角度和列 -> 半径。那时您的栅格化将是循环行列顺序,没有特殊的功能性栅格化。

这意味着每一行都是 dtheta = 2*Pi/(rowNum) 因此你的弧会 是 startAngle = angle1/dtheta 并且同样是 endAngle = angle2/dtheta

同样,您的半径计算 drad = maxRad/(columnNum)

所以要从极 map 像中获取弧线:

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];
 }

}

关于c++ - 沿光栅化圆弧遍历像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46823114/

相关文章:

Java:数学线设计

c++ - Meson 选择了错误的编译器(GCC 而不是 clang)

C++:纯虚函数 f 的参数 x 是否可以在 f 的派生类实现中替换为 x 的子类型?

c++ - OpenCV phaseCorrelate用法

algorithm - 哪些算法可以应用于 Duchess(像国际象棋这样的棋盘游戏)

algorithm - 如何实现位向量(bitset)(Java)?

c++ - Windows 身份验证 token C++

c++ - 给定条件下长度 N 个数内的所有可能序列

math - Octave:哪种方法更有效

math - 如何评估matlab中函数的导数?