圆的扫描转换算法
圆弧的扫描转换算法(转载: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)中点画圆法图示