📅  最后修改于: 2020-12-20 09:34:27             🧑  作者: Mango
它基于以下函数,用于测试任意点(x,y)与以原点为中心的半径r的圆之间的空间关系:
现在,考虑像素T和像素S之间的中间点的坐标
这称为中点(x i + 1 ,y i- ),然后使用它来定义决策参数:
P i = f(x i + 1 ,y i- )=(x i + 1 ) 2 +(y i- ) 2 -r 2 ……方程2
如果P i是-ve⟹中点在圆内,我们选择像素T
如果P i是+ ve⟹中点在圆之外(或在圆上),我们选择像素S。
下一步的决策参数是:
P i + 1 =(x i + 1 +1) 2 +(y i + 1- ) 2 -r 2 …………等式3
由于x i + 1 = x i + 1 ,我们有
如果像素T被choosen⟹P我<0
我们有y i + 1 = y i
如果像素S被choosen⟹P我≥0
我们有y i + 1 = y i -1
我们可以继续用(x i ,y i )n简化它,得到
现在,由等式2得出的P i (0,r)的初始值
我们可以放 ≅1
∴r是一个整数
因此,P 1 = 1-r
步骤1:将x = 0,y = r代入公式2
我们有p = 1-r
步骤2:在x≤y时重复步骤
绘图(x,y)
如果(p <0)
然后设置p = p + 2x + 3
其他
p = p + 2(xy)+5
y = y-1(如果结束)
x = x + 1(结束循环)
第三步:结束
#include
#include
#include
#include
#include
#include
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);
}
}
输出: