中点画圆法
一、算法原理
利用圆的对称性,只须讨论1/8圆,即下图第二个8分圆区域:
- 假设 P ( x , y ) P(x,y) P(x,y)为当前像素,下一个像素可能是正右方 P 1 ( x + 1 , y ) P_1(x+1,y) P1(x+1,y)或右下方 P 2 ( x + 1 , y − 1 ) P_2(x+1,y-1) P2(x+1,y−1),如上图所示。
- 设 M M M为 P 1 P_1 P1、 P 2 P_2 P2间的中点,即 M M M的坐标为 ( x + 1 , y − 0.5 ) (x+1,y-0.5) (x+1,y−0.5)。若 M M M在圆内,则 P 1 P_1 P1靠近圆弧,应该取为下一像素,否则应取 P 2 P_2 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 ) 在 圆 外 F(x,y)= 0 (x,y)在圆上\\ F(x,y)< 0 (x,y)在圆内\\ F(x,y)> 0 (x,y)在圆外 F(x,y)=0(x,y)在圆上F(x,y)<0(x,y)在圆内F(x,y)>0(x,y)在圆外 - 带入
M
M
M坐标,有如下结论:
F ( M ) < 0 F(M)< 0 F(M)<0 M在圆内,取 P 1 P_1 P1
F ( M ) ≥ 0 F(M)\geq 0 F(M)≥0 M在圆外,取 P 2 P_2 P2
为此,可采用如下判别式:
d = F ( M ) = F ( x + 1 , y − 0.5 ) = ( x + 1 ) 2 + ( y − 0.5 ) 2 − R 2 \begin{aligned} d &= F(M) \\ &= F(x + 1, y - 0.5)\\ &= (x + 1)^2 + (y - 0.5) ^2 - R^2 \end{aligned} d=F(M)=F(x+1,y−0.5)=(x+1)2+(y−0.5)2−R2 - 若
d
<
0
d<0
d<0,则
P
1
P_1
P1 为下一个像素,那么再下一个像素的判别式为:
d 1 = F ( x + 2 , y − 0.5 ) = ( x + 2 ) 2 + ( y − 0.5 ) 2 − R 2 = d + 2 x + 3 \begin{aligned} d_1 &= F(x + 2, y - 0.5)\\ &= (x + 2)^2 + (y - 0.5) ^2 - R^2\\ &= d + 2x +3 \end{aligned} d1=F(x+2,y−0.5)=(x+2)2+(y−0.5)2−R2=d+2x+3
即, d d d的增量为 2 x + 3 2x +3 2x+3 - 若
d
≥
0
d \geq 0
d≥0,则
P
2
P_2
P2 为下一个像素,那么再下一个像素的判别式为:
d 2 = F ( x + 2 , y − 1.5 ) = ( x + 2 ) 2 + ( y − 1.5 ) 2 − R 2 = d + ( 2 x + 3 ) + ( − 2 y + 2 ) = d + 2 ( x − y ) + 5 \begin{aligned} d_2 &= F(x + 2, y - 1.5)\\ &= (x + 2)^2 + (y - 1.5) ^2 - R^2\\ &= d + (2x +3) +(-2y+2)\\ &=d+2(x-y)+5 \end{aligned} 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 d d的增量为 2 ( x − y ) + 5 2(x-y)+5 2(x−y)+5 - d的初值
d 0 = F ( 1 , R − 0.5 ) = 1 + ( R − 0.5 ) 2 − R 2 = 1.25 − R \begin{aligned} d_0 &= F(1, R-0.5)\\ &= 1 + (R-0.5)^2 - R^2\\ &= 1.25 - R \end{aligned} d0=F(1,R−0.5)=1+(R−0.5)2−R2=1.25−R
三、改进优化
为了摆脱
d
0
d_0
d0的浮点数运算,使整个算法全部使用整数运算,用
e
0
=
d
0
−
0.25
e_0=d_0-0.25
e0=d0−0.25,则有
x
0
=
0
,
y
0
=
R
,
d
0
=
1
−
R
x_0=0,y_0=R,d_0=1-R
x0=0,y0=R,d0=1−R。那么,中点画圆算法的递推公式如下:(
i
=
0
,
1
,
2
,
⋯
i=0,1,2,\cdots
i=0,1,2,⋯,直至
x
>
y
x>y
x>y为止)
d
<
0
,
d
i
+
1
=
d
i
+
2
x
i
+
3
,
x
i
+
1
=
x
i
+
1
d
≥
0
,
d
i
+
1
=
d
i
+
2
(
x
i
−
y
i
)
+
5
,
x
i
+
1
=
x
i
+
1
,
y
i
+
1
=
y
i
−
1
\begin{aligned} d &<0,d_{i+1}=d_i+2x_i+3,x_{i+1}=x_i+1\\ d &\geq0,d_{i+1}=d_i+2(x_i-y_i)+5,x_{i+1}=x_i +1,y_{i+1}=y_i-1 \end{aligned}
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