我想遍历光栅化圆弧上的像素,给定它的半径、以弧度为单位的开始和结束角度,例如:
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 在精神上有类似/相关的东西,但仅限于线条:
最佳答案
看看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/