gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:58 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com