中点画圆法
一、算法原理
利用圆的对称性,只须讨论1/8圆,即下图第二个8分圆区域:
- 假设P(x,y)为当前像素,下一个像素可能是正右方P1(x+1,y)或右下方P2(x+1,y−1),如上图所示。
- 设M为P1、P2间的中点,即M的座标为(x+1,y−0.5)。若M在圆内,则P1靠近圆弧,应该取为下一像素,否则应取P2。
二、公式推导
- 构造函数:F(x,y)=x^2 + y ^2 - R^2$ ,则有:
F(x,y)=0(x,y)在圆上F(x,y)<0(x,y)在圆内F(x,y)>0(x,y)在圆外
- 带入M座标,有如下结论:
F(M)<0 M在圆内,取P1
F(M)≥0 M在圆外,取P2
为此,可采用如下判别式:
d=F(M)=F(x+1,y−0.5)=(x+1)2+(y−0.5)2−R2
- 若d<0,则P1 为下一个像素,那么再下一个像素的判别式为:
d1=F(x+2,y−0.5)=(x+2)2+(y−0.5)2−R2=d+2x+3
即,d的增量为2x+3
- 若d≥0,则P2 为下一个像素,那么再下一个像素的判别式为:
d2=F(x+2,y−1.5)=(x+2)2+(y−1.5)2−R2=d+(2x+3)+(−2y+2)=d+2(x−y)+5
即,d的增量为2(x−y)+5
- d的初值
d0=F(1,R−0.5)=1+(R−0.5)2−R2=1.25−R
三、改进优化
为了摆脱d0的浮点数运算,使整个算法全部使用整数运算,用e0=d0−0.25,则有x0=0,y0=R,d0=1−R。那么,中点画圆算法的递推公式如下:(i=0,1,2,⋯,直至x>y为止)
dd<0,di+1=di+2xi+3,xi+1=xi+1≥0,di+1=di+2(xi−yi)+5,xi+1=xi+1,yi+1=yi−1