“Bresenham的”圈算法填充问题

时间:2011-04-09 21:12:08

标签: c++ algorithm

我已经实施了“Bresenham”(中点)算法来绘制圆圈,一切顺利(C ++和OpenGL)。

我现在想知道是否可以使用相同的算法填充圆圈?

以下面的几个圆圈为例:http://imgur.com/S0Qy6使用以下算法绘制:

void circle(Point p, int r) {
int x = 0;
int y = r;
int f = 1-r;

// plot vert/horiz points indepedently

while (x<y) {
    x++;

    if (f<0) {
        f += 2*x+1;
    } else {
        y--;
        f += 2*(x-y+1);
    }

    glRecti(p.x+x, p.y+y, p.x+x+1, p.y+y+1);
    // plot other points using 8 way symmetry

    // attempt to fill the circle - didn't go well
    plotLine(Point(p.x, p.y+x), Point(p.x+x, p.y+x));

}

}

我认为填充位的最佳位置是在我的主循环中,因为我希望通过8向对称来再次填充每个象限。所以我添加了我的plotLine调用,但我最终得到的是一个奇怪的填充圆圈:http://imgur.com/jQW7B

如果我对圆圈进行不同的着色,我最终会得到水平带状条纹,而不是实际填充的圆圈 - 我的做法显然是错误的,但我不确定如何修复它。

2 个答案:

答案 0 :(得分:1)

我不确定,但是从眯着眼看你的算法,我期待最后一行看起来更像

plotLine(Point(p.x+x, p.y+x), Point(p.x+x, p.y+y));

(也就是说,从p.x的东北45度线开始,然后上升到你刚绘制的圆圈上的点)。

答案 1 :(得分:0)

我记得通常用水平线或垂直线填充它。

对于从Quadrant I到Quadrant II以及从Quadrant III到Quadrant IV(我选择水平线)的每次迭代都是如此。请注意,每次迭代都会得到总共四行。

( p.x+x, p.y+y ) to ( p.x-x, p.y+y )
( p.x+y, p.y+x ) to ( p.x-y, p.y+x )
( p.x+x, p.y-y ) to ( p.x-x, p.y-y )
( p.x+y, p.y-x ) to ( p.x-y, p.y-x )

所有这些线都是水平的,所有八个点都是开始和结束。完成后,整个圆圈将被填充,没有不必要的重绘(除了可能是最后两行的双重绘制)。


水平或垂直的选择可能完全是任意的,但如果底层图形系统在一个方向上绘制的线条比另一个方向更快,则可能会有所不同。