与Bresenham直线生成算法一样,若点S离实际点更近,则取S点,否则取T点,
但点离x轴越近则越稀疏,因此我们先画第一象限的上八分之一个圆,最后根据对称画出一个圆。
将圆心平移到原点,设x=0,y=R
则为(1,R),为(1,R-1),
设为,则取下一点
则:
假设,则取点S作为下一点,即 ,
且
则:
假设,则取T作为下一点,即
且:
则:
即得到的递归式:
void f(int x, int y, int r)
{
int tx = x, ty = y;
x = 0, y = r;
int d = 3 - 2 * r;
glBegin(GL_POINTS);
while (x < y)
{
glVertex2i(x + tx, y + ty);//x,y
glVertex2i(y + tx, x + ty);//y,x
glVertex2i(-x + tx, y + ty);//-x,y
glVertex2i(-y + tx,x + ty);//-y,x
glVertex2i(-y + tx, -x + ty);//-y,-x
glVertex2i(-x + tx, -y + ty);//-x,-y
glVertex2i(x + tx, -y + ty);//x,-y
glVertex2i(y + tx, -x + ty);//y,-x
if (d < 0)
d = d + 4 * x + 6;
else {
d = d + 4 * (x - y) + 10;
y--;
}
x++;
if (x == y)
{
glVertex2i(x + tx, y + ty);//x,y
glVertex2i(-x + tx, y + ty);//-x,y
glVertex2i(-x + tx, -y + ty);//-x,-y
glVertex2i(x + tx, -y + ty);//x,-y
}
}
glEnd();
}
圆的生成算法算是挺简单的,主要是理解了递归公式,就可以有效的画出一个圆形。