圆的生成算法

与Bresenham直线生成算法一样,若点S离实际点更近,则取S点,否则取T点,

但点离x轴越近则越稀疏,因此我们先画第一象限的上八分之一个圆,最后根据对称画出一个圆。

将圆心平移到原点,设x=0,y=R

S_1为(1,R),T_1为(1,R-1),

     d_1=(1^2+R^2-R^2)+[1^2+(R-1)^2-R^2]=3-2R

p_i_-_1(x_i_-_1,y_i_-_1),则取下一点

    S_i(x_i_-_1+1,y_i_-1),T_i(x_i_-_1+1,y_i_-_1-1)

则:d_i=[(x_i_-_1+1)^2+y_i_-_1^2-R^2]+[(x_i_-_1+1)^2+(y_i_-_1-1)^2-R^2]

假设d_i<0,则取点S作为下一点,即    P_i(x_i_-_1,y_i_-_1)

S_i_+1=(x_i_-_1+2,y_i_-_1),T_i_+_1=(x_i_-_1+2,y_i_-_1-1)

则:d_i_+_1=[(x_i_-1+2)^2+(y_i_-_1)^2-R^2]+[(x_i_-_1+2)^2+(y_i_-_1-1)^2-R^2]

       d_i_+_1=d_i+4x_i_-_1+6

假设d_i\geq 0,则取T作为下一点,即P_i(x_i_-_1+1,y_i_-_1-1)

且:S_i_+_1(x_i_-_1+2,y_i_-_1-1),T_i_+_1(x_i_-_1+2,y_i_-_1-2)

则:d_i_+_1=[(x_i_-_1+2)^2+(y_i_-_1-1)^2-R^2]+[(x_i_-_1+2)^2+(y_i_-_1-2)^2-R^2]

    d_i_+_1=d_i+4(x_i_-_1-y_i_-_1)+10

即得到d_i的递归式:

\left\{\begin{matrix} d_i_+_1=d_i+4x_i_-_1+6(d_i<0)\\ d_i_+_1=d_i+4(x_i_-_1-y_i_-_1)+10(d_i\geq 0)\\ d_1=3-2R\\ \end{matrix}\right.

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();
}

圆的生成算法算是挺简单的,主要是理解了递归公式,就可以有效的画出一个圆形。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值