每一个圆都拥有一个圆心(x,y)和半径R。一个圆如果位于原点,则有四条对称轴x=0.y=0.x=y,x=-y;这样,利用圆上任意一点,可以画出其他7个点。这种性质称为圆的八分性质
显示圆弧上八个对称点的算法如下:
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);
}
中心点画圆法
根据圆的函数F(x,y)=x^2+y^2-R^2;得出结论:对于平面内任意一点(x,y),若F(x,y)<0则该点在圆内,若F(x,y)=0,则该点在圆上。若F(x,y)>0,则该点在圆外。
据此,我们可以构造判别式d=F(x+1,y-0.5)。
若d<0, 判别式d=F(x+2,y-0.5)=d+2x+3;.y值不变
若d>=0,判别式f=F(x+2,y-1.5)=d+2(x-y)+5;y值减少1
初始是
起始点为(0,R),d=F(1,R-0.5)=1.25-R;
算法如下
Void MidPointCircle(int r,int color){
Intx,y;
Floatd;
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);
}
}
该算法主要思路是使用中点判断是应该取上界还是下界。
我们要绘制的点的横坐标X肯定都是整数。而Y的值肯定是经过四舍五入过后的整数值
但是严格意义上的圆,其纵坐标不可能都为整数。因此,采用中点是不是在圆内的方法来判别当前X坐标对应圆上的点是在中点之上还是在中点之下,进而判断是该舍还是入。
现做如下推导
假设当前横坐标为X,为整数
计算得到圆上的点为(X,y),y可能为整数也可能为浮点数
Y为y四舍五入后得到的Y值
算法一开始,y=Y=R,X=0,都为整数。取中点(x+1,ym);ym为Y与Y-1的中值。
若(x+1,ym)在圆内,表明(x+1,y)中Y>y>ym,此时应取Y作为要绘制的点的纵坐标(x+1,Y)
若(x+1,ym)在圆外,表明(x+1,y)中ym>y>Y-1,此时应取Y作为要绘制的点的纵坐标(x+1,Y-1)
同时根据相应的公式,计算下一点的判别式
这样,该算法可以简述为,推测当前点,推导下一点的判别式。依次滚动直到计算完八分之一圆为止。