栅格化圆环/ dougnut的算法

时间:2017-01-13 08:40:48

标签: algorithm graphics 2d geometry rasterizing

我想将2d甜甜圈光栅化为矩阵/像素(结果应该是一个填充的甜甜圈)。

甜甜圈由r1,r2,x0,y0定义。

我怀疑最佳解决方案是Bresenham算法的一些功能https://en.wikipedia.org/wiki/Midpoint_circle_algorithm

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

是的,可以用Bresenham圈或Midpoint算法填充甜甜圈。

开始第一象限的内圈和外圈的平行步行。当Y改变时建立水平段。当达到顶部并且继续外部圆圈时,停止走向内圈。

请注意,您必须记住第一个(最大)外部X值,但是必须记住同一个Y的最后一个(最小)内部X值。

答案 1 :(得分:0)

Bresenham现在远非最佳......如何利用循环方程:

(x-x0)^2 + (x-y0)^2 = r^2

所以让我们:

x0,y0 - center
r1 - outer radius
r2 - inner radius
r1<=r2
xs,ys - screen resolution
scr[ys][xy] - screen matrix
C ++ 中的

看起来像这样:

int x,y,xx,yy,rr,rr1=r1*r1,rr2=r2*r2;
for (y=y0-r1;y<=y0+r1;y++)                  // loop all y positions
 if ((y>=0)&&(y<ys))                        // clip to screen
  for (yy=y-y0,yy*=yy,x=x0-r1;x<=x0+r1;x++) // loop all x positions
   if ((x>=0)&&(x<xs))                      // clip to screen
    {
    xx=x-x0; xx*=xx; rr=xx+yy;
    if ((rr>=rr2)&&(rr<=rr1))               // is in between radiuses?
     scr[y][x]=fill_color;
    }

您可以通过预先计算屏幕内两个循环的边界来轻松删除屏幕剪辑if语句...

对于填充圆圈来说,这种方法通常比Bresenham更快,更不用说易于并行了。