沿光栅化圆弧

时间:2017-10-19 05:02:59

标签: 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
  • 的弧之间的扇区中的每个像素

在下图中:

  • 已访问蓝色像素,红色像素是下次访问
  • 弧由开始/结束角度定义的两条径向线以及两条弧radiusradius-1之间的扇区限制。
  • 最后,如果要绘制每个半径为0到100的弧,角度为0到2 * PI,那么我们将得到一个半径为100的填充圆盘/圆圈,将无法访问两次像素

我认为Bresenham's circle algorithm并不直接适用于这个问题,因为角度约束和访问顺序。

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

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

enter image description here

1 个答案:

答案 0 :(得分:0)

看看cvLinearPolar()

它将x,y坐标系中的图像映射到极地。得到的图像是行 - &gt;角度和列 - &gt;半径。那时你的光栅就是循环行列顺序没有特殊的功能光栅。

这意味着每一行都是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];
 }

}
相关问题