圆的扫描转换算法

圆弧的扫描转换算法(转载:http://blog.chinaunix.net/uid-20702621-id-273412.html

(1)圆的特征

    圆被定义为到给定中心位置(xc,yc)距离为r的点集。圆心位于原点的圆有四条对称轴x=0,y=0,x=y和x=-y。若已知圆弧上一点(x,y),可以得到其关于四条对称轴的其它7个点,这种性质称为圆的八对称性。因此,只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集。

 

圆心在0,0点圆周生成时的对称变换(参见:P.26图3-4)

 

显示圆弧上的八个对称点的算法

void CirclePoints(int x,int y,int color)

{

    drawpixel(x,y,color); drawpixel(y,x,color);

    drawpixel(-x,y,color); drawpixel(y,-x,color);

    drawpixel(x,-y,color); drawpixel(-y,x,color);

    drawpixel(-x,-y,color); drawpixel(-y,-x,color);

}

 

(2)中点画圆法(参见:P.29—P.30)

  如果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。与中点画线法一样,构造判别式:

d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2

d<0,则应取P1为下一象素,而且再下一象素的判别式为:

d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3

d≥0,则应取P2为下一象素,而且下一象素的判别式为

d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5

我们这里讨论的第一个象素是(0,R),判别式d的初始值为:

d0=F(1,R-0.5)=1.25-R

 

图2.2.1 当前象素与下一象素的候选者  

 中点画圆算法

MidPointCircle(int r int color)

{

    int x,y;

    float d;

 

    x=0; y=r; d=1.25-r;

    circlepoints (x,y,color);

    while(x<=y)

    {

        if(d<0)   d+=2*x+3;

        else   { d+=2*(x-y)+5; y--;}

        x++;

        circlepoints (x,y,color);

    }

}

 

    为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。

 

(3)例:半径为6,利用中点画圆法算法所画的点

 

 

(4)中点画圆法图示

 

 

 

 

 

 

 

 

 

 

 

posted @ 2014-05-29 10:55  show.for.myself  阅读(1040)  评论(0编辑  收藏  举报