【寒江雪】中点画圆法

圆的特征

每一个圆都拥有一个圆心(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)

同时根据相应的公式,计算下一点的判别式

这样,该算法可以简述为,推测当前点,推导下一点的判别式。依次滚动直到计算完八分之一圆为止。

完善
在上述算法中,使用了浮点数来表示决策变量d。为了简化算法,摆脱浮点数,在算法中全部使用整数,我们使用e=d-1/4代替d。显然,初值d=5/4-r对应于e=1-r。决策变量d<0对应于e<-1/4。算法中其它与d有关的式子可把d直接换成e。又由于e的初值为整数,且在运算过程中的迭代值也是整数,故e始终是整数,所以e<-1/4等价于e<0。因此,可以写出完全用整数实现的中点画圆算法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值