您的位置:电脑爱好者网 » 任庆亮--first » 日志
第二章 基本图形的生成与计算
上一篇 / 下一篇 2007-04-07 10:38:49 / 个人分类:还电脑一片纯洁
2.1 直线的生成算法
在光栅显示器的荧光屏上生成一个对象,实质上是往帧缓存寄存器的相应单元中填入数据。画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的象素序列,并填入色彩数据的过程。这个过程也称为直线光栅化。本节介绍在光栅显示器上直线光栅化的最常用的两种算法:直线DDA算法和直线Bresenham算法。电脑爱好者网G3]y-sc#E(D:lyEO
2.1.1 直线的DDA算法
DDA是数字微分分析式(Digital Differential Analyzer)的缩写。设直线之起点为(x1,y1),终点为(x2,y2),则斜率m为:电脑爱好者网tw-C2g4}5_ hL~:?
m =
直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式:
8v8zE8b-v5X&FX0xi+1=xi+Dx
x/mz8~(e;KK&s,[0yi+1=yi+Dy电脑爱好者网PX3W2e'K`8w
并有关系:Dy = m · Dx电脑爱好者网|8q0`$_Rc7q
递归式的初值为直线的起点(x1, y1),这样,就可以用加法来生成一条直线。具体方法是:
)|Z*lQ"Z9j0%|_\'uc*GI0
图2.1.1 直线方向的8个象限电脑爱好者网t1U&Xf ~#H
电脑爱好者网YG6b,\:P8lJS
图2.1.1电脑爱好者网A4S0S4u)mwc+{
0S$]1K2\y|{0表2.1.1
3U(n2v JD0|
电脑爱好者网9Q#t az8hn 象限 I,T"P h!Enh0 |
3hg0CE3l0|dx|>|dy|? B"g.Q~#d Q0 |
p~,H&W(Dz*n0D x电脑爱好者网O;AnTKe |
,w^'P L"p3Mk0D y )V4C7sg*s2I"?S0 |
|
Mp`5QC01a电脑爱好者网*d#nG5s-W3o/u&l 7rPa5d~ T01b电脑爱好者网^'kG"L _$D.WI T{h'sH lUF7X:t02a I2ih%h(Md6~0 电脑爱好者网BcYWz%\h0?2b电脑爱好者网Qd9bxw 电脑爱好者网L/z p~7q*[]3a电脑爱好者网g%h/dFI 电脑爱好者网 |EWk8d(v3b电脑爱好者网2{$^o:c1Q;vn!ry &?u ^*_m\YAt04a电脑爱好者网F*z R*\(G!d@6s 6FNQ oaN-| J04b 电脑爱好者网0Q/d d,T![9ASSs |
KA V$Z~`M2f0Ö kX m5|3?0 电脑爱好者网0@xy%E? K.f´ }lH H9y{R,H0 电脑爱好者网,M(TKsw*o|1LÖ 4t8O2A+AE2KMw0 电脑爱好者网!S.Lr0[Y.F%y´ u)q gY*c3H6X.CO? P0 电脑爱好者网 ] X8R?]+N(?#W7KKÖ 电脑爱好者网)CV:_$H Fo/~ 电脑爱好者网%Ka-F;s)VEA K´ 8SAg+\8Z%Cs$hb0 电脑爱好者网|8Zm[EFz:aÖ 电脑爱好者网O.u:]K"X o-IC;N#Da 电脑爱好者网H1v&dEy!ACG6J+y´ euA2I?ZpO0 |
电脑爱好者网
V u}cEa| 1电脑爱好者网n] I H L'y-i 电脑爱好者网-oM5ka9\?#X1/m电脑爱好者网jaL z9?6R]9lg &C(h*Do&Uw"N"n@0-1 "fl5F6[Q en?0 电脑爱好者网 op;t9v X%yp(J-1/m 5{y1Z?,bB0*q QSd`p)Bf#w0-1 7n$@3Y0f"asB5V0 电脑爱好者网 E_a1xtwx5b$A/M-1/m电脑爱好者网J!tCeez g m3^U6}c i01 LJ3gnTY,Q1e02Aw_ NH_!h$}+b01/m 电脑爱好者网I/VYm-Q)n |
,iz5_9RIK$^({0m `9s"CYx7b(dYw0 电脑爱好者网[!a)b}9W!tP$p9I1 Hpfr-e2v+n0 电脑爱好者网l)v d(mC-pXZs c]m .R2QVT'?!z I0 电脑爱好者网;g;q&kf1`w1电脑爱好者网1a`~x9zV 电脑爱好者网C@2k/r;Z_%j?-m电脑爱好者网`#cz}2uy-Hw 电脑爱好者网*H4tT;@;m%_-1电脑爱好者网(X[0i+e5M 电脑爱好者网f fF#y[#\-m电脑爱好者网9q'vDt`R:Y;p 电脑爱好者网 qfH/D*A2sI-1 [buv5w }X P;] @0 |
按照直线从(x1,y1)到(x2,y2)的方向不同,分为8个象限(图2.1.1)。对于方向在第1a象限内的直线而言,D x=1,D y=m。对于方向在第1b象限内的直线而言,取值Dy=1,Dx=1/m。各象限中直线生成时Dx, Dy的取值列在表2.1.1之中。电脑爱好者网Aiv:c7]
研究表中的数据,可以发现两个规律:电脑爱好者网OLz ^3G
1、当|dx|>|dy|时电脑爱好者网n9lZB h{` j5~"}
|D x|=1, |D y|=m;
to@RDDN3rHM!k0否则:
Up2X5I.g0Dx=1/m,|Dy|=1电脑爱好者网Ko#X/x1U0?
9YlnVd0
2、Dx, Dy的符号与dx, dy的符号相同。电脑爱好者网id'RS,nK.[
这两条规律可以导致程序的简化。由上述方法写成的程序如程序2.1.1所示。其中steps变量的设置,以及D x=dx/steps; D y=dy/steps等语句,正是利用了上述两条规律,使得程序变得简练。
x3l%C^ t$X(]cI IY'}-~0使用DDA算法,每生成一条直线做两次除法,每画线中一点做两次加法。因此,用DDA法生成直线的速度是相当快的。
!o;n'f4X9YCGi,uu0dda_line (xa, ya, xb, yb, c)
dnM$^+]1UT0int xa, ya, xb, yb, c;电脑爱好者网-\0Kd(O!I5Nq
{
(a@%g5S%H7@ F D)j`0float delta_x, delta_y, x, y;电脑爱好者网Tz:_'P8Ry0d-h
int dx, dy, steps, k;电脑爱好者网 P+hq+n V6m4OH'h
dx=xb-xa;电脑爱好者网*cP}3uA q"x7@6z
dy=yb-ya;
E4c,Bh!j0Fxn\2S0if (abs(dx)>abs(dy)) steps=abs(dx);电脑爱好者网P{4j mL Sc
else steps=abs (dy);
X&J9fAc#C_6pV)d,~%@0delta_x=(float)dx / (float)steps;电脑爱好者网 }Tw\/_ VR}j
delta_y=(float)dy / (float)steps;
V{r^G5}E2{0x=xa;
X5?"b NkV0y=ya;电脑爱好者网C0NE+J"ny+Y,U g
set_pixel(x, y, c);电脑爱好者网bj0^FOm!r#^
for (k=1; k<=steps; k++)电脑爱好者网lG*s%I5h;e!v
{
.y/\\"D.W0SVcjF0x+=delta_x;
`U^Q S0y+=delta_y;电脑爱好者网]QD-ux$\7PI
set_pixel(x, y, c);