📜  计算机图形学中点圆算法

📅  最后修改于: 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);
    }
}

输出: