我已经实施了“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
如果我对圆圈进行不同的着色,我最终会得到水平带状条纹,而不是实际填充的圆圈 - 我的做法显然是错误的,但我不确定如何修复它。
答案 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 )
所有这些线都是水平的,所有八个点都是开始和结束。完成后,整个圆圈将被填充,没有不必要的重绘(除了可能是最后两行的双重绘制)。
水平或垂直的选择可能完全是任意的,但如果底层图形系统在一个方向上绘制的线条比另一个方向更快,则可能会有所不同。