您的位置:电脑爱好者网 » 任庆亮--first » 日志
2.2.2 圆的Bresenham算法
上一篇 / 下一篇 2007-04-07 10:42:40 / 个人分类:还电脑一片纯洁
2.2.2 圆的Bresenham算法
电脑爱好者网1|!?!ZH u H
设圆之半径为r。先考虑圆心在(0,0),并从x=0, y=r开始的顺时针方向的1/8圆周的生成过程。在这种情况下,x每步增加1,从x=0开始,到x=y结束。即有:电脑爱好者网;{lz3H3?k9u
xi+1=xi+1
"eh!tR;F2[&k.?E0相应的yi+1则在两种可能中选择:
dy!]$@?0OGkbH0yi+1=yi,或者yi+1=yi-1
u?{LBaF1eU0选择的原则是考察精确值y靠近yi还是靠近yi-1(图2.2.2),计算式为:
o(b#`9b"AA&r0y2=r2-(xi+1)2电脑爱好者网3~ }'kE2e&\H9]
d1=yi2-y2
s A qwBt0=yi2-r2+(xi+1)2
0T l@'_-g(tr8z&v0d2=y2-(yi-1)2电脑爱好者网|{'v YK4YT6zgw
=r2-(xi+1)2-(yi-1)2电脑爱好者网1rD nlvy%B

图2.2.2 y的位置电脑爱好者网L_)eM-m5P0_m
&`?&}Uo.Sb3a}0
令pi=d1-d2,并代入d1, d2,则有电脑爱好者网 |4bkO9@7l j1Q
pi=2(xi+1)2+yi2+(yi-1)2-2r2 (2.2.1)
JQ|1]3k4sP5Ac0
pi称为误差。如果pi<0则yi+1=yi,否则yi+1=yi-1。pi的递归式为:电脑爱好者网H/W4[/m,oTf
pi+1=pi+4xi+6+2(yi2+1-yi2)-2(yi+1-yi) (2.2.2)电脑爱好者网#T` I;n0gCP
pi的初值由式(2.6)代入xi=0, yi=r而得电脑爱好者网-_!XN'O:^u M
p1=3-2r (2.2.3)电脑爱好者网#gjOnOk6m Y
根据上面的推导,圆周生成算法思想为:
P]ra:|Bx%h01、求误差初值,p1=3-2r; i=1;画点(0, r);电脑爱好者网KiO/H fu(Zf^
O*c-@$UYA] ?3e)M0
2、求下一个光栅位置:
dwYm buua0xi+1=xi+1;
yRCVBr4deh7c0if pi<0 则yi+1=yi;电脑爱好者网 d7|vPZ
否则yi+1=yi-1;电脑爱好者网}h4DKhl&|UD
5p4G%sd.K`$~,ZVR0
3、画点(xi+1, yi+1)电脑爱好者网l)~A \3Y
电脑爱好者网|Ei*R;v6[2~5oR
4、计算下一个误差:
dee)W2@0if pi<0 则pi+1=pi+4xi+6;
kQ;e9VEQEK ?p^0否则 pi+1=pi+4(xi-yi)+10;电脑爱好者网2~*j,H3YlI;w(mC
5、i=i+1; if x=y则end;否则返2。
0L.FSN+W5yt:i"XJT0电脑爱好者网P'|k[j
虽然式(2.2.2)式表示pi+1的算法似乎很复杂,但因为yi+1只能取值yi或yi-1,因此在算法中,第4步的算式变得很简单,只须作加法和4的乘法。因此圆的Bresenham算法运行速度也是很快的,并适宜于硬件实现。
/h9\"rT7O k3L;P0圆的Bresenham算法的程序实现见程序2.2.1。电脑爱好者网"X fzQN)ab
circle (xc, yc, radius, c)
VpJ:f4^0int xc, yc, radius, c;
E?a,xRTjY^0{电脑爱好者网F5TSe|,B;RV
int x, y, p;电脑爱好者网 _M,bQ{"t
x=0;
"l{E(q%rc0y=radius;
)Z8I/Sr4?X5\"c0p=3-2*radius;电脑爱好者网{$Of#UG\3Q"hY;u
while (x<y){电脑爱好者网H$U J]4P0H+O^
plot_circle_points(xc, yc, x, y, c);电脑爱好者网,D9o5h_{ij
if (p<0) p=p+4*x+6;
Sno:fB;^3] R5C(K0else{
C j&J