计算机图形中点圆算法

它基于以下功能, 用于测试任意点(x, y)与以原点为中心的半径r的圆之间的空间关系:

计算机图形中点圆算法

文章图片
计算机图形中点圆算法

文章图片
现在, 考虑像素T和像素S之间的中间点的坐标
这称为中点(xi + 1, yi-), 我们用它来定义决策参数:
Pi=f (xi+1, yi-) = (xi+1)2+(yi-)2-r2 … … … … … equation 2
如果Pi是-ve?中点在圆内, 我们选择像素T
如果Pi是+ ve?中点在圆之外(或在圆上), 我们选择像素S。
下一步的决策参数是:
Pi+1=(xi+1+1)2+(yi+1-)2- r2… … … … equation 3
由于xi + 1 = xi + 1, 我们有
计算机图形中点圆算法

文章图片
如果选择像素T?Pi< 0
我们有yi + 1 = yi
如果选择像素S?Pi≥0
我们有yi + 1 = yi-1
计算机图形中点圆算法

文章图片
我们可以继续用(xi, yi)的n来简化它, 得到
计算机图形中点圆算法

文章图片
现在, 由等式2得出的Pi(0, r)的初始值
计算机图形中点圆算法

文章图片
我们可以把?1∴r是一个整数所以, P1 = 1-r
算法 步骤1:将x = 0, y = r代入等式2中, 我们有p = 1-r
步骤2:在x≤y的情况下重复步骤x(y, y)如果(p < 0)然后设置p = p + 2x + 3其他p = p + 2(xy)+5 y = y-1(如果结束)x = x + 1(结束循环)
第三步:结束
程序使用中点算法绘制圆:
#include < graphics.h> #include < stdlib.h> #include < math.h> #include < stdio.h> #include < conio.h> #include < iostream.h> class bresen{ float x, y, a, b, r, p; public: void get (); void cal (); }; void main (){ bresen b; b.get (); b.cal (); getch (); } Void bresen :: get (){ cout< < "ENTER CENTER AND RADIUS"; cout< < "ENTER (a, b)"; cin> > a> > b; cout< < "ENTER r"; cin> > r; }void bresen ::cal (){ /* request auto detection */ int gdriver = DETECT, gmode, errorcode; int midx, midy, i; /* initialize graphics and local variables */ initgraph (& gdriver, & gmode, " "); /* read result of initialization */ errorcode = graphresult (); if (errorcode ! = grOK)/*an error occurred */ {printf("Graphics error: %s \n", grapherrormsg (errorcode); printf ("Press any key to halt:"); getch (); exit (1); /* terminate with an error code */ } x=0; y=r; putpixel (a, b+r, RED); putpixel (a, b-r, RED); putpixel (a-r, b, RED); putpixel (a+r, b, RED); p=5/4)-r; while (x< =y) {If (p< 0)p+= (4*x)+6; else{p+=(2*(x-y))+5; y--; }x++; putpixel (a+x, b+y, RED); putpixel (a-x, b+y, RED); putpixel (a+x, b-y, RED); putpixel (a+x, b-y, RED); putpixel (a+x, b+y, RED); putpixel (a+x, b-y, RED); putpixel (a-x, b+y, RED); putpixel (a-x, b-y, RED); }}

【计算机图形中点圆算法】输出:
计算机图形中点圆算法

文章图片

    推荐阅读