它基于以下功能, 用于测试任意点(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);
}}
【计算机图形中点圆算法】输出:
文章图片
推荐阅读
- 计算机图形(多项式方法)
- 布雷森汉姆的循环算法
- 使用极坐标定义一个圆
- 使用多项式方法定义一个圆
- 计算机图形(定义一个圆)
- 计算机图形(布雷森汉姆线算法)
- 计算机图形DDA算法
- 计算机图形(扫描转换直线)
- 计算机图形: 扫描转换点