您的位置:电脑爱好者网 » 任庆亮--first » 日志
2.2.2 圆的Bresenham算法
上一篇 / 下一篇 2007-04-07 10:42:40 / 个人分类:还电脑一片纯洁
2.2.2 圆的Bresenham算法
电脑爱好者网iv ZcQUE$?U*t9i
设圆之半径为r。先考虑圆心在(0,0),并从x=0, y=r开始的顺时针方向的1/8圆周的生成过程。在这种情况下,x每步增加1,从x=0开始,到x=y结束。即有:
*vQ A M)OQ J~4z0xi+1=xi+1
(F$R0CjyL0相应的yi+1则在两种可能中选择:
@9h.~:h&T(h#C:tB0yi+1=yi,或者yi+1=yi-1电脑爱好者网` Y&C+d^-n cIat
选择的原则是考察精确值y靠近yi还是靠近yi-1(图2.2.2),计算式为:
8Q*R)t/\kPl^r0y2=r2-(xi+1)2电脑爱好者网4gP4Tq3o%Y@.^F k
d1=yi2-y2电脑爱好者网]4O"B!M*l r2sJi
=yi2-r2+(xi+1)2
;TSq`ErmQ_0d2=y2-(yi-1)2电脑爱好者网'v6W8a GfM
=r2-(xi+1)2-(yi-1)2
4}w|R.D;|0

图2.2.2 y的位置电脑爱好者网4`eC8bV|7m,Sv
电脑爱好者网3Q/I2k(Lj?nV
令pi=d1-d2,并代入d1, d2,则有电脑爱好者网+~(t FEX7I4i
pi=2(xi+1)2+yi2+(yi-1)2-2r2 (2.2.1)
5YU4\-F1p J$Z0
pi称为误差。如果pi<0则yi+1=yi,否则yi+1=yi-1。pi的递归式为:电脑爱好者网8I8X @?*Pe6CXd
pi+1=pi+4xi+6+2(yi2+1-yi2)-2(yi+1-yi) (2.2.2)
_9v Lt;iBJ0
pi的初值由式(2.6)代入xi=0, yi=r而得
V6mEu)]*pc!w)Y0p1=3-2r (2.2.3)电脑爱好者网:c4t6e ~v2T#{
根据上面的推导,圆周生成算法思想为:
g*A`5b4m}9T01、求误差初值,p1=3-2r; i=1;画点(0, r);电脑爱好者网 ~%D~+d4b!Dw
电脑爱好者网7^ M!O;]'s4Q-bq)z P's
2、求下一个光栅位置:
5d0I_-byg0xi+1=xi+1;
n/p n[7c`0if pi<0 则yi+1=yi;电脑爱好者网2Ebv9g C3g f
否则yi+1=yi-1;电脑爱好者网8um3zj*?V
电脑爱好者网LB8_%^J
3、画点(xi+1, yi+1)
N.o@4` T6s0电脑爱好者网6` Y)I2fmMV
4、计算下一个误差:
NU i{"Y%AK GS1k/A0if pi<0 则pi+1=pi+4xi+6;电脑爱好者网}3}XQ,l["m~
否则 pi+1=pi+4(xi-yi)+10;电脑爱好者网n:B~9{:a XZE@*X
5、i=i+1; if x=y则end;否则返2。电脑爱好者网@0I{ _9l6]:u
电脑爱好者网qAAdy*^1oH [X
虽然式(2.2.2)式表示pi+1的算法似乎很复杂,但因为yi+1只能取值yi或yi-1,因此在算法中,第4步的算式变得很简单,只须作加法和4的乘法。因此圆的Bresenham算法运行速度也是很快的,并适宜于硬件实现。
2NVOn(|.kqH0圆的Bresenham算法的程序实现见程序2.2.1。电脑爱好者网[n7No2W/oJg1vB
circle (xc, yc, radius, c)
,Yi'V C2\)~0int xc, yc, radius, c;电脑爱好者网%pw kp!K*d
{
&LfO3d g c4j"i0int x, y, p;电脑爱好者网*h|5`(syB p$[m
x=0;电脑爱好者网 AMM;F0?$F2Y
y=radius;电脑爱好者网8d-N)I5\#d;l?@XE,{
p=3-2*radius;
5Jo*B ^5J+v&c0while (x<y){
f[2~ z{V0plot_circle_points(xc, yc, x, y, c);
C0R:whRN b0if (p<0) p=p+4*x+6;
&w+Z Ao+i d!b0else{电脑爱好者网 nu0y&k7m
p=p+4*(x-y)+10;
o xirrzZ&w7F0y-=1;电脑爱好者网!?dsU)q1a7B
}
[@dCu)MB1O0[0x+=1;
h^a ~J |!kQ0}
`]Qv6Zc!@t;y0if (x= =y)
Q R5K0~oa0plot_circle_points(xc, yc, x, y, c);
0E/fz4Ab*x#\0}
5c.S*VL\6ye-{0电脑爱好者网)}1v mjA&ay
plot_circle_points(xc, yc, x, y, c)
9t$e&U.Zg0int xc, yc, x, y, c;电脑爱好者网7p}P z [.\5l`
{电脑爱好者网Ny;U&D SW J}R
set_pixel(xc+x, yc+y, c);电脑爱好者网#^T5p%BHE|ev
set_pixel(xc+x, yc+y, c);