我已经实现了“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
如果我对圆圈进行不同的着色,我最终会得到水平条纹而不是实际的实心圆圈 - 我的方法显然是错误的,但我不确定如何解决它。
最佳答案
我不确定,但是从眯着眼睛看你的算法,我期待最后一行看起来更像
plotLine(Point(p.x+x, p.y+x), Point(p.x+x, p.y+y));
(也就是说,从 p.x 向东北 45 度线开始,然后向上移动到您刚刚绘制的圆上的点)。
关于c++ - "Bresenham' s》圆圈算法填充题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607946/