关于作者

网络推荐

第二章 基本图形的生成与计算

上一篇 / 下一篇  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 =

n:}"q'NS l%H0

直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式:

8v8zE8b-v5X&FX0

xi+1=xi+Dx

x/mz8~(e;KK&s,[0

yi+1=yi+Dy电脑爱好者网PX3W2e'K`8w

并有关系:Dy = m · Dx电脑爱好者网|8q0`$_Rc7q

递归式的初值为直线的起点(x1, y1),这样,就可以用加法来生成一条直线。具体方法是:

)| Z*lQ"Z9j0

 

%|_\'uc*G I0

图2.1.1 直线方向的8个象限电脑爱好者网t1U&Xf~#H

           2_1_1.gif (3249 bytes)                                  电脑爱好者网YG6b,\:P8lJS

                                                          图2.1.1电脑爱好者网A4S0S4u)mwc+{

0S$]1K2\y|{0表2.1.1

3U(n2v JD0
电脑爱好者网9Q#t az8hn

象限

I,T"Ph!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

7r Pa5d~ T01b电脑爱好者网^'kG"L _$D.WI

T{h'sHlUF7X:t02a

I2ih%h(Md6~0 电脑爱好者网BcYWz%\h0?

2b电脑爱好者网Qd9bxw

电脑爱好者网L/z p~7q*[]

3a电脑爱好者网 g%h/dFI

电脑爱好者网 |EWk8d(v

3b电脑爱好者网2{$^o:c1Q;vn!ry

&?u^*_m\YAt04a电脑爱好者网F*z R*\(G!d@6s

6FNQoaN-|J04b电脑爱好者网0Q/d d,T![9ASS s

KA V$Z~`M2f0Ö

kX m5|3?0 电脑爱好者网0@xy%E? K.f

´

}lH H9y{ R,H0 电脑爱好者网,M(T Ksw*o|1L

Ö

4t8O2A+AE2KMw0 电脑爱好者网!S.Lr0[Y.F%y

´

u)q gY*c3H6X.CO? P0 电脑爱好者网 ]X8R? ]+N(?#W7KK

Ö 电脑爱好者网)CV:_$H Fo/~

电脑爱好者网%K a-F;s)V EA K

´

8SAg+\8Z%Cs$hb0 电脑爱好者网 |8Zm[EF z:a

Ö 电脑爱好者网O.u:]K"X o-IC;N#Da

电脑爱好者网H1v&dEy!AC G6J+y

´

euA2I?ZpO0
电脑爱好者网 V u}cEa|

1电脑爱好者网n] I H L'y-i

电脑爱好者网-oM5ka9\?#X

1/m电脑爱好者网jaL z9?6R]9lg

&C(h*Do&Uw"N"n@0-1

"fl5F6[Q en?0 电脑爱好者网 op;t9vX%yp(J

-1/m

5{y1Z?,bB0

*q QSd`p)Bf#w0-1

7n$@3Y0f"asB5V0 电脑爱好者网E_a1xtw x5b$A/M

-1/m电脑爱好者网J!tCeez g

m3^U6} c i01

LJ3gnTY,Q1e0

2Aw_ NH _!h$}+b01/m电脑爱好者网I/VYm-Q)n

,iz5_9RIK$^({0m

`9s"CYx7b(dYw0 电脑爱好者网[!a)b}9W!tP$p9I

1

Hpfr-e2v+n0 电脑爱好者网l)v d(mC-pXZs c]

m

.R2QVT'?!z I0 电脑爱好者网;g;q&kf1`w

1电脑爱好者网1a`~x9zV

电脑爱好者网 C@2k/r;Z_%j?

-m电脑爱好者网`#cz}2uy-Hw

电脑爱好者网*H4t T;@;m%_

-1电脑爱好者网(X[0i+e5M

电脑爱好者网f fF#y[#\

-m电脑爱好者网9q'vDt`R:Y;p

电脑爱好者网 qfH/D*A2s I

-1

[bu v5w }X P;] @0

4}X(m R2n5@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]

研究表中的数据,可以发现两个规律:电脑爱好者网 O Lz^3G

1、当|dx|>|dy|时电脑爱好者网n9lZB h{` j5~"}

|D x|=1, |D y|=m;

to@RDDN3rHM!k0

否则:

Up2X5I.g0

Dx=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 I Y'}-~0

使用DDA算法,每生成一条直线做两次除法,每画线中一点做两次加法。因此,用DDA法生成直线的速度是相当快的。

!o;n'f4X9YCGi,uu0

dda_line (xa, ya, xb, yb, c)

dnM$^+]1UT0

int xa, ya, xb, yb, c;电脑爱好者网-\0K d(O!I5Nq

{

(a@%g5S%H7@ F D)j`0

float delta_x, delta_y, x, y;电脑爱好者网Tz:_'P8R y0d-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 \2S0

if (abs(dx)>abs(dy)) steps=abs(dx);电脑爱好者网P{4j mL Sc

else steps=abs (dy);

X&J9fAc#C_6p V)d,~%@0

delta_x=(float)dx / (float)steps;电脑爱好者网 }Tw\/_V R}j

delta_y=(float)dy / (float)steps;

V{ r^G5}E2{0

x=xa;

X5?"b NkV0

y=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.W0SVcjF0

x+=delta_x;

`U^Q S0

y+=delta_y;电脑爱好者网]QD-ux$\7PI

set_pixel(x, y, c);

t"B hC.TCW8B0a p0

}电脑爱好者网$HK5z]3dnu}ru

   }电脑爱好者网 F9ES"kb;K,n

程序2.1.1 DDA直线生成程序电脑爱好者网5cd3E^YS7{

电脑爱好者网Q#S }E#fyA8u

              

b'?\ hM6S0

TAG: 还电脑一片纯洁

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)