You are on page 1of 141

Trng i hc Khoa hc Hu

Khoa CNTT
W X

Gio trnh

Hu, thng 9/2008

Chng I: Cc yu t c s ca ho

I. Cc khi nim c bn
I.1. Thit b ho v im nh (Pixel)
Cc thit b ho thng dng nh mn hnh my tnh, my in, cho php
chng ta biu din cc hnh v trn . Cc thit b ho ny to ra mt phng,
l mt tp hu hn cc im m mi im c nh mt cp ch s nguyn gi
l to , thng thng mt phng ho do thit b to ra l mt ma trn im,
mi im gi l mt Pixel c cc thnh phn to l x v y.

(Hnh I.1)

I.2. im v on thng trong mt phng


V mt ton hc th mt on thng bao gm mt tp v hn cc im trong mt
phng vi cp to thc. Song do c im ca cc thit b hin th nn khi biu
din trn thit b hin th ca my tnh (nh mn hnh, my in,) th c nguyn
ho thnh mt tp hu hn cc cp to nguyn (Hnh I.1).

II. Cc thut ton v on thng


Phng trnh tng qut ca mt ng thng c vit di dng:

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

y=a*x+b
vi
a: l h s gc hay cn gi l dc, n phn nh mi tng quan gia 2
bin s x v y.
b: l khong chn trn trc honh
Phng trnh ng thng i qua 2 im A(xa,ya) v B(xb,yb) l:
y ya
x xa
=
y b y a xb x a

(II.a)

(vi xa<>xb v ya<>yb.


Khi

xa=xb th phng trnh l x=xa

cn khi ya=yb phng trnh l y=ya)


t

x = xb x a
y = y b y a

th (II.a) tr thnh y =

a =
y = ax + b vi
x
b = ax a + y a

y
y
x
xa + y a
x
x

(II.b)

II.1. V on thng da vo phng trnh


Khi bit c phng trnh ca mt ng chng ta hon ton c th v
c ng biu din cho ng nh vo cc tnh ton trn phng trnh.
y ng m ta cn biu din l mt on thng AB vi A(xa,ya) v B(xb,yb).
Phng trnh biu din c cho bi (II.b) vi
x [xa , xb ]; y [ ya , yb ]

Quy trnh c th tm tt nh sau:


Nu y x : ngha l bin s x bin thin nhanh hn bin s y, lc ny
m bo tnh lin tc ca cc im v ta cho bin s x thay i tun t v tnh
bin s y qua phng trnh. C th nh sau:
Cho x nhn cc gi tr nguyn ln lt t xa n xb, vi mi gi tr x ta thc hin:
Tnh y=ax+b thng qua phng trnh
V im (x,Round(y)).
2

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

y im trn on thng c to l (x,y) song ta khng th v im


v gi tr y l mt gi tr thc, m nh ni mc I l cc h thng biu
din ho ch c hu hn im v mi im c to nguyn, V th ta
but phi minh ho cho im (x,y) trn ng thng thc bi mt im trn
h thng thit b ho gn vi n nht l im c to (x,round(y)).

Ngc li: ngha l bin s y bin thin nhanh hn bin s x, lc ny m


bo tnh lin tc ca cc im v ta cho bin s y thay i tun t v tnh bin
s x qua phng trnh. C th nh sau:
Cho y nhn cc gi tr nguyn ln lt t ya n yb, vi mi gi tr y ta thc hin:
Tnh x=

y b
x
x
(hay x =
y a + xa )
y
a
y
y

V im (Round(x),y).
V d: Cho A(5,4) n B(10,7) v on thng AB ta thc hin cc bc sau:
Tnh

x = xb x a = 10 5 = 5
y = y b y a = 7 4 = 3
y 3

a =
=

x 5
b = ax a + y a = 1

V y x nn ta thc hin theo cch 1 l cho x nhn cc gi tr nguyn ln lt


t xa n xb, vi mi gi tr x ta thc hin:
Tnh y=ax+b thng qua phng trnh
V im (x,Round(y)).
C th nh sau:
Khi x = xa = 5:

=> y = ax+b = 4;

V im (5,4)

Khi x = 6:

=> y = 23/5 = 4.6;

V im (6,5)

Khi x = 7:

=> y = 26/5 = 5.2;

V im (7,5)

Khi x = 8:

=> y = 29/5 = 5.8;

V im (8,6)

Khi x = 9:

=> y = 32/5 = 6.4;

V im (9,6)

Khi x = 10:

=> y = 7;

V im (10,7)
3

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

Kt qu ta c hnh v on thng AB c th minh ha nh sau:


6

10

Hnh nh minh ha mt on thng t A(5,4) n B(10,7)

II.2. V on thng da vo thut ton Bresenham


T quy trnh v on thng trn (II.1) ta thy on thng AB c th c v
mt cch d dng. Song s php tnh cn phi thc hin trong mi bc v cn
ln, c th l ta cn phi tnh 1 php nhn v 1 php cng trn trng s thc v
mt php tnh lm trn (Round). Cng vi t tng nh trn song thut ton
Bresenham hng ti mt s phn tch bi ton su sc hn tm ra mt quy
trnh v c cc im song t tnh ton hn.
Trong phn ny ta ch trnh by gii thut trong trng hp h s gc ca
on thng a [0,1] . Cc trng hp cn li ca h s gc nh a [1,+] ;
a [ ,1] ; a [ 1,0] chng ta c th ly i xng on thng qua cc ng phn
gic, OX, hay OY quy v trng hp a [0,1] .
R rng l v a [0,1] nn quy trnh y l cho x nhn cc gi tr nguyn ln lt
t xa n xb, vi mi gi tr x ta cn phi tm ra mt gi tr y nguyn (x,y) chnh
l to ca im cn minh ho trn thit b, song gi tr y tm ra y phi thng
qua t php tnh ton hn quy trnh II.1.

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

Gi thit vi hai im u mt A(xa,ya) v B(xb,yb) c to nguyn v xa<xb. R


rng im u tin cn biu din trn thit b l im c to (xa,ya). Nu gi
im chn c u tin l (x0,y0) th
(x0,y0)= (xa,ya)
theo lp lun quy np ta:
Gi thit rng n bc th i ta chn c im th i, hay ni cch khc l
im chn th i l (xi,yi) c xc nh gi tr.
Vy n bc tip theo (i+1) ta s chn im no? Hay ni cch khc l im
chn th (i+1) l (xi+1,yi+1) s c to bng bao nhiu.
(Ch : xi,yi l tn gi ca to im chn th i, v d nh (x0,y0) l tn gi ca
im chn u tin (i=0) v n c gi tr l (xa,ya))
tr li cu hi ny ta cn da vo mt s lp lun sau:
Nh trn trnh by th im chn th i+1 s phi c honh x bng honh
ca im trc cng thm 1:
Hay

xi+1=xi+1

Gi M l im thuc AB sao cho xM=xi+1=xi+1


th yM= axM+b=a(xi+1)+b= (axi+b)+a
vy im tip theo thuc on thng m ta cn tm minh ho trn thit b l
M(xi+1, (axi+b)+a). Cu hi t ra l ta s chn im no trong 2 im P(xi+1,yi)
v Q(xi+1,yi+1) minh ho cho M trn thit b ho.
xi

xi+1
P

yi

d1

M
d2

yi+1
Q

tr li cu hi ny ta i xt mt biu thc trung gian:

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

d1=yM-yP;

d2=yQ-yM

Xt biu thc:

d1-d2 =(yM-yP)-( yQ-yM)=2yM-(yP+yQ) = 2 y M

y P + yQ

Nu gi I l trung im ca QP th: d1 d 2 = 2[ y M y I ]
R rng l:
Nu d1-d2<0 th im yM<yI, suy ra P gn im M hn Q, vy ta s chn im P
l im minh ha cho M trn thit b ho
Nu d1-d2>0 th im yM>yI, suy ra Q gn im M hn P, vy ta s chn im
Q l im minh ha cho M trn thit b ho
Nu d1-d2=0 th im yM=yI, suy ra kh nng la chn P v Q l nh nhau,
song ta phi quyt nh chn mt im. Trong tnh hung ny ta quyt nh
chn im Q.
Vy tm c im minh ho tip theo ta cn xt du ca biu thc d1-d2. Song
ta thy biu thc d1-d2 cn kh phc tp v phi thc hin tnh ton trn trng s
thc do trong c xut hin php chia:
yM=(axi+b)+a = (axi + (ax a + y a )) + a =

y
y
y
xi
xa + y a +
x
x
x

(*)

trnh tnh biu thc d1-d2 trn trng s thc ngi ta hng ti mt biu thc
tng ng v du l
Pi = x(d1 d 2 )

Vic a x vo nhm loi b mu s trong biu thc (d1-d2) thu c biu


thc Pi tnh trn trng s nguyn. Tht vy:
Pi = x(d1 d 2 ) = x(2 y M ( y P + y Q )) = x(2 y M ( y i + y i + 1)) = x(2 y M 2 y i 1)
Pi = 2xy M 2xy i x

Thay yM bi gi tr (*) ta c:
Pi = 2yxi 2yxa + 2xya + 2y 2xyi x
= 2yxi 2xyi 2yxa + 2xya + 2y x

(a)

Ta thy biu thc Pi c xc lp t to ca im chn th i l (xi,yi).


Vy Pi+1 s c xc lp t im chn th i+1 l (xi+1,yi+1) nh sau:
Pi +1 = 2yxi +1 2xyi +1 2yxa + 2xya + 2y x

(b)
6

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

V du ca Pi v du ca (d1-d2) l tng ng nn c th tm tt quy tc


chn im tip theo nh sau:
Nu Pi<0: Th chn im P lm im minh ha cho M trn thit b ho
Hay ni cch khc l im chn th i+1 l (xi+1,yi+1) s c gi tr bng P
Ngha l:

(xi+1,yi+1)=(xi+1,yi)

Thay vo (b) ta c:
Pi +1 = 2y ( xi + 1) 2xyi 2yx a + 2xy a + 2y x
= Pi + 2y

Nu Pi 0 : Th chn im Q l im minh ha cho M trn thit b ho


Hay ni cch khc l im chn th i+1 l (xi+1,yi+1) s c gi tr bng Q
Ngha l:

(xi+1,yi+1)=(xi+1,yi+1)

Thay vo (b) ta c:
Pi +1 = 2y ( xi + 1) 2x( y i + 1) 2yxa + 2xy a + 2y x
= Pi + 2y 2x

Khi i=0 th ta c (x0,y0)=(xa,ya) thay vo (a) ta c:


P0 = 2yx0 2xy 0 2yx a + 2xy a + 2y x
= 2y x

Vy t y ta thy c quy trnh chn ra cc im trn thit b minh ho cho


on thng AB theo thut ton Bresenham nh sau:
im chn u tin (i=0) l (x0,y0)=(xa,ya) v gi tr P0 = 2y x
Da vo gi tr ca P0 l m hay dng m ta li chn c im tip theo
(x1,y1) v tnh c gi tr P1
Da vo gi tr ca P1 l m hay dng m ta li chn c im tip theo
(x2,y2) v tnh c gi tr P2
C nh vy ta tm ra c tp cc im trn thit b ho minh ho cho
on thng AB.
II.2.a.

Tm tt thut ton Bresenham:

Bc 1:
Tnh x;y
7

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

Const1=2y; Const2=2y-2x
P0=2y-x; (x0, y0) = (xa , ya)
V im (x0, y0)
Bc 2: Vi mi gi tr i (i=0,1,2,) ta xt du Pi
Nu Pi <0: th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi)
Pi+1=Pi+Const1
Ngc li (tc Pi 0): th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi+1)
Pi+1=Pi+Const2
V im (xi+1,yi+1) va tm c
Bc 3: Lp li bc 2 vi nhng gi tr i tip theo, cho n khi im tm c
trng vi B, ngha l xi+1=xb th thut ton kt thc.
II.2.b.

V d:

Cho on thng AB vi A(5,6) v B(10,10). S dng thut ton Bresenham chng ta c


th tm c cc Pixel cn v biu din on AB trn mn hnh nh sau:
Bc 1:

x = 10-5 = 5;
y = 10-6 = 4;
Const1 = 2y = 8; Const2 = 2y-2x = 8-10 = -2;
(x0, y0) = (xa , ya) = (5,6)
P0 = 2y-x = 8-5 = 3;
V im (x0, y0)
Bc 2: Bc lp:
i = 0:
Ta c P0 = 30 nn:
(x1,y1) = (x0+1,y0+1) = (6,7)
P1=P0+Const2 = 3+(-2)=1
V im (x1, y1) = (6,7)
i = 1:
Ta c P1 = 10 nn:
(x2,y2) = (x1+1,y1+1) = (7,8)
P2=P1+Const2 = 1+(-2)= -1
V im (x2, y2) = (7,8)
8

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

i = 2:
Ta c P2 = -1<0 nn:
(x3,y3) = (x2+1,y2) = (8,8)
P3=P2+Const1 = -1+8 = 7
V im (x3, y3) = (8,8)
i = 3:
Ta c P3 = 70 nn:
(x4,y4) = (x3+1,y3+1) = (9,9)
P4=P3+Const2 = 7+(-2) = 5
V im (x4, y4) = (9,9)
i = 4:
Ta c P4 = 50 nn:
(x5,y5) = (x4+1,y4+1) = (10,10)
P5=P4+Const2 = 5+(-2) = 3
V im (x5, y5) = (10,10)
V x5 = xb = 10 nn kt thc vng lp v cng l kt thc thut ton.
Hnh v minh ha:
6

10

10

(Cc Pixel vung mu chnh l hnh nh th hin ca on thng AB


trn mn hnh my tnh)
9

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

II.2.c.

Hng dn cho cc trng hp h s gc ngoi on [0, 1]

Gi s cho A(0,50), B(100,10) dng on thng AB ta cn tin hnh mt s


phn tch:
x = xb xa = 100 0 = 100
y = yb ya = 10 50 = -40
Suy ra h s gc a = y/x = -0.4 [-1,0)
Lc ny ta cn ly i xng ca AB qua trc OX c CD vi C(0,-50) D(100,10) nn xt trn on thng CD ta c
x = xd xc = 100 0 = 100
y = yd yc = -10 (-50) = 40
Suy ra h s gc a = y/x = 0.4 [1,0] tha mn iu kin ca thut ton
Bresenham. T chng ta c th p dng thut ton Bresenham tnh ton ra
cc im cn v trn CD nhng chng ta s khng v n (v mc ch chng ta l
v AB) m li ly i xng qua trc OX (tc i xng ngc li vi lc u) ri
mi v, th lc ny cc im v ra s l hnh nh ca on thng AB. Nh th CD
ch ng vai tr trung gian p dng c thut ton cn kt qu sau cng ta thu
c vn l hnh nh minh ha cho on AB.
p dng tng t:
+ trng hp h s gc a (1,+) , lc ny chng ta cn ly i xng qua ng
phn gic ca gc phn t th nht h s gc c quy v [0,1].
+ trng hp h s gc a (,1) , lc ny chng ta cn ly 2 ln i xng. i
xng qua OX ri tip n i xng qua ng phn gic.
Xt im M(x,y). i xng qua OX ta c ta mi l (x,-y). tip n
ly i xng qua tia phn gic gc phn t th nht ta c (-y,x).
II.2.d.

Ci t thut ton

Sinh vin cn xy dng mt th tc v on thng AB vi gi thit u vo


tho h s gc thuc on [0,1]
Sinh vin cn xy dng mt th tc v on thng tng qut cho php v on
thng AB trong mi trng hp, v mt chng trnh minh ho c s dng th
tc ny.

10

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

III. Cc thut ton v ng trn


Phng trnh ng trn tm O (gc to
) bn knh R (nguyn)l:

X2+Y2=R2

Trong mc ny ta ch cn tm
phng php v ng trn tm ti gc
to . Nu ta v c ng trn tm
ti gc to th bng cch thm vo
php tnh tin ta c ng trn tm
(x,y) bt k.
y ta thy v c ng trn
tm gc to ta ch cn tm phng
php v cung mt phn tm AB, v vi cc php ly i xng ta s c cc phn
cn li ca ng trn.
Vi cung AB th r rng dc ca n thuc on [-1,0]. iu ny ta c th
d dng thy qua gc ca tip tuyn vi cung AB hay qua o hm phng
trnh biu din cung AB.
V cung AB c dc trong khong [-1,0], nn ta suy ra rng trn ton b
cung AB khi bin s x tng th bin s y gim, v tc thay i ca y chm
hn ca x. T y ta c th ra mt quy trnh dng cung AB l:
Cho bin s x nhn ln lt cc gi tr nguyn t xa n xb. Vi mi gi tr x ta
thc hin:
Tm gi tr y nguyn tng ng im c to nguyn (x,y) s l im
gn nht im (x,ycircle) thuc ng trn
V im (x,y) tm c v cc i xng ca n c c ng trn
Trong mc ny ta s i tm hiu 2 thut ton cho php dng ng trn (thc
cht l dng cung AB v cc i xng ca n) mt cch hiu qu v mt tc
.

III.1. Thut ton v ng trn MidPoint


Thut ton MidPoint hay cn gi l thut ton xt im gia.
im u tin c chn v s l im A(0,R), ngha l: (x0,y0)=(0,R)
Gi s n bc th i ta chn c im (xi,yi) v. Cu hi t ra l n
bc th i+1 ta s chn im (xi+1,yi+1) c gi tr bng bao nhiu?
V im tip theo s chn theo quy tc ni trn, nn c honh x tng
mt gi so vi gi tr ca im chn trc, hay ni cch khc l:
11

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

xi+1=xi+1
ng thi v trn cung AB khi x tng th y gim v tc thay i ca y
chm hn ca x, nn r rng ta thy l vi gi tr x tng 1 th gi tr y s gim
i mt lng -1y0. M im chn bc trc l (xi,yi) nn im chn tip
theo (xi+1,yi+1) ch c th l mt trong hai im P(xi+1,yi) v Q(xi+1,yi-1).
xi

xi+1

yi-1

I
yi

Cung AB
P

quyt nh c im chn l P hay Q chng ta hng n mt biu thc


m du ca n cho php chng ta ra quyt nh chn im no.
Trc ht chng ta xt hm:

Vi mt im M(x,y) th r rng ta c:

K
>0
<0

f circle ( x, y ) = x 2 + y 2 R 2

M
R

circle(M) = (x,y) = x2 + y2 R2 <0 khi v


ch khi im M nm trong ng trn (tm
O bn knh R)
circle(M) = (x,y) = x2 + y2 R2 >0 khi v
ch khi im M nm ngoi ng trn (tm
O bn knh R)
circle(M) = (x,y) = x2 + y2 R2 =0 khi v
ch khi im M nm trn ng trn

T kt qu trn, nu ta gi I l trung im ca PQ th I(xi+1,yi-0.5) v:


t Pi=circle(I)=circle (xi+1,yi-0.5)=(xi+1)2 + (yi -0.5)2 R2

(a)

Khi Pi = circle(I) <0 th im I nm trong ng trn (tm O bn knh R), v th


im P s gn vi ng trn hn im Q, do ta s chn im P lm im
biu din (v).
Khi Pi = circle(I) >0 th im I nm ngoi ng trn, v th im Q s gn vi
ng trn hn im P, do ta s chn im Q lm im biu din.

12

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

Khi Pi = circle(I) =0 th im I nm trn ng trn, suy ra kh nng la chn P


v Q l nh nhau, song ta phi quyt nh chn mt im. Trong tnh hung
ny thut ton quy nh chn im Q.
Vy t y ta thy c th da vo du ca biu thc Pi ra quyt nh chn im
tip theo.
thut ton c n gin ngi ta ti u ho vic tnh Pi theo cng thc
truy hi:
Pi+1 =(xi+1+1,yi+1-0.5)=(xi+1+1)2 + (yi+1 -0.5)2 R2

(b)

Du ca Pi s quyt nh gi tr Pi+1 c th nh sau:


Nu Pi <0: th im chn tip theo l P(xi+1,yi), ngha l (xi+1,yi+1)=(xi+1,yi).
Thay vo (b) ta c:
Pi+1=(xi+1+1)2 + (yi -0.5)2 R2 = Pi+ 2(xi+1)+1 = Pi + 2xi +3
Nu Pi 0: th im chn tip theo l Q(xi+1,yi-1), ngha l (xi+1,yi+1)=(xi+1,yi1).
Thay vo (b) ta c:
Pi+1=(xi+1+1)2 + (yi -1 - 0.5)2 R2 = Pi+ 2(xi+1)+1-2(yi-0.5)+1 = Pi + 2(xi
yi) +5
u tin ta chn im A(0,R), ngha l (x0,y0)=(0,R), Thay vo (a) ta c:
P0 = 1 R +

1 5
= R
4 4

Vy quy trnh v c thc hin nh sau:

Tnh P0, v im (x0,y0)=(0,R)


Da vo du ca P0 ta li chn c im v tip theo (x1,y1) v gi tr P1
Da vo du ca P1 ta li chn c im v tip theo (x2,y2) v gi tr P2
Qu trnh trn c lp i lp li cho n khi ta v c im nguyn gn nht
vi B.

Mt im ng ch y cc gi tr P tip theo c c bng cch cng vi


gi tr P trc vi mt lng nguyn 2xi +3 hoc 2(xi yi) +5 tu theo du
ca P. Song nu gi tr P khi u l P0 = 1 R +

1
l mt gi tr thc s lm
4

cho vic tnh cc gi tr P tip theo cng phi x l trn trng s thc. Mt
iu d thy l nu ta thay i gi tr P0 khi u l 1-R th du ca P0 v cc Pi
c c sau khng h thay i v du (mt d c b gim mt lng 0.25)
do kt qu thut ton khng h b thay i, song cc tnh ton gi tr P ch
phi tnh trn trng s nguyn.
III.1.a. Tm tt thut ton v ng trn MidPoint :
Bc 1: P0 = 1 R; (x0,y0)=(0,R)
13

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

V im (x0,y0)
Bc 2: Vi mi gi tr i (i=0,1,2,) ta xt du Pi
Nu Pi<0: th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi)
Pi+1=Pi+ 2xi +3
Ngc li (tc Pi 0): th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi -1)
Pi+1=Pi + 2(xi - yi) +5
V im (xi+1,yi+1) va tm c
Bc 3: Lp li bc 2 vi nhng gi tr i tip theo, cho n khi ta v c
im nguyn gn nht vi B, ngha l xi+1 = Trunc(xb) = Trunc (

R
2

) th thut

ton kt thc.
III.1.b. Ci t
Sinh vin cn xy dng mt th tc v ng trn theo thut ton trnh by
trn.

14

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

(Hnh v minh ha)

III.2. Thut ton v ng trn Bresenham


Lp lun tng t thut ton trn song khng dng hm circle m dng biu
thc (d1 d2). C th trnh by thut gii nh sau:
im u tin c chn v s l im A(0,R), ngha l: (x0,y0)=(0,R)
Gi s n bc th i ta chn c im (xi,yi) v. Cu hi t ra l n
bc th i+1 ta s chn im (xi+1,yi+1) c gi tr bng bao nhiu?

15

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

V im tip theo s chn theo quy tc ni trn s c honh x tng


mt gi so vi gi tr ca im chn trc, hay ni cch khc l:
xi+1=xi+1
ng thi v trn cung AB khi x tng th y gim v tc thay i ca y
chm hn ca x, nn r rng ta thy l vi gi tr x tng 1 th gi tr y s gim
i mt lng -1y0. M im chn bc trc l (xi,yi) nn im chn tip
theo (xi+1,yi+1) ch c th l mt trong hai im P(xi+1,yi) v Q(xi+1,yi-1).
quyt nh c im chn l P hay Q chng ta hng n mt biu thc
m du ca n cho php chng ta ra quyt nh chn im no.
t:

d1=yP2 - y2
P

d2=y2 - yQ2

(gi tr y y chnh l tung ca cung AB ng vi honh x = xi +1)


t Pi = d1 d2 = yP2 + yQ2 - 2y2 = yi2 + (yi-1)2 - 2(R2 - xi+12 )= yi2 + (yi1)2 - 2(R2 - (xi +1)2)
= yi2 + (yi-1)2 - 2R2 + 2(xi +1)2

(a)

Du ca biu thc Pi cho php xc nh im chn tip theo l P hay Q.


Khi Pi <0: th im P s gn vi ng trn hn im Q, do ta s chn im
P lm im biu din (v).
Khi Pi >0: th im Q s gn vi ng trn hn im P, do ta s chn im
Q lm im biu din.
Khi Pi =0: khong cch t P v Q n ng trn u bng nhau, nn ta c th
chn P hay Q u c. Trong tnh hung ny thut ton quy c chn im Q
lm im biu din.
Vy t y ta thy c th da vo du ca biu thc Pi ra quyt nh chn im
tip theo.
thut ton c n gin ngi ta ti u ho vic tnh Pi theo cng thc
truy hi:
Pi+1 = yi+12 + (yi+1-1)2 - 2R2 + 2(xi+1 +1)2

(b)

Du ca Pi s quyt nh gi tr Pi+1 c th nh sau:


Nu Pi <0: th im chn tip theo l P(xi+1,yi), ngha l (xi+1,yi+1)=(xi+1,yi).
Thay vo (b) ta c:
Pi+1= yi2 + (yi-1)2 - 2R2 + 2((xi +1)+1)2 = Pi + 2(2(xi+1)+1) = Pi +4xi +6
16

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

Nu Pi 0: th im chn tip theo l Q(xi+1,yi-1), ngha l (xi+1,yi+1)=(xi+1,yi1).


Thay vo (b) ta c:
Pi+1= (yi -1)2 + (yi-2)2 - 2R2 + 2((xi +1)+1)2 = Pi +( -4yi+4) + 2(2(xi+1)+1)
= Pi + 4(xi - yi) +10
u tin ta chn im A(0,R), ngha l (x0,y0)=(0,R), Thay vo (a) ta c:
P0

= y02 + (y0-1)2 - 2R2 + 2(x0 +1)2 = R2 + (R-1)2 -2R2 + 2


= R2 + R2 -2R +1 -2R2 + 2 = 3 - 2R

Vy quy trnh v c thc hin nh sau:

Tnh P0, v im (x0,y0)=(0,R)


Da vo du ca P0 ta li chn c im v tip theo (x1,y1) v gi tr P1
Da vo du ca P1 ta li chn c im v tip theo (x2,y2) v gi tr P2
Qu trnh trn c lp i lp li cho n khi ta v c im nguyn gn nht
vi B.

III.2.a. Tm tt thut ton v ng trn Bresenham :


Bc 1: P0 = 3 - 2R; (x0,y0)=(0,R)
V im (x0,y0)
Bc 2: Vi mi gi tr i (i=0,1,2,) ta xt du Pi
Nu Pi<0: th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi)
Pi+1=Pi+ 4xi +6
Ngc li (tc Pi 0): th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi -1)
Pi+1=Pi + 4(xi - yi) +10
V im (xi+1,yi+1) va tm c

17

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

Bc 3: Lp li bc 2 vi nhng gi tr i tip theo, cho n khi ta v c


im nguyn gn nht vi B, ngha l xi+1 = Trunc(xb) = Trunc (

) th thut

ton kt thc.
III.2.b. Ci t
Sinh vin cn ci t mt th tc v ng trn theo thut ton Bresenham v
chng trnh s dng th tc v cc ng trn ngu nhin.

IV. Thut ton v Ellipse


Phng trnh chnh tc ca Ellipse c dng:

A(0,b)
C(x0, y0)

B(a,0)

x2 y2
+
=1
a2 b2

(I)

dng c ellipse r rng


l ta ch cn tm cch dng
cung AB, cn cc phn cn
li d dng c c bng
cch ly i xng. Song vi
t tng chung dng mt
ng bt k l cn phi xc
nh ra cc min m trn
ton min mt bin s
bin thin nhanh hn mt
bin s khc.

R rng trn cung AB th dc gim lin tc t im A ( dc bng 0) n B


( dc tin n -). Xt v tc bin thin ca 2 bin s th:
Tc bin thin ca bin s X gim dn t A n B.
Tc bin thin ca bin s Y tng dn t A n B.
R rng trn cung AB phi c mt im m ti tc bin thin ca X v Y l
bng nhau (song x tng th y gim), chnh l im m ti c dc bng -1.
Gi C(x0,y0) l im nm trn cung AB ca ellipse m tip tuyn ti c dc
bng -1. Khi tip tuyn d ca ellipse s c dng:
xx0 yy0
+ 2 =1
a2
b

Mt khc do dc ca d l:

x0 b 2

= 1 nn ta suy ra
y0 a 2

18

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti


b2
y 0 = 2 x0
a

b4 2
( y ta c x0 0) => y = 4 x0
a

(a)

2
0

x 02 y 02
+
=1
a2 b2

mt khc do C thuc ellipse nn ta c:


x0 =

T (a) v (b) ta suy ra:

a2
a2 + b2

v y 0 =

(b)
b2
a2 + b2

Ta s trnh by gi thut v cung AC (i t A n C theo chiu kim ng h).


Cung CB c thc hin mt cch tng t khi ta i vai tr ca x v y. Cc phn
cn li ca ellipse c c bng cch ly i xng.
Trn cung AC dc nm trong on [0,-1], ngha l x tng th y gim v tc
bin thin ca x ln hn ca y. Vy nn t tng ca thut gii dng cung
AC s l cho tham s x bin thin tun t t xa n xc vi cc gi tr nguyn, v
vi mi gi tr x nh vy ta tm mt gi tr y nguyn gn nht vi gi tr y thc
ca ellipse tng ng vi x.
Sau y chng ta s tm hiu thut ton Bresenham p dng cho dng ellipse.

IV.1. Thut ton Bresenham cho v hnh Ellipse


R rng im u tin c chn v s l im A(0,b), ngha l:
(x0,y0)=(0,b)
Gi s n bc th i ta chn c im (xi,yi) v. Cu hi t ra l n
bc th i+1 ta s chn im (xi+1,yi+1) c gi tr bng bao nhiu?
V im tip theo s c honh x tng mt gi tr so vi gi tr ca im
chn trc, hay ni cch khc l:
xi+1=xi+1
ng thi v trn cung AC khi x tng th y gim v tc thay i ca y
chm hn ca x, nn r rng ta thy l vi gi tr x tng 1 th gi tr y s gim
i mt lng -1y0. M im chn bc trc l (xi,yi) nn im chn tip
theo (xi+1,yi+1) ch c th l mt trong hai im P(xi+1,yi) v Q(xi+1,yi-1).
quyt nh c im chn l P hay Q chng ta hng n mt biu thc
m du ca n cho php chng ta ra quyt nh chn im no.
t:

d1=yP2 - y2
P

d2=y2 - yQ2

(gi tr y y l tung ca cung AC ng vi honh ang xt xi+1 )


t Pi = (d1 d2 ).a2
19

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti


2

= [yP +
(yi-1)2 -

yQ2

- 2y ]a = [

yi2

b 2 ( a 2 xi+2 1 )
+ (yi-1) - 2(
)]a2 = [yi2 +
2
a
2

2b 2 ( a 2 ( xi + 1) 2 ) 2
]a
a2

= yi2 .a2 + (yi-1)2 .a2 - 2b2[a2 (xi +1)2]


= yi2 .a2 + (yi-1)2 .a2 - 2b2a2 + 2b2(xi +1)2

(a)

(lng a2 c a vo nhm mc ch kh mu ca (d1-d2) song khng lm cho


Pi v (d1- d2) khc du )
Du ca biu thc Pi cho php xc nh im chn tip theo l P hay Q.
Khi Pi <0: th im P s st vi cung AC hn im Q, do ta s chn im P
lm im biu din (v).
Khi Pi >0: th im Q s st vi cung AC hn im P, do ta s chn im Q
lm im biu din.
Khi Pi =0: khong cch t P v Q n cung AC u bng nhau, nn ta c th
chn P hay Q u c. Trong tnh hung ny thut ton quy c chn im Q
lm im biu din
Vy t y ta thy c th da vo du ca biu thc Pi ra quyt nh chn im
tip theo.
thut ton c n gin ngi ta ti u ho vic tnh Pi theo cng thc
truy hi:
Pi+1 = yi+12 .a2 + (yi+1-1)2.a2 - 2b2a2 + 2b2(xi+1 +1)2

(b)

Du ca Pi s quyt nh gi tr Pi+1 c th nh sau:


Nu Pi <0: th im chn tip theo l P(xi+1,yi), ngha l (xi+1,yi+1)=(xi+1,yi).
Thay vo (b) ta c:
Pi+1

= yi2 .a2 + (yi-1)2.a2 - 2b2a2 + 2b2[(xi +1)+1]2


= Pi +2b2[2(xi+1)+1]
= Pi + 2b2(2xi + 3)

Nu Pi 0: th im chn tip theo l Q(xi+1,yi-1), ngha l (xi+1,yi+1)=(xi+1,yi1).


Thay vo (b) ta c:

20

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

Pi+1

= (yi-1)2 .a2 + (yi-2)2.a2 - 2b2a2 + 2b2[(xi +1)+1]2


= Pi + a2(-4yi +4) + 2b2[2(xi+1)+1]
= Pi + 4a2(1-yi) + 2b2(2xi + 3)
= Pi + 2b2(2xi + 3) + 4a2(1-yi)

u tin ta chn im A(0,b), ngha l (x0,y0)=(0,b), Thay vo (a) ta c:


P0

= y02 .a2 + (y0-1)2 .a2 - 2b2a2 + 2b2(x0 +1)2 =b2a2 +(b-1)2a2 -2a2b2 + 2b2
= b2a2 +a2b2 -2a2b +a2 -2a2b2 +2b2 = -2a2b +a2 +2b2
= a2(1-2b) + 2b2

Vy quy trnh v c thc hin nh sau:

Tnh P0, v im (x0,y0)=(0,b)


Da vo du ca P0 ta li chn c im v tip theo (x1,y1) v gi tr P1
Da vo du ca P1 ta li chn c im v tip theo (x2,y2) v gi tr P2
Qu trnh trn c lp i lp li cho n khi ta v c im nguyn gn nht
vi C.

IV.1.a.

Tm tt thut ton Bresenham cho v Ellipse:

Bc 1: P0 = a2(1-2b) + 2b2 ; (x0,y0)=(0,b)


V im (x0,y0)
Bc 2: Vi mi gi tr i (i=0,1,2,) ta xt du Pi
Nu Pi<0: th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi)
Pi+1=Pi+ 2b2(2xi + 3)
Ngc li (tc Pi 0): th chn im tip theo l
(xi+1,yi+1)=(xi+1,yi -1)
Pi+1=Pi + 2b2(2xi + 3) + 4a2(1-yi)
V im (xi+1,yi+1) va tm c

21

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

Bc 3: Lp li bc 2 vi nhng gi tr i tip theo, cho n khi ta v c


im nguyn gn nht vi C, ngha l xi+1 = Trunc(xC) = Trunc (

a2
a2 + b2

) th

thut ton kt thc.

Ch :
Tm tt thut ton trn ch p dng cho on AC. dng on BC ta cn
c s thay i vai tr ca ca x v y cng nh a v b. C th dng c
cung BC cn hon i trong ton b thut ton: x thnh y v y ngc li
thnh x, a thnh b v b ngc li thnh a.
V thut ton ch v n Trunc(xc) nn nu phn l ca xc ln hn 0.5 (v d
Trunc(xc=7.65)=7). Nu iu ny c thc hin trn c 2 cung AC v BC
th s dn n hnh nh ghp ni ca 2 cung l cung AB s thiu 1 im ti
C. trnh trnh trng ny th chng ta c th p dng Trunc() trn mt
cung, cn cung cn li p dung Round().
IV.1.b. Ci t thut ton Bresenham cho dng Ellipse
Sau y l mt chng trnh v d cho thut ton. Chng trnh ci t th tc v
Ellipse c tn l Bre_Ellipse theo thut ton trnh by trn, v chng trnh s
dng th tc Bre_Ellipse v cc hnh Ellipse mt cch ngu nhin.
uses graph,crt;
procedure init;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,' ');
ErrCode := GraphResult;
if ErrCode <> grOk then
begin Writeln('Graphics error:', GraphErrorMsg(ErrCode));readln;halt end;
end;
procedure Bre_Ellipse(xt,yt:Integer;A,B:longint);
var x,y,P,Const1, Const2:longint; color:byte;
Procedure Put(x,y:integer);
begin
putpixel(x+xt,-y+yt,color);
putpixel(x+xt,y+yt,color);
putpixel(-x+xt,-y+yt,color);
putpixel(-x+xt,y+yt,color);
22

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

end;
begin
Color:=Getcolor;
{Ve cung AC}
const1:=trunc(sqr(a) / sqrt(sqr(a)+sqr(b)));
x:=0;y:=b;P:=a*a*(1-2*b)-2*b*b;put(x,y);
repeat
if p<0 then
p:=p+2*b*b*(2*x+3)
else
begin
p:=p+2*b*b*(2*x+3)+4*a*a*(1-y);
y:=y-1;
end;
x:=x+1;
put(x,y);
until x=const1;
{Ve cung BC}
{const2:=trunc(sqr(b) / sqrt(sqr(a)+sqr(b)));}
Const2:=Const1+1;
{ Thay v qu trnh lp c xt trn y, chng ta c th lm iu tng t bng cch
xt trn x. Bit rng trn ton b cung AB th x s bin thin t 0 n a, m trc
khi dng cung AC ta cho x bin thin trong on [0, Const1], vy trn cung BC x
phi bin thin trong on [Const1+1, a ] th s m bo hai cung AC v CB ghp ni
lin tc vi nhau. }
y:=0;x:=a;P:=b*b*(1-2*a)-2*a*a;put(x,y);
repeat
if p<0 then
p:=p+2*a*a*(2*y+3)
else
begin
p:=p+2*a*a*(2*y+3)+4*b*b*(1-x);
x:=x-1;
end;
y:=y+1;
put(x,y);
until x=const2;
end;
var a,b:longint;
BEGIN
init;
randomize;
repeat
a:=random(100)+50;b:=random(100)+50;
setcolor(random(15)+1);
Bre_Ellipse(getmaxx div 2,getmaxy div 2,a,b);

23

Chng 1.Cc yu t c s ca ha Nguyn Hu Ti

until readkey=#27;
closegraph;
END.

V. Bi

tp cui chng

1. Cho im A(5,7) v B(15,15). S dng thut ton Bresenham cho tm


to cc im v (xi , yi).
2. Ci t mt th tc v ng thng tng qut (x l c vi tt c mi tnh
hung) theo thut ton Bresenham.
3. S dng thut ton v ng trn Midpoint tnh gi tr cc im v (xi ,
yi) bit rng R=20.
4. Ci t mt th tc v ng trn theo thut ton MidPoint.
5. Ci t mt th tc cho php t mu phn din tch bn trong ca ng
trn. Th tc c dng FillCircle(x,y:integer; R:word; FillColor: byte);
6. Ci t mt th tc t mu phn bn trong ca mt Ellipse.
7. Hy xy dng mt thut ton dng ng cong bc 2 (Parabol) dng
tng qut:
y = ax2 + bx + c
trn mt khong xc nh [x1,x2]
8. Vit chng trnh v Parabol:
9. Hy xy dng mt th vin ho ring vi cc th tc v cc ng c
bn do bn t vit.

24

Chng II: Cc h mu & c ch t chc b nh


Card mn hnh

I. i nt v cu trc mn hnh mu

(Mu sc v s giao thoa)

(Hnh nh cu to chi tit bn trong mt mn hnh mu)

25

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

2 loi cu trc mn hnh


(a) shadow mask color CRT (b) aperture grille color CRT

Hnh nh phng i cu trc 2 loi mn hnh mu


(a) shadow mask color CRT (b) aperture grille color CRT

( nh biu din ca mt m tn mu trng, v mt ch E trn my tnh c phng ln)

26

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

II. Cc h mu
Trn cc thit b hin th nh mn hnh my tnh, mn hnh Tivi v phn ln
cc thit b hin th mu thng dng khc ngi ta chn 3 mu Red, Green v Blue
biu din tt c cc mu sc khc nhau ca hnh nh, cng nh ngi ho s
ch dng mt s mu c bn song cc bc tranh c v ra li rt phong ph v
mu sc. Mt cu hi t ra l ti sao li chn 3 mu trn m khng phi l mt
nhm mu no khc. tr li cu hi ny chng ta hy tm hiu qua v cu to
mt ngi.
Mt con ngi chng ta cm nhn mu sc thng qua cc t bo vng m
hnh nn. Ba mu Red, Green v Blue c mt con ngi cm nhn r nht,
chng c bc song di ln lt l 580nm, 545nm v 440nm. S ho trn ca 3
bc sng ny s cho ta c nhng mu sc khc. Nm 1981 The Commission
International de lEclairage (gi tt l CIE) xy dng mt chun l tt c cc
mu nn xy dng thng qua thnh phn mu chnh l Red, Green v Blue.
Chun ny u tin c xy dng cho cc h v tuyn truyn hnh v ngay
c trong cc my tnh. D nhin khng phi tt c cc mu u c th biu din
thng qua 3 thnh phn ny, nhng hu ht tt c u c th chuyn c.
Hiu nay khng phi ch c h mu RGB m cn c nhng h khc nh:
HSV, HSL, YIQ, v mt h mu mi y l h HVC (Hue, Value, Color). By gi
chng ta hy xem xt tng h mt.

II.1. H RGB
RGB l ch vit tt ca 3 t Red, Green v Blue. H ny c min khng
gian gi tr l mt khi 3 chiu. Mi mu xc nh trn 3 thnh phn l R, G, B. S
gia gim cc thnh phn ny s to ra cc mu sc khc nhau to nn mt khng
gian mu.
Cng ca mi thnh phn R,G,B c m ho trong cc mc khc
nhau. C cc mc m ho kh ph bin l: M ho 16, 64 v 256 mc. Hin nay
mc m ho 256 mc l ph bin (t 0 n 255). Nu cng ca mi thnh
phn c m ho trong 256 mc th cn 8bt m ho, vy mt mu biu din
bi 3 thnh phn RGB s lu tr bi 24 bt, ch ny thng c gi l ch
my thc (True color -24 bit) bi v n c th biu bin n khong 16,7 triu
mu.

27

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

Blue(0,0,255)
Mageta
(255,0,255)

Black(0,0,0)
Red
(255,0,0)

Cyan
(0,255,255)

White
(255,255,255)

Green
(0,255,0)
Yellow
(255,255,0)

Khng gian mu trong ch True color

II.2. H mu CMY
l 3 ch vit tt Cyan (mu lc lam), Magenta (mu ti), Yellow.
Cng thc chuyn i t h RGB sang h CMY nh sau:
C = 1-R
M = 1-G
Y = 1-B

(H mu CMYK chuyn dng trong in n)

28

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

II.3. H mu HSV

l nhng ch vit tt cho 3 ch sau: Hue (mu sc), Saturation (s bo ho) v


Value. Ba mu Red, Green v Blue c l l 3 mu m mt con ngi cm nhn nh
sng ch khng phi l mu m mt con ngi cm nhn mu sc. Mu sc (Hue,
hay color) c o bi tn s nh sng, cn sng c o bi cng . Mu
cng sng th cng cng ln. H HSV c biu din bng hnh v sau:

Hue c gi tr t 0 360, trong khi S v V c gi tr trong khong 0 255


(hoc dng s thc l 0.0 1.0). Mu hon ton c biu din l (0
,255,255), mu xanh (green) c biu din l (120 ,255,255).

29

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

Di y l phn tham kho v cc hm chuyn i qua li gia 2 h mu RGB v HSV

30

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

RGBtoHSV

USES
Math,
// MaxValue
IEEE754, // NaN, IsNaN
SysUtils; // Exception
TYPE
EColorError = CLASS(Exception);
TReal = DOUBLE;
...
// RGB, each 0 to 255, to HSV.
// H = 0.0 to 360.0 (corresponding to 0..360.0 degrees around hexcone)
// S = 0.0 (shade of gray) to 1.0 (pure color)
// V = 0.0 (black) to 1.0 {white)
// Based on C Code in "Computer Graphics -- Principles and Practice,"
// Foley et al, 1996, p. 592.
PROCEDURE RGBToHSV (CONST R,G,B: TReal; VAR H,S,V: TReal);
VAR
Delta: TReal;
Min : TReal;
BEGIN
Min := MinValue( [R, G, B] ); // USES Math
V := MaxValue( [R, G, B] );

31

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

Delta := V - Min;
// Calculate saturation: saturation is 0 if r, g and b are all 0
IF
V = 0.0
THEN S := 0
ELSE S := Delta / V;
IF
S = 0.0
THEN H := NaN // Achromatic: When s = 0, h is undefined
ELSE BEGIN
// Chromatic
IF
R=V
THEN // between yellow and magenta [degrees]
H := 60.0 * (G - B) / Delta
ELSE
IF
G=V
THEN // between cyan and yellow
H := 120.0 + 60.0 * (B - R) / Delta
ELSE
IF
B=V
THEN // between magenta and cyan
H := 240.0 + 60.0 * (R - G) / Delta;
IF H < 0.0
THEN H := H + 360.0
END
END {RGBtoHSV};

HSVtoRGB
// Based on C Code in "Computer Graphics -- Principles and Practice,"
// Foley et al, 1996, p. 593.
//
// H = 0.0 to 360.0 (corresponding to 0..360 degrees around hexcone)
// NaN (undefined) for S = 0
// S = 0.0 (shade of gray) to 1.0 (pure color)
// V = 0.0 (black) to 1.0 (white)

PROCEDURE HSVtoRGB (CONST H,S,V: TReal; VAR R,G,B: TReal);


VAR
f : TReal;
i : INTEGER;
hTemp: TReal; // since H is CONST parameter
p,q,t: TReal;
BEGIN
IF
S = 0.0 // color is on black-and-white center line
THEN BEGIN
IF
IsNaN(H)

32

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

THEN BEGIN
R := V;
// achromatic: shades of gray
G := V;
B := V
END
ELSE RAISE EColorError.Create('HSVtoRGB: S = 0 and H has a value');
END
ELSE BEGIN // chromatic color
IF
H = 360.0
// 360 degrees same as 0 degrees
THEN hTemp := 0.0
ELSE hTemp := H;
hTemp := hTemp / 60;
i := TRUNC(hTemp);
f := hTemp - i;

// h is now IN [0,6)
// largest integer <= h
// fractional part of h

p := V * (1.0 - S);
q := V * (1.0 - (S * f));
t := V * (1.0 - (S * (1.0 - f)));
CASE i OF
0: BEGIN R := V; G := t; B := p
1: BEGIN R := q; G := V; B := p
2: BEGIN R := p; G := V; B := t
3: BEGIN R := p; G := q; B := V
4: BEGIN R := t; G := p; B := V
5: BEGIN R := V; G := p; B := q
END
END
END {HSVtoRGB};

END;
END;
END;
END;
END;
END

Ngoi mt s h mu trn cn c mt vi h mu khc:

(H mu Lab)

33

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

III. C ch t chc b nh Card mn hnh


B nh mn hnh c nh a ch lgic bt u t:
B800:0000 vi ch text
A000:0000 vi cc ch ho
Trong phn ny ta ch cp n ch ho.
Thng tin hin th trn mn hnh c b tr trong b nh bt u t
A000:0000, song cch b tr nh th no li ph thuc vo ch (mode) mn
hnh m ta chn hot ng. Thng thng mt card iu khin ho c th
hot ng trong nhiu mode khc nhau, v ra ch th cho card hot ng theo
mode ta cn gi n cc phc v ca Bios vi hm phc v t ch mn hnh v
tham s mode.
Do c rt nhiu Mode ho khc nhau v mi mode li c mt c ch b tr
thng tin ring. Trong phn ny ch trnh by hai mode:
Mt mode kh thng dng, c dng ch yu trong cc tr chi l
mode 13Hexa, y l mode vi phn gii l 320x200 vi 256 mu,
trong ch ny mt byte trong vng nh mn hnh lu tr thng tin
ca mt im, hay ni cch khc l c s tng ng 1 1 gia im v
byte nh trong vng nh mn hnh.
Chun Vesa (Video Electronics Standards Association): Hu nh tt c
cc Card iu khin mn hnh thng dng u h tr mode ny. Vi
mode bn c th t phn gii t 640x400, 640x480, ln n
1024x800 hay cao hn na tu vo kh nng k thut ca Card m bn
c. Tng t mu sc c th t 16 mu, 256 mu, Hight color -16 bit
hay True color - 24 bit hay 32 bt.

III.1. C ch hot ng ca ch mn hnh 320x200x256 mu


Trong ch ny mn hnh c chia ra 320 ct v 200 hng to nn
320x200 pixel, tuy phn gii thp song n li c u im l truy cp nhanh
chng v c ch b tr thng tin n gin. Pixel[ct 0,dng 0] ( gc trn bn tri
mn hnh) tng ng vi byte nh c a ch A000:0000, tng t Pixel[ct
1,dng 0] tng ng vi byte nh c a ch A000:0001,
Hay ni mt cch tng qut th pixel ti ct x dng y tng ng vi byte nh
[A000:(y*320+x)]
Lnh sau cho php v mu c s 255 cho im c to (x,y):
Mem[$A000:(y*320+x)]:=255
Cu lnh trn cho php v ra mn hnh 1 im c mu 255 ti v tr (x,y). Song
mu c s 255 l mu nh th no li ph thuc vo thanh ghi mu s 255 lu tr
cc gi tr RGB m t cch ho ra mu 255 nh th no.
quyt nh mu cho mt thanh ghi mu ta cn n cc phc v t gi tr cho
thanh ghi mu ca Bios.
34

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

III.1.a. Ci t
Sau y l mt th vin ho (mang tnh minh ha) xy dng trn mode 13 hexa
vi phn gii v mu sc l 320x200x256 mu.
unit Graph_13;
Interface
{**********************************************************}
uses crt,dos;
type screen=array[0..199,0..319] of byte;
const MaxPolygon=1000;
type pointtype=record
x,y:integer;
end;
Polygo=array[1..MaxPolygon] of pointtype;
Polygon=^PolyGo;
FillPatternType = array[1..8] of byte;
FillStyle=array[1..8,1..8] of byte;
var _Scr:^screen;_Color,_BKColor,_FillColor:byte;_X,_Y:integer;
_FillPattern:FillPatternType;_Fill:FillStyle;
_Page:array[1..5] of ^screen;_CurrentPage,_CountPage:byte;
(**************************************)
procedure Init(mode:byte);
Procedure setRGB(num:byte;R,G,B:byte);
procedure SetGroupcolorRegs(starcolorReg,num:integer; segment,offset:word);
Function NewPage:byte;
Function ReleasePage(Page:byte):boolean;
Function SetActive(page:byte):boolean;
Procedure Displace(page:byte);
Function GetmaxX:integer;
Function GetmaxY:integer;
procedure setcolor(color:byte);
Function GetColor:byte;
Procedure MakeFillStyle;
procedure SetFillPattern(Pattern: FillPatternType; Color: Word);
Procedure SetfillStyle(Pattern:word;Color:byte);
Procedure MoveTo(x,y:integer);
Procedure putpixel(x,y:integer;Color:byte);
Procedure lineNgang(x1,x2,y:integer);
procedure line(x1,y1,x2,y2:integer);
Procedure LineTo(x,y:integer);
Procedure Circle(xt,yt,R:integer);
Procedure FillCircle(xt,yt,R:integer);
Procedure Bar(x1,y1,x2,y2:integer);
Procedure FillTamGiac(x1,y1,x2,y2,x3,y3:integer);
Procedure drawpoly(N:integer;A:polygon);
procedure fillpoly(N:integer;A:polygon);
procedure Fillpoly1(N:integer;A:polygon);
Procedure Spline(N:integer;P:polygon);
35

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

{**********************************************************}
Implementation
{**********************************************************}
procedure Init(mode:byte);
begin
asm
mov ah,0
mov al,mode
int $10
end;
if mode=$13 then
begin _scr:=ptr($a000,$0000);_X:=0;_Y:=0;
_Color:=255;_Color:=0;_FillColor:=255;
_CurrentPage:=0;_CountPage:=0;
end;
end;
Procedure setRGB(num:byte;R,G,B:byte);
(* Dat noi dung thanh ghi mau *)
var Regs:registers;mau:longint;
begin
with Regs do
begin
ah:=$10;
al:=$10;
bx:=num;
dh:=R;
ch:=G;
cl:=B;
intr($10,regs);
end
end;
procedure SetGroupcolorRegs(starcolorReg,num:integer; segment,offset:word);
(* Dat mot nhom thanh ghi mau *)
var Regs:registers;
begin
with regs do
begin
ah:=$10; al:=$12;
bx:=starcolorreg;cx:=num;
es:=segment; dx:=offset;
intr($10,regs);
end;
end;
Function NewPage:byte;
begin
if _CountPage<5 then
begin
_CountPage:=_CountPage+1;

36

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

Getmem(_Page[_CountPage],320*200);
NewPage:=_CountPage;
fillchar(_Page[_CountPage]^,320*200,0);
end
else
NewPage:=0;
end;
Function ReleasePage(Page:byte):boolean;
var i:byte;
begin
if (Page>0)and(Page<=_CountPage) then
begin
if (Page=_CountPage) then
Freemem(_Page[Page],320*200)
else
begin
Freemem(_Page[Page],320*200);
for i:=Page to _CountPage-1 do
_Page[i]:=_Page[i+1];
end;
_CountPage:=_CountPage-1;
ReleasePage:=true
end
else
ReleasePage:=false;
end;
Function SetActive(page:byte):boolean;
begin
if (page>0)and(page<=_CountPage) then
begin
_Scr:=@_Page[Page]^;
_CurrentPage:=Page;
end
else
if page=0 then _scr:=ptr($a000,$0000)
end;
Procedure Displace(page:byte);
begin
if (page>0)and(page<=_CountPage) then
begin
Move(_Page[Page]^,mem[$A000:0000],320*200);
end;
end;
Function GetmaxX:integer;
begin
GetmaxX:=319;
end;
Function GetmaxY:integer;

37

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

begin
GetmaxY:=199;
end;
procedure setcolor(color:byte);
begin
_Color:=color;
end;
Function GetColor:byte;
begin
GetColor:=_Color;
end;
Procedure MakeFillStyle;
var i,j:byte;
begin
for i:=1 to 8 do
for j:=1 to 8 do
if ((_FillPattern[i] shr (8-j)) and 1)=1 then
_Fill[i,j]:=_FillColor
else _Fill[i,j]:=_BKColor;
end;
procedure SetFillPattern(Pattern: FillPatternType; Color: Word);
begin
_FillPattern:=Pattern;
MakeFillStyle;
end;
Procedure MakePattern(Pattern:word);
var p:FillPatternType;
begin
Pattern:=Pattern mod 12;
case Pattern of
0:begin p[1]:=$0;p[2]:=$0;p[3]:=$0;p[4]:=$0;p[5]:=$0;
p[6]:=$0;p[7]:=$0;p[8]:=$0;
end;
1:begin p[1]:=$ac;p[2]:=$bc;p[3]:=$ce;p[4]:=$ee;p[5]:=$ff;
p[6]:=$fe;p[7]:=$1;p[8]:=$f1;
end;
2:begin
end;
3:begin
end;
4:begin
end;
5:begin
end;
6:begin
end;
7:begin
end;
8:begin
end;

38

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

9:begin
end;
10:begin
end;
11:begin
end;
end;
_FillPattern:=P;
MakeFillStyle;
end;
Procedure SetfillStyle(Pattern:word;Color:byte);
begin
_FillColor:=Color;MakePattern(Pattern);
end;
Procedure MoveTo(x,y:integer);
begin
_X:=x;_Y:=y;
end;
Procedure putpixel(x,y:integer;Color:byte);
begin
_Scr^[y,x]:=Color;
end;
{************** Thu tuc LineNgang **************}
procedure lineNgang(x1,x2,y:integer);
var segment,ofset,l:word;tam:integer;
begin
if x1>x2 then begin tam:=x1;x1:=x2;x2:=tam end;
segment:=seg(_Scr^[y,x1]);ofset:=ofs(_Scr^[y,x1]);l:=x2-x1+1;
ASM
push ES
mov DI,ofset
mov AX,segment
mov ES,AX
mov AL,_Color
mov CX,l
cld
rep stosb
pop ES
end;
end;
{************** Ket thuc Thu tuc LineNgang **************}
{************** Thu tuc Line **************}
procedure line(x1,y1,x2,y2:integer);
{************** Thu tuc hoan doi 2 dau mut **************}
procedure HoanDoiDau(var x1,y1,x2,y2:integer);
var tg:integer;
begin
tg:=x1;x1:=x2;x2:=tg;
tg:=y1;y1:=y2;y2:=tg;

39

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

end;
{************** Than cua thu tuc Line **************}
var P,dtx,dty,const1,const2,i:longint;segment,ofset,l:word;
begin
dtx:=x2-x1;dty:=y2-y1;
if dtx=0 then
begin
if y1>y2 then begin i:=y1;y1:=y2;y2:=i end;
for y1:=y1 to y2 do _Scr^[y1,x1]:=_Color;
end
else
if dty=0 then linengang(x1,x2,y1)
else
if (dty*dtx>0)and(abs(dty)<=abs(dtx)) then
begin {Line (0,1]}
if x1>x2 then HoanDoiDau(x1,y1,x2,y2);
dtx:=x2-x1;dty:=y2-y1;
const1:=dty*2; const2:=const1-2*dtx;
p:=const1-dtx;_Scr^[y1,x1]:=_Color;
while x1<x2 do
begin
x1:=x1+1;
if p<0 then
begin
_Scr^[y1,x1]:=_Color;
p:=p+const1;
end
else
begin
y1:=y1+1;
_Scr^[y1,x1]:=_Color;
p:=p+const2;
end;
end;
end
else
if (dtx*dty>0) then
begin {Line (1,vocung)}
HoanDoiDau(x1,x2,y1,y2);
if x1>x2 then HoanDoiDau(x1,y1,x2,y2);
dtx:=x2-x1;dty:=y2-y1;
const1:=dty*2; const2:=const1-2*dtx;
p:=const1-dtx;_Scr^[x1,y1]:=_Color;
while x1<x2 do
begin
x1:=x1+1;
if p<0 then
begin
_Scr^[x1,y1]:=_Color;
p:=p+const1;

40

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

end
else
begin
y1:=y1+1;
_Scr^[x1,y1]:=_Color;
p:=p+const2;
end;
end;
end
else
if (abs(dty)<=abs(dtx)) then
begin {Line [-1,0)}
y1:=-y1;y2:=-y2;
if x1>x2 then HoanDoiDau(x1,y1,x2,y2);
dtx:=x2-x1;dty:=y2-y1;
const1:=dty*2; const2:=const1-2*dtx;
p:=const1-dtx;_Scr^[-y1,x1]:=_Color;
while x1<x2 do
begin
x1:=x1+1;
if p<0 then
begin
_Scr^[-y1,x1]:=_Color;
p:=p+const1;
end
else
begin
y1:=y1+1;
_Scr^[-y1,x1]:=_Color;
p:=p+const2;
end;
end;
end
else
begin{Line (-1,am vo cung)}
HoanDoiDau(x1,x2,y1,y2);
y1:=-y1;y2:=-y2;
if x1>x2 then HoanDoiDau(x1,y1,x2,y2);
dtx:=x2-x1;dty:=y2-y1;
const1:=dty*2; const2:=const1-2*dtx;
p:=const1-dtx;_Scr^[x1,-y1]:=_Color;
while x1<x2 do
begin
x1:=x1+1;
if p<0 then
begin
_Scr^[x1,-y1]:=_Color;
p:=p+const1;
end
else

41

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

begin
y1:=y1+1;
_Scr^[x1,-y1]:=_Color;
p:=p+const2;
end;
end;
end;
end;
{************** Ket thuc Thu tuc Line **************}
{************** Thu tuc LineTo **************}
Procedure LineTo(x,y:integer);
begin
Line(_X,_Y,x,y);_X:=x;_Y:=y;
end;
{************** Ket thuc Thu tuc LineTo **************}
{************** Thu tuc Circle **************}
procedure Circle(xt,yt,R:integer);
var x,y,p:integer;mau:byte;s1:string;t,t1,t2:real;ch:char;
procedure putdiem(c,h:integer);
begin
_Scr^[h+yt,c+xt]:=_Color;
_Scr^[c+yt,h+xt]:=_Color;
_Scr^[-h+yt,-c+xt]:=_Color;
_Scr^[-c+yt,-h+xt]:=_Color;
_Scr^[h+yt,-c+xt]:=_Color;
_Scr^[c+yt,-h+xt]:=_Color;
_Scr^[-h+yt,c+xt]:=_Color;
_Scr^[-c+yt,h+xt]:=_Color;
end;
begin
P:=1-r;
putdiem(0,R);x:=0;y:=R;
while x<y do
begin
if p<0 then
p:=p+2*x+3
else
begin
p:=p+2*(x-y)+5;
y:=y-1;
end;
x:=x+1;
putdiem(x,y);
end;
end;
{**************Ket thu Thu tuc Circle **************}
{************** Thu tuc FillCircle **************}
procedure FillCircle(xt,yt,R:integer);
var x,y,p:integer;mau:byte;s1:string;t,t1,t2:real;ch:char;

42

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

procedure LineScan4(c,h:integer);
begin
line(c+xt,h+yt,-c+xt,h+yt);
line(c+xt,-h+yt,-c+xt,-h+yt);
line(h+xt,c+yt,-h+xt,c+yt);
line(h+xt,-c+yt,-h+xt,-c+yt);
end;
begin
P:=1-r;
LineScan4 (0,R);x:=0;y:=R;
while x<y do
begin
if p<0 then
p:=p+2*x+3
else
begin
p:=p+2*(x-y)+5;
y:=y-1;
end;
x:=x+1;
LineScan4 (x,y);
end;
end;
{************** Ket thu Thu tuc FillCircle **************}
{************** Thu tuc Bar **************}
Procedure Bar(x1,y1,x2,y2:integer);
var tam:integer;
begin
if y1>y2 then begin tam:=y1;y1:=y2;y2:=tam end;
for tam:=y1 to y2 do lineNgang(x1,x2,tam);
end;
{************** Ket thuc Thu tuc Bar **************}
{************** Thu tuc FillTamGiac **************}
Procedure FillTamGiac(x1,y1,x2,y2,x3,y3:integer);
procedure FillFlatTop(x1,x2,x3,y1,y2,y3:integer);
{Qui dinh y1=y2}
var X1_Change_Per_Pixel,X2_Change_Per_Pixel,x1_now,x2_now:real;y:integer;
begin
X1_Change_Per_Pixel:=(x3-x1)/(y3-y1);
X2_Change_Per_Pixel:=(x3-x2)/(y3-y2);
x1_now:=x1;x2_now:=x2;
for y:=y1 to y3 do
begin
linengang(round(x1_now),round(x2_now),y);
x1_now:=x1_now+X1_Change_Per_Pixel;
x2_now:=x2_now+X2_Change_Per_Pixel;
end;
end;
procedure FillFlatBottom(x1,x2,x3,y1,y2,y3:integer);
{Qui dinh y1=y3}

43

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

var X1_Change_Per_Pixel,X2_Change_Per_Pixel,x1_now,x2_now:real;y:integer;
begin
X1_Change_Per_Pixel:=(x2-x1)/(y2-y1);
X2_Change_Per_Pixel:=(x3-x2)/(y3-y2);
x1_now:=x2;x2_now:=x2;
for y:=y2 to y1 do
begin
linengang(round(x1_now),round(x2_now),y);
x1_now:=x1_now+X1_Change_Per_Pixel;
x2_now:=x2_now+X2_Change_Per_Pixel;
end;
end;
procedure Sap(var x1,y1,x2,y2:integer);
var tam:integer;
begin
if y1>y2 then
begin
tam:=y1; y1:=y2; y2:=tam;
tam:=x1; x1:=x2; x2:=tam;
end;
end;
var x4,y4:integer;
begin
if (y1=y2)and(y2=y3) then
begin linengang(x1,y1,x2);linengang(x1,y1,x3);exit; end;
sap(x1,y1,x2,y2);sap(x1,y1,x3,y3);sap(x2,y2,x3,y3);
if y1=y2 then
FillFlatTop(x1,x2,x3,y1,y2,y3)
else
if y2=y3 then
FillFlatBottom(x2,x1,x3,y2,y1,y3)
else
begin
y4:=y2;x4:=x1+round((x3-x1)*(y2-y1)/(y3-y1));
FillFlatBottom(x2,x1,x4,y2,y1,y4);
FillFlatTop(x2,x4,x3,y2,y4,y3);
end;
end;
{************** Ket thuc Thu tuc FillTamGiac **************}
{************** Thu tuc Spline **************}
Procedure Spline(N:integer;P:polygon);
procedure tinh(u:real;var Pu:Pointtype;P:Polygon;K:integer);
const t=0;
var u2,u3,s:real;
begin
u2:=u*u;u3:=u2*u;s:=(1-t)/2;
Pu.x:=round(P^[k-1].x*(-s*u3+2*s*u2-s*u)+P^[k].x*((2-s)*u3+(s-3)*u2+1)
+P^[k+1].x*((s-2)*u3+(3-2*s)*u2+s*u)+P^[k+2].x*(s*u3-s*u2));
Pu.y:=round(P^[k-1].y*(-s*u3+2*s*u2-s*u)+P^[k].y*((2-s)*u3+(s-3)*u2+1)
+P^[k+1].y*((s-2)*u3+(3-2*s)*u2+s*u)+P^[k+2].y*(s*u3-s*u2));

44

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

end;
Procedure TaoDuLieu(N:integer;P:polygon;var Pt:Polygon);
begin
Getmem(Pt,sizeof(pointtype)*(N+2));
move(P^,Pt^[2],n*sizeof(pointtype));Pt^[1]:=Pt^[2];Pt^[n+2]:=Pt^[n];
end;
{************** Than Thu tuc Spline **************}
var u,Bn:real;Pu:Pointtype;bd:boolean;
k:integer;Pt:polygon;
Begin
TaoDuLieu(n,p,pt);
{for k:=2 to n+1 do
with Pt^[k] do
bar(round(x)-3,round(y)-3,round(x)+3,round(y)+3);}
Bn:=1/(20);bd:=true;
for k:=2 to n do
begin
u:=0;
repeat
tinh(u,Pu,Pt,K);
if bd then
begin
moveto(round(Pu.x),round(Pu.y));
bd:=false;
end
else
lineto(round(Pu.x),round(Pu.y));
u:=u+bn;
until U>1;
end;
Freemem(Pt,sizeof(pointtype)*(N+2));
End;
{************** Ket thuc Thu tuc Spline **************}
Procedure drawpoly(N:integer;A:polygon);
var i:integer;
begin
for i:=1 to N-1 do
line(A^[i].x,A^[i].y,A^[i+1].x,A^[i+1].y);
If (A^[1].x<>A^[n].x)and(A^[1].y<>A^[n].y) then
line(A^[1].x,A^[1].y,A^[n].x,A^[n].y);
end;
{************** Thu tuc FillPoly **************}
procedure Fillpoly1(N:integer;A:polygon);
var i,j,ymid,min,max,chiso,detal:integer;tam:pointtype;ch:char;
daui,dauj:shortint;
begin
if n=1 then putpixel(A^[1].x,A^[1].y,_Color)
else
if n=2 then line(A^[1].x,A^[1].y,A^[2].x,A^[2].y)

45

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

else
begin
min:=A^[1].y;max:=A^[1].y;
for i:=2 to n do
begin
if A^[i].y<min then min:=A^[i].y;
if A^[i].y>max then max:=A^[i].y;
end;
ymid:=(min+max) div 2;chiso:=1;detal:=abs(A^[1].y-ymid);
for i:=2 to n do
if detal >abs(A^[i].y-ymid) then
begin detal:=abs(A^[i].y-ymid); chiso:=i; end;
i:=chiso;
if chiso<>n then j:=chiso+1 else j:=1;
while (j<>chiso) do
begin
if (i<n) then i:=i+1 else i:=1;
if (j<n) then j:=j+1 else j:=1;
FillTamGiac(A^[chiso].x,A^[chiso].y,A^[i].x,A^[i].y,A^[j].x,A^[j].y);
ch:=readkey;
end;
end;
end;
{************** Thu tuc FillPoly **************}
procedure fillpoly(N:integer;A:polygon);
type diemcat=record
x:real;
canhthu:byte;
end;
type dlcanh=record
y_top:integer;
x :integer;
delta_y :integer;
x_change_per_scan:real;
end;
dsc=array[1..MaxPolygon] of dlcanh;
DSCanh=^dsc;
{*********************************************}
procedure taodscanh(var A:polygon;n:integer;var B:dscanh;var m:integer);
var i:integer;
begin
Getmem(B,sizeof(Pointtype)*n);
for i:=1 to n-1 do
begin
if A^[i].y<A^[i+1].y then
begin B^[i].y_top:=A^[i].y;B^[i].x:=A^[i].x end
else
begin B^[i].y_top:=A^[i+1].y;B^[i].x:=A^[i+1].x end;
B^[i].delta_y:=abs(A^[i].y-A^[i+1].y);

46

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

if (B^[i].delta_y)<>0 then B^[i].x_change_per_scan:=(A^[i].x-A^[i+1].x)/(A^[i].yA^[i+1].y);


end;
m:=n-1;
if (a^[1].x<>a^[n].x)or(a^[1].y<>a^[n].y) then
begin m:=m+1;
if A^[n].y<A^[1].y then
begin B^[n].y_top:=A^[n].y;B^[n].x:=A^[n].x end
else
begin B^[n].y_top:=A^[1].y;B^[n].x:=A^[1].x end;
B^[n].delta_y:=abs(A^[n].y-A^[1].y);
if (B^[n].delta_y)<>0 then B^[n].x_change_per_scan:=(A^[n].x-A^[1].x)/(A^[n].yA^[1].y);
end;
end;
{*********************************************}
procedure sortdscanh(m:integer;var B:dscanh);
var i,j:integer;
tam:dlcanh;
begin
for i:=1 to m-1 do
for j:=i+1 to m do
if B^[i].y_top>B^[j].y_top then
begin tam:=B^[i];B^[i]:=B^[j];B^[j]:=tam end;
end;
{*********************************************}
var B:dscanh;
j,top,bottom,m,y,tam,maxy:integer;
Gx:array[1..20] of diemcat;
tg:diemcat;
dem:byte;
ch:char;
trang,doan,rong:word;
l,i:longint;
begin
taodscanh(a,n,B,m);
maxy:=A^[1].y;
for i:=1 to n do
if maxy<A^[i].y then maxy:=A^[i].y;
sortdscanh(m,B);
for y:=B^[1].y_top to maxy do
begin
tam:=0;
for i:=1 to m do
if (B^[i].y_top<=y)and(y<=B^[i].y_top+B^[i].delta_y-1) then
begin tam:=tam+1;
Gx[tam].x:=B^[i].x+B^[i].x_change_per_scan*(y-B^[i].y_top);
Gx[tam].canhthu:=i;
end;
{xawps xeeps laij cacs giao ddieemr theo thws twj tawng daanf}

47

Chng 2.Cc h mu & c ch t chc b nh card mn hnh


- Nguyn Hu Ti

for i:=1 to tam-1 do


for j:=i+1 to tam do
if Gx[i].x>Gx[j].x then
begin tg:=Gx[i];Gx[i]:=Gx[j];Gx[j]:=tg end;
i:=0;
{too cacs doanj nawmf trong dda giacs}
while i<tam-1 do
begin i:=i+1;
if Gx[i].x=Gx[i+1].x then
begin
if (B^[Gx[i].canhthu].y_top<>B^[Gx[i+1].canhthu].y_top) then
begin
for j:=i to tam-1 do Gx[j]:=Gx[j+1];
tam:=tam-1;
end;
end;
end;
i:=1;
while i<tam do
begin linengang(round(Gx[i].x),round(Gx[i+1].x),y);
i:=i+2;
end;
end;
Freemem(B,sizeof(Pointtype)*n);
end;
{************** Ket thuc Thu tuc FillPoly **************}
END.

III.2. C ch hot ng ca mn hnh theo chun Vesa


Tham kho ti liu:
1. VESA BIOS Extensions:
http://en.wikipedia.org/wiki/VESA_BIOS_Extensions
2. Vesa (Video Electronics Standards Association)
http://www.vesa.org/public/VBE/vbe3.pdf
3. Th vin ha hot ng theo chun Vesa: (lin h tc gi)

48

Chng III: Cc php xn hnh & t mu

Trong k thut ho my tnh rt nhiu bi ton i hi phi s dng cc thut


ton xn hnh (clipping). Cc thut ton xn hnh nhm ct b bt cc b phn ca
hnh nh khng nm trong phm vi cho trc no .

V d nh mt bn thit k ln cn xn vo mt khung nhn (viewport) c th khi


chng ta thit k cc chi tit. iu ny gip cho vic th hin bn v c nhanh
v hiu qu.
Chng ta c th nh ngha mt cch tng qut nh sau:

49

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

nh ngha: Cho mt min DRn v F l mt hnh trong Rn (ngha l


FRn). Ta gi FD l hnh c c t F bng cch ct n vo trong D. K hiu
FD l ClipD(F).
Trong tng ng dng c th th min D v F s c m t chnh xc,
chng hn min D l mt vng hnh ch nht trong R2 v F l mt on thng hay
mt ng trn trong R2.

I. Trng hp F l mt tp hu hn im
Trong trng hp ny bi ton tng ng vi vic tm mt thut ton
xc nh mt im ca F c nm trong min D hay khng. Bi ton ny c
gii quyt khi D l mt a gic khng t ct trong R2, Khi D l mt a din khng
t ct trong R3, Khi D l hnh trn, hnh cu,...

II. Trng hp xn mt on thng vo mt vng hnh ch


nht ca R2.
II.1. Khi c mt cnh ca hnh ch nht song song vi trc to

ymax

A(xa, ya)

ymin

B(xb, yb)
xmin

xmax

Khi hnh ch nht D v on thng F c th c m t nh sau:

x x x max
D = ( x, y ) R 2 min
v
y min y y max

x = x A + ( x B x A )t

2
F = ( x, y ) R y = y A + ( y B y A )t

0 t 1

Trong (xmin, ymin), (xmax,ymax) l hai nh xc nh nn hnh ch nht, v (xA,yA),


(xB,yB) l to hai u mt ca on thng F k hiu l AB.
Trong trng hp ny ClipD(F) c th l rng hay l mt on thng (c th
suy bin thnh 1 im). Theo nh ngha th thut ton c th m t nh sau:
Bc 1: Tm nghim ca h bt phng trnh

50

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

xmin x A + ( x B x A )t xmax

y min y A + ( y B y A )t y max

0 t 1

(II.1)

Nghim ca h ny s l [t1,t2] hay , ta gi N l tp cc nghim ca h


Bc 2:
+ Nu N=: th ClipD(F)=
+ Ngc li th N=[t1,t2] (quy c t1t2). Gi C, D l hai im xc nh bi:
xC = x A + ( x B x A )t1 ; yC = y A + ( y B y A )t1
x D = x A + ( x B x A )t 2 ; y D = y A + ( y B y A )t 2

Th ClipD(AB)=CD
Thut ton trn va i hi phi tnh ton v lng gi nhiu trn cc s thc.
Trong thc t ngi ta dng mt thut ton khc hiu qu hn. y chung ta s
xem xt n cc thut ton nh Cohen-Sutherland, thut ton chia nh phn, hay
mt thut ton c ci bin v gt gia t thut ton tng qu trn vi tn gi l
thut ton Liang-Barsky
II.1.a.

Thut ton Cohen-Sutherland

Xt mt cch tng qut s c cc tnh hung sau cho bi ton xn mt on


thng vo trong mt hnh ch nht.
D
E
C

B
A

+ Trng hp c hai u mt ca on thng u nm trong hnh ch nht


(nh on AB) th ClipD(F) s l on thng cho.
+ Trng hp c mt u mt ca on thng nm ngoi hnh ch nht
(nh on BC) th ClipD(F) s l mt phn on thng cho.
+ Trng hp c hai u mt ca on thng nm ngoi hnh ch nht
song c mt phn ca on thng nm trong hnh ch nht th on thng F ct
hnh ch nht D ng hai im v khi ClipD(F) s l on thng to bi hai
im .

51

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

+ Trng hp c hai u mt ca on thng nm ngoi hnh ch nht v


khng c phn no ca on thng nm trong hnh ch nht (khng c giao im
vi hnh ch nht)th ClipD(F)=
Vi cc tnh hung nh trn gii thut s c tip cn theo hng nh sau:
Trc ht ngi ta nh m vng cho khng gian mt phng ang xt sau
tin hnh thut ton xn da trn c s xt m vng ca cc im.
Phng php nh m vng:

Mi vng trong mt phng Oxy c nh mt


m s tu theo v tr ca chng so vi hnh ch nht D nh hnh v sau. Mi
m s c 4 bt, mi bt ng vai tr nh mt c hiu bo cho ta bit mt trng
thi no ca vng; c th l: bt 0 ch c bt (bng 1) khi vng c m
ang xt nm v bn Tri hnh ch nht, bt 1 ch c bt khi vng c m
ang xt nm v bn Phi ca hnh ch nht, bt 2 c bt khi vng nm bn
Di, v bt 3 c bt khi vng nm bn Trn.
1001

1000

1010

0001

0000

0010

0101

0100

0110

Bng quy tc nh m
bt 3
bt 2
bt 1
bt 0
Trn
Di
Phi
Tri

Nh vy mt phng OXY c chia lm 9 phn, mi phn c nh mt m 4 bt


biu hin trng thi khc nhau ca tng vng.
Xt mt im P (xp, yp) trong mt phng, ta gn cho n mt m trng vi m ca
vng cha n. T ta c th suy ra cch xc nh m ca P nh sau:
1 nu x p < x min
Bt0 =
0 nung-c li

1 nu x p > x max
Bt1 =
0 nung-c li

1 nu y p < y min
Bt2 =
0 nung-c li

1 nu y p > y max
Bt3 =
0 nung-c li

By gi xt mt on thng AB ta s c cc trng hp sau:

52

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

i/ on AB nm hon ton bn trong hnh ch nht nu v ch nu m(A)=0000 v


m(B)=0000
ii/ Nu [m(A) & m(B)]0000 th on AB nm hon ton bn ngoi hnh ch
nht ( y php ton & c hiu l php AND lgic ca cc bt tng ng, v
d: 1101 & 1011 = 1001). Tht vy, t gi thit suy ra m(A)0000 v
m(B)0000, ngha l A v B cng nm bn ngoi hnh ch nht, mt khc do kt
qu l khc 0000 c ngha l phi tn ti t nht mt bt ti v tr no bng 1, gi
s l bt i, suy ra c m(A) v m(B) u c bt i c gi tr 1. iu ny c ngha
l A v B nm v cng mt pha no ca hnh ch nht D. C A v B u bn
ngoi v nm v cng mt pha ca hnh ch nht D nn hin nhin l on AB
khng th c phn chung vi hnh ch nht D.
iii/ Trng hp [m(A) & m(B)]=0000 v [m(A)0000 hoc m(B)0000]
Ta c th gi s m(A)0000 (nu cn c th i vai tr ca A v B tho
mn gi thit trn), iu ny tng ng vi vic A nm bn ngoi hnh ch nht.
Nu xA=xB th AB l mt on thng ng, do ta suy ra ngay cch xc nh
ClipD(AB)
t im C l giao im ca AB vi hnh D nh sau: xC=xA
Nu ATrn=1 (hiu rng m ca A c bt 3 bng 1) th yC=ymax
Ngc li (tc ADi=1) th yC=ymin
t im D nh sau:

xD=xA

Nu m(B)=0000 th yD=yB
B

Ngc li th:

yD=ymax nu BTrn=1
yD=ymin nu BDi=1

ClipD(AB)=CD
Khi xAxB, Khi AB l mt on thng nm xin. t C=A, D=B. Bi v C
nm bn ngoi hnh ch nht nn quy trnh xn c thc hin nh sau:
B

Nu CTri=1 th c th thay C bi giao im ca on CD v cnh Tri ni


di ca hnh ch nht D
Nu Cphi=1 th c th thay C bi giao im ca on CD v cnh Phi ni
di ca hnh ch nht D
Nu CDi =1 th c th thay C bi giao im ca on CD v cnh Di
ni di ca hnh ch nht D

53

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

Nu CTrn =1 th c th thay C bi giao im ca on CD v cnh Trn ni


di ca hnh ch nht D
Qu trnh trn c lp i lp li, sau mi ln nh ch tnh li m ca C v i
vai tr ca C v D nu cn m bo C lun nm bn ngoi hnh ch nht. Qu
trnh trn s dng khi ta c cc im CD ri vo cc trng hp i/ hoc ii/ tc
tng ng vi ClipD(AB)=CD hoc ClipD(AB)=.
II.1.a.i.

Kt thc gii thut

Hng dn: Cng thc tnh giao im ca CD vi cc cnh Tri, Phi, Trn,
Di c th c suy ra t phng trnh biu din CD v cc cnh ca hnh
ch nht:
Phng trnh AB:

y yA
x xA
y yA x xA
;
=
hay
=
y
y B y A xB x A
x

Phng trnh cnh Tri x=xmin


Suy ra to giao im vi cnh tri nu c l (xmin;

y
( xmin x A ) + y A ). Cng thc
x

tnh to giao im vi cc cnh cn li c suy ra tng t.


Vic tnh m c th c thc hin d dng nh ton t OR, vi ton t ny cho
php ta d dng bt cc bt (cho bng 1).
II.1.a.ii.

Sau y l mt hm tnh m

{Vo : x,y cha gi tr to ca im P; xmin,ymin,xmax,ymax: biu din to


ca hnh ch nht D
Ra

: Mt byte c 4 bt u cha m ca P v 4 bt sau bng 0}

Function Ma(x,y,xmin,ymin,xmax,ymax:integer):Byte;
Var m:byte;
Begin
m:=0 {m=0000}
If x<xmin then m:=m or 1; {Tc m or 0001 Bin, t bt 0 bng 1}
If x>xmax then m:=m or 2; {Tc m or 0010 Bin, t bt 1 bng 1}
If y<ymin then m:=m or 4; {Tc m or 0100 Bin, t bt 2 bng 1}
If y>ymax then m:=m or 8; {Tc m or 1000 Bin, t bt 3 bng 1}
Ma:=m;
54

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

End;
II.1.a.iii.

Ci t thut ton

Sinh vin cn xy dng:


+ Mt th tc xn theo thut ton Cohen-Sutherland
+ Mt chng trnh s dng th tc xn minh ha cc tnh hung
xt trong thut ton.
II.1.b.

Thut ton Chia nh phn

Thut gii ny xut pht t t tng ca phng php "gii phng trnh
bng phng php chia nh phn"
T tng ca thut gii nh sau: ly trung im ca on thng v kim tra
m ca n loi dn cc on con khng cha giao im, v cui cng cho im
gia hi t v giao im ca on thng vi hnh ch nht, kt qu l ta thu c
on con nm trong hnh ch nht (nu c)
Thut ton c phc tho nh sau:
i/ Nu m(A)=0000 v m(B)=0000 th ClipD(AB)=AB
ii/ Nu m(A)=0000 v m(B)0000 th:
t C:=A; D:=B;
while |xC-xD|+|yC-yD|1 do
begin
ly trung im M ca CD
+ Nu m(M)0000 th

D:=M

+ Ngc li:

C:=M

end;
ClipD(AB)=AC
iii/ Nu m(A)0000 v m(B)=0000:
i vai tr ca A v B ri p dng ii/
iv/ [Nu m(A)&m(B)]0000 th ClipD(AB)=
v/ Nu m(A)0000 v m(B)0000 v [m(A)&m(B)]=0000
t C:=A; D:=B;
Ly trung im M ca CD
55

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

While (m(M)0000)and(|xC-xD|+|yC-yD|1) do
begin
+ Nu m(M)&m(C)0000 th C:=M

{on CM ngoi theo

iv/}
+ Ngc li (tc m(M)&m(C)=0000) th D:=M {on DM
ngoi, t chng minh}
Ly trung im M ca CD
end;
+ Nu m(M)0000 th ClipD(AB)=
+ Ngc li: p dng ii/ cho cc on MA v MB ta c
ClipD(MA)=MA1
ClipD(MB)=MB1
Suy ra ClipD(AB)=A1B1
II.1.b.i.

Ci t thut ton

Sinh vin cn xy dng:


+ Mt th tc xn theo thut ton chia nh phn
+ Mt chng trnh s dng th tc xn minh ha cc tnh hung
xt trong thut ton.
II.1.c.

Thut ton Liang-Barsky

Thut ton ny l mt gii php c th cho phng php chung cp


phn u trong (mc II.1). Thut ton ny nh sau:
Ta t

x=xB-xA

y=yB-yA

P1=-x

Q1=xA-xmin

P2= x

Q2=xmax-xA

P3=-y

Q3=yA-ymin

P4= y

Q4=ymax-yA

Th h bt phng trnh (II.1) c th vit li l:


Pk t Qk ;

0 t 1

k = 1,2,3,4

(II.1.c)

Xt cc trng hp sau:
56

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

i/ Nu k{1,2,3,4} sao cho (Pk=0 v Qk<0) th suy ra ClipD(AB)= (V h bt


phng trnh (II.1.c) v nghim)
ii/ k{1,2,3,4}, Pk0 hoc Qk0: th khi cc bt phng trnh ng vi Pk=0 s
b loi b bi v chng l hin nhin. Do vy ta t
K1={k | Pk>0}
Qk

k K 1 U {1}

Pk

U1= min

K2={k | Pk<0}
Qk

k K 2 U {0}

Pk

U2= max

Nu U1<U2 th ClipD(AB)=
Ngc li: th [U2, U1] chnh l on nghim ca h bt phng trnh trn
(tng ng vi [t1,t2] m phng php tng qut nu). Nn gi C,D l hai
im tho
xC = x A + x.U 1 ; y C = y A + y.U 1
x D = x A + x.U 2 ; y D = y A + y.U 2

Th ClipD(AB)=CD
II.1.c.i.

Ci t thut ton

Sinh vin cn xy dng:


+ Mt th tc xn theo thut ton trn Liang-Barsky
+ Mt chng trnh s dng th tc xn minh ha cc tnh hung
xt trong thut ton.
+ Vit nh gi so snh u nhc im ca 3 phng php xn hnh
trn.

II.2. Khi 1 cnh ca hnh ch nht to vi trc honh mt gc :


Ta dng php quay hnh a bi ton v trng hp xn ng thng vo hnh
ch nht c cnh song song vi trc to . Thut ton c phc tho nh sau:
i/ Quay hnh ch nht D v ng thng AB mt gc - c D' v A'B'.

ii/ Xc nh ClipD'(A'B')
iii/ S c hai tnh hung xy ra:
Nu ClipD'(A'B')= th kt qu ClipD(AB)=.
Ngc li nu ClipD'(A'B')=C'D' th quay C'D' mt gc ta c CD. Suy ra
ClipD(AB)=CD

57

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

III. Clipping mt a gic vo mt vng hnh ch nht


III.1. Gii thut Sutherland Hodgman
a gic

Kt qu thu c
Hnh ch nht D
(Clipping Window)

(hnh 1)

(hnh 1.a)

(hnh 1.b)

(hnh 1.c)

(hnh 1.d)

T tng ca gii thut nh sau:


Clipping mt a gic F vo trong mt hnh ch nht D ta tin hnh cc bc
sau:
Bc 1: Vi a gic F thc hin ct b nhng phn nm bn tri hnh ch nht
(ngha l bn tri ca cnh tri ni di) ta thu c a gic mi F1 (hnh 1.a)
Bc 2: Vi a gic F1 thc hin ct b nhng phn nm bn phi hnh ch nht
ta thu c a gic mi F2 (hnh 1.b)
Bc 3: Vi a gic F2 thc hin ct b nhng phn nm bn trn hnh ch nht ta
thu c a gic mi F3 (hnh 1.c)
Bc 4: Vi a gic F3 thc hin ct b nhng phn nm bn di hnh ch nht
ta thu c a gic mi F4 (hnh 1.d)
Kt qu: Nu F4 = th ClipD(F)=. Ngc li th ta thu c kt qu xn l a
gic F4, hay ClipD(F)=F4
thc hin cc bc (1,2,3,4) ta s tin hnh theo phng php sau:

58

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

Chng hn cho bc 1: Xut pht t mt nh no ca a gic, ta tin hnh i


dc theo cc cnh n cc nh khc cho n khi v li nh u.
Trn qu trnh di chuyn:
Nu gp mt nh v nh trn hay bn phi ca cnh tri (ni di) hnh
ch nht th ta lu im vo F1.
Nu gp giao im vi cnh tri (hay cnh tri ni di) th lu giao im
vo F1
Kt qu ta c F1 l mt tp cc im biu din a gic F khi xn i mt
phn bn tri.
Cc bc cn li thc hin tng t.
III.1.a. Ci t thut ton
Sinh vin cn xy dng:
+ Mt th tc xn a gic theo thut ton trn
+ Mt chng trnh s dng th tc xn minh ha
III.1.b. Nhc im thut gii Sutherland-Hodgman v cch khc phc
Thut gii xn a gic Sutherland - Hodgeman cn mc phi mt nhc
im l khi kt qu xn l 2 a gic ring bit th n gp li lm mt bi mt
cnh lin kt.
V d:

Phng php khc phc: Sinh vin t nghin cu.

IV. Mt s thut ton t mu


IV.1. Gii thut vt du loang
Thut ton t mu cho mt vng ng nht theo kiu loang du thng c p
dng t mu cho cc vng c ng bin phc tp ri rm, nh t mu cho mt
vng nh, hay mt bin th ca gii thut l tm mt vng lin thng ng nht
mu (hay cng tone mu) trn nh.

59

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

nh gc & nh c t nn xanh theo thut ton vt du loang


Bi ton tng qut:
Cho mt ma trn im M, mi im c to l (x,y) vi x,yZ v c mu l
Color(x,y).
T mt im P(x0,y0)M ta xc nh mt vng lin thng ng nht (ng
mu) Q theo quy tc sau:
u tin tp Q ch c mt phn t l P(x0,y0)
Vi mi im TM s c a vo Q nu tn ti trong Q mt im K no
sao cho Color(K)=Color(T) v T l ln cn ca K ( y xt ln cn 4, c
ngha l T st trn hoc st di, hay st tri hoc st phi ca K)
Biu din v mt to th T l ln cn ca K khi v ch khi:
ABS(XT-XK)+ABS(YT-YK)=1
Bi ton t ra l xut pht t mt im P(x0,y0)M hy xc nh vng Q v t
mu cho n bi mt mu C no (d nhin l C phi khc mu hin thi ca
vng Q).
Trong thc t bi ton t mu theo vt du loang c ng dng rt rng ri trong
ho t mu, xc nh vng lin thng tho mt thuc tnh no . Hay t
tng v phng php ca n c ng dng cho: tm mt vng lin thng khi
bit trc 1 im, hay lc ra t tp hp cc phn t cng tnh cht theo kiu ln
mt xch quan h,...
Gii quyt bi ton ny c hai phng php l quy v phng php khng
quy.
IV.1.a.

Phng php quy

Bc 1: Lu gi mu ca im P(x0,y0) vo mt bin: OldColor:=Color(P)


60

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

Bc 2: T mu cho im P(x0,y0)
Bc 3: Xc nh cc im ln cn Ti (i=1..4) c mu OldColor (cng mu vi P
trc khi t)
Bc 4: Xem Ti nh vai tr ca P v thc hin li t bc 1.
Kt lun: Thut ton trn s dng khi khng xc nh c Ti tt c cc ln
quy.
IV.1.a.i.

Ci t thut ton

Sau y l th tc minh ho cho thut gii trn


{Vo: to ca im P v mu cn t cho vng Q
Ra : Khng. Kt qu cng vic l t mu vng Q trn mn hnh}
Procedure

LoangMauDeQuy(x,y:integer; NewColor:byte);

Var OldColor:byte;
Begin
OldColor:=GetPixel(x,y)
if OldColor=NewColor then
exit
else
begin
PutPixel(x,y,NewColor);
If (x>0) and (GetPixel(x-1,y)=OldColor) then
LoangMauDeQuy(x-1,y,NewColor);
If (x<GetMaxX) and (GetPixel(x+1,y)=OldColor) then
LoangMauDeQuy(x+1,y,NewColor);
If (y>0) and (GetPixel(x,y-1)=OldColor) then
LoangMauDeQuy(x,y-1,NewColor);
If (y<GetMaxY) and (GetPixel(x,y+1)=OldColor) then
LoangMauDeQuy(x,y+1,NewColor);
end;
End;

61

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

Nhc im ca phng php quy l khng thc hin c khi vng loang c
din tch ln (dn n trn Stack).
IV.1.b. Phng php khng quy
Trn c s ca tng trn song c xy dng li trnh gi quy lm
hn ch khng gian t
Bc 1: Khi to mt hng i Q vi phn t u tin l P(x0,y0). Gi OldColor l
mu ca im P (OldColor=Color(P))
Bc 2: Khi hng i khng rng th: ly ra t hng i Q mt im T.
Nu mu hin thi ca T l OldColor th:
+ T mu im T
+ Tm cc im ln cn ca T c mu l OldColor v a chng vo hng
i Q.
Bc 2 ny c lp i lp li cho n khi hng i Q rng.

Thut ton trn c mt nhc im l i khi mt im c a vo hng i


nhiu hn mt ln, t ta c th tinh chnh ch cc im ln cn cng mu ch
c a vo khi n cha c trong hng i. Song vic kim tra ny s dn n
mt s hao ph v thi gian thc hin kim tra hng i, vy nn ta c th b qua.
IV.1.b.i. Ci t thut ton
Sinh vin cn xy dng th tc t mu theo thut gii Vt du loang s dng
hng i kh quy nh nu trn.
Sau y l mt gii php ci t minh ho:
program Chuong_Trinh_To_Mau_Theo_Thuat_Toan_Vet_Dau_Loang;
uses crt,graph;
procedure init;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,' ');
ErrCode := GraphResult;
if ErrCode <> grOk then
Writeln('Graphics error:', GraphErrorMsg(ErrCode));
end;
procedure loangmau(x,y:integer;maumoi:byte);
type DS=^danhsach;
62

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

danhsach=record
x,y:integer;
next:DS;
end;
var dau,cuoi:ds;maucu:byte;
Procedure Push(x,y:integer);
Var P:DS;
begin
New(P);P^.x:=x;P^.y:=y;P^.next:=nil;
If Dau=nil then
Dau:=P
else
Cuoi^.next:=P;
Cuoi:=p;
end;
Procedure Pop(Var x,y:integer);
Var P:DS;
begin
P:=Dau; Dau:=Dau^.next;
x:=P^.x; y:=P^.y;
dispose(p);
end;
begin
maucu:=getpixel(x,y);
if maucu=maumoi then exit;
Dau:=Nil;Push(x,y);
while (dau<>nil) do
begin
Pop(x,y);
if (getpixel(x,y)=maucu)and(maxavail>sizeof(ds)) then
begin
putpixel(x,y,maumoi);
if (x>0)and(getpixel(x-1,y)=maucu) then
Push(x-1,y);
if (x<getmaxx)and(getpixel(x+1,y)=maucu) then
Push(x+1,y);
if (y>0)and(getpixel(x,y-1)=maucu) then
Push(x,y-1);
if (y<getmaxy)and(getpixel(x,y+1)=maucu) then
Push(x,y+1);
end;
end;
end;
BEGIN
init;
rectangle(50,50,480,380);
line(50,50,155,370);line(155,370,165,55);

63

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

loangmau(60,60,4);
readln;
closegraph;
END.

IV.2. Thut ton t mu a gic theo dng qut (Scan-line Algorithm).


Thut ton ny s dng giao im gia cc cnh bin ca a gic vi cc
ng thng nm ngang gi l dng qut di chuyn t trn xung di xc nh
ra cc on con nm trong a gic v t mu cho chng.
x1x2
x1
x1

x1

x2
x2x3

x2x3

x4

x4

Scan-line 1

x5 Scan-line 2

V d:

(a gic trc v sau khi c t)

64

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

(Hnh nh phng ln m t qu trnh t mu a gic)

65

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

hiu r hn t tng ca gii thut ta hy tm hiu mt v d sau:


Cho min D c bao bi mt ng cong kn khng t ct G v mt im
P nh trong hnh v, cn xc nh im P l trong hay ngoi min D?
tr li cu hi ny ta tin hnh nh sau:
+ Xc nh mt im Q no ngoi min D
+ Tm s giao im ca on thng PQ vi G, nu s giao im ny l chn th P
khng thuc D, ngc li th P nm trong min D khi s giao im l l.
S d c kt lun nh vy l nh vo mt bi ton vui c in nh sau:
Q

Min D xem nh c bao bc kn bi tng thnh G. Nu mt con kin


xut pht t Q v b dc theo on thng QP hng n P. R rng lc u n
ngoi thnh (ngoi min D), sau ln vt thnh u tin (qua giao im) th n
s vo trong, nu n vt thnh ln na th r rng l n ra khi thnh, nu n li
tip tc vt thnh th n li vo trong, ri li vt ra ngoi... R rng ta thy
nn s ln vt l l th n trong thnh, ngc li nu s ln vt l chn th n
ngoi thnh.
Hay nhn gc khc th ta c cc on thng nm trong a gic l cc
on c to bi cp giao im xk vi xk+1 vi k=1,3,5,7...

66

Chng 3: Cc php xn hnh & t mu Nguyn Hu Ti

T bi ton trn ta thy t mu a gic ta ch vic cho dng qut (Scan-line)


chy t nh cao nht ca a gic n nh thp nht ca a gic, trong mi ln
chy ta xc nh s giao im ca ng chy ngang vi a gic, cc giao im
c sp theo th t tng dn theo honh gi l x1, x2,..., x2n (n>0). v ta ch
vic t cc on x1x2, x3x4,...,x2n-1x2n.
Song tm giao im ca dng qut vi a gic ta phi tm giao im vi cc
cnh ca a gic. Do iu tt yu l ti nhng nh s c 2 giao im (giao
im kp) v n s lm cho quy tc t trn sai nu hai cnh xut pht t nh ny
nm v hai pha ca ng qut. Vy trong tnh hung dng qut i qua nh th
nu hai cnh xut pht t nh ny nm v hai pha ca ng qut th ta cn b
bt i mt giao im.
IV.2.a. Ci t thut ton
Sinh vin cn vit mt th tc t mu cho mt a gic bt k (vi u vo l
mt mng cc nh ca a gic)
V. Bi

tp cui chng

1. Ci t th tc xn on thng vo a gic, xn on thng vo Ellipse, Xn


Ellipse vo hnh ch nht.
2. Ci t th tc t mu a gic theo mu t (t c hoa vn)
a. Khi mu l mt ma trn 8x8 bt, nu bt = 1 th c t ngc li th
khng t
b. Khi mu t l mt nh bitmap kch thc mxn
3. B sung vo th vin do bn ci t c chng trc cc th tc xn v
t mu

67

Chng IV: Cc php bin i hnh hc

I. Cc php bin i Affine 2D (2- chiu)


Php bin i Affine 2D s bin im P(Px,Py) thnh im Q(Qx,Qy) theo h
phng trnh sau:
Qx = a.Px + c.Py + trx
Qy = b.Px + d.Py + try

Di dng ma trn, h ny c dng:

Hay vit gn hn:

a b
(Qx, Qy) = (Px, Py).
+ (trx, try)
c d

Q = P.M + Tr

vi

Q=(Qx,Qy); P=(Px,Py);

(I)

Tr=(trx,try) - vector tnh tin;


a b
M =
- ma trn bin i.
c d

I.1. Php tnh tin


Php tnh tin im P(Px,Py) thnh im Q(Qx,Qy) theo Vector Tr = (trx,try) c h
phng trnh:
Qx = Px + trx
Qy = Py + try

hay theo dng ma trn (I) th


1 0
M =
v
0 1

Tr = (trx,try)

68

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

I.2. Php ng dng


Qx = sx Px

Qy = s y Py

dng phng trnh l:

Di dng ma trn:
s
M= x
0

Vi:

0
v
s y

Tr = (0,0)

sx l h s t l theo trc x
sy l h s t l theo trc y

3 4

12

Php ng dng (hay cn gi l php bin i t l) cho php chng ta phng to hay thu
nh hnh theo mt hay hai chiu m vn gi c hnh dng c bn ca chng (ng
dng).

1 2

12

(Hnh minh ha php bin i ng dng cho mt tam gic)

I.3. Php i xng


y l trng hp c bit ca php ng dng vi a v d i nhau.
1 0

0 1

i xng qua Oy

1 0

0 1

i xng qua Ox

1 0

0 1

i xng qua gc ta

69

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

I.4. Php quay quanh gc to


Ma trn tng qut ca php quay quanh gc to mt gc l:
Cos ( ) Sin( )
M=
v Tr = (0,0)
Sin( ) Cos ( )

Ch :

Tm ca php quay c xt y l gc ta .

nh thc ca ma trn php quay lun lun bng 1.

I.5. Php bin dng (Twist Transformation)


1 ty
Ma trn tng qut l: M =
t 1

v Tr = (0,0)

Trong :
tx : l h s bin dng theo trc x.
ty : l h s bin dng theo trc y.

I.6. To thun nht (Homogeneous Coordinates)


ch cn php nhn ma trn trong cc php bin i, ta thm vo mt thnh
phn trong cc ma trn v a n v dng
a

(Qx, Qy, 1) = (Px, Py, 1). c


tr
x

b
d
try

0
1

K hiu (Qx, Qy, 1), (Px, Py, 1) c gi l to Homogen, v cng thc ca php bin
i theo to Homogen l:
Q = P.T
Vi T l ma trn 3x3 c gi l ma trn bin i.

I.7. Tng hp cc php bin i Affine


Gi 1 v 2 l 2 php bin i nh sau:
1 : P Q
2 : Q W
Ta cn tm php bin i P W

70

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

Gi s Q = P. M1 + Tr1 v W = Q.M2 + Tr2 th th:


W

= (P.M1 + Tr1).M2 + Tr2


= P.M1.M2 + Tr1.M2 + Tr2

t M = M1.M2 v Tr = Tr1.M2 + Tr2 th:


W

= P.M + Tr

Nh vy tng hp (hay tch) ca hai php bin i Affine cng l mt php bin
i Affine, c cc ma trn bin i l:
M = M1.M2 v Tr = Tr1.M2 + Tr2
Nu s dng to Homogen th:

Q = P.T1;
Suy ra:

W = Q.T2
W = (P.T1).T2 = P.T

vi T = T1.T2

Nh vy tng hp (hay tch) ca hai php bin i Homogen cng l mt php


bin i Homogen, c ma trn bin i l: T = T1.T2
Lp lun tng t ta c: Tng hp ca N php bin i Homogen cng l mt
php bin i Homogen, c ma trn bin i l: T = T1xT2xxTN
Ch : T y tr i ta ch s dng to homogen trong cc php bin i vic
tm tch ca cc php bin i c tr nn n gin

Sau y l ma trn bin i theo to Homogen ca mt s php bin i c


bn:
Php bin i

php tnh tin

php quay

Ma trn Homogeneous
1

0
tr
x

0
1
try

0
1

Cos ( ) Sin( ) 0

Sin( ) Cos ( ) 0

0
0
1

Php i xng qua trc OX

1 0 0

0 1 0
0 0 1

Php i xng qua trc OY

1 0 0

0 1 0
0 0 1

71

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

Php i xng qua gc ta

1 0 0

0 1 0
0 0 1

php ng dng

sx

0
0

0
sy

tx
0

ty

php bin dng

1
0

0
1
0

0
1

I.8. Php quay quanh im bt k


Gi s cho im P quay quanh im V(Vx,Vy) ta c nh ca P qua php bin
i l Q.
Php quay ny bao gm cc php bin i c bn sau:
- Tnh tin P theo vector VO = (Vx ,Vy ) ta c P
- Quay P quanh gc to mt gc ta c Q
- Tnh tin Q theo vector OV = (V x ,V y ) ta c Q.
Q chnh l nh ca P qua php quay P quanh im V mt gc . Ma trn bin i l:
1

T= 0
V
x

0
1
Vy

0 Cos ( ) Sin ( ) 0 1


0 . Sin ( ) Cos ( ) 0 . 0
1
0
0
1 V x

0
1
Vy

0
1

I.9. Cc v d minh ha
I.9.a.

V d 1:

Cho tam gic ABC c ta ln lt l A(0,0), B(6,0) v C(3,5). Quay tam


gic ABC mt gc 90 quanh im M(3,3) ta c tam gic A1B1C1. Hy tm
ma trn ca php bin i v ta ca A1B1C1.
B

Gii: Php quay quanh im M mt gc 90o c biu din qua 3 php bin i c
bn ln lt l:
+ Tnh tin theo vector MO = (xO-xM, yO-yM) = (0-3, 0-3) = (-3, -3):
0 0
1

Ma trn biu din l T1 = 0 1 0


3 3 1

72

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

+ Quay quanh gc ta mt gc 90o


cos(90o ) sin(90o ) 0 0 1 0

Ma trn biu din l T2 = sin(90o ) cos(90o ) 0 = 1 0 0

0
0
1 0 0 1

+ Tnh tin ngc tr li theo vector OM =(3,3)


1 0 0

Ma trn biu din l T3 = 0 1 0


3 3 1

Nh vy, ma trn ca php quay quanh im M mt gc 90o s c tnh bng tch


cc ma trn bin i thnh phn:
1 0 1 0 0 0 1 0
0 0 0 1 0 1 0 0 0
1

T = T1.T2 .T 3= 0
1 0 1 0 0 0 1 0 = 1 0 0 0 1 0 = 1 0 0
3 3 1 0 0 1 3 3 1 3 3 1 3 3 1 6 0 1

0 0 1 0 1 0 6 0 1

A1B1C1 (ta homogen) = ABC (ta homogen) . T = 6 0 1 1 0 0 = 6 6 1


3 5 1 6 0 1 1 3 1

Vy A1(6,0) B1(6,6) v C1(1,3).


V hnh minh ha:

B1

6
5

C1

M
A1

I.9.b.

B6

V d 2:

Cho t gic ABCD vi ta ln lt l A(3,0) B(7,0) C(6,4) D(4,4).


a) Ly i xng ABCD qua ng thng i qua 2 im CD, ri tip n l quay mt
gc -900 ta c t gic A1B1C1D1. Hy tm ma trn ca php bin i tng hp
(bin i ABCD thnh A1B1C1D1) v tm ta ca A1B1C1D1.
b) Ly i xng ABCD qua ng thng i qua 2 im OC (O l gc ta ) ta c
A2B2C2D2. Tm ma trn bin i v ta ca A2B2C2D2.
B

73

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

Gii:
a) Php ly i xng qua CD c phn tch thnh tch ca 3 php bin i c bn
sau:
1. Php tnh tin theo vector v1 = (0,-4) (tnh tin CD v trng vi trc OX)
1 0 0

Ma trn T1 = 0 1 0
0 4 1

2. Php ly i xng qua trc OX


1 0 0

Ma trn T2 = 0 1 0
0 0 1

3. Php tnh tin ngc tr li theo vector v2 = -v1 = (0,4)


1 0 0

Ma trn T3 = 0 1 0
0 4 1

Vy ma trn ca php ly i xng qua CD l:


1 0 0

T4 = T1 xT2 xT3 = 0 1 0
0 8 1

Tip n php quay mt gc -90o c ma trn l:


cos(900 ) sin( 900 ) 0 0 1 0

T5 = sin( 900 ) cos(900 ) 0 = 1 0 0

0
0
1 0 0 1

Php bin i tng hp bin i ABCD thnh A1B1C1D1 l tng hp ca 2 php


bin i thnh phn, gm php ly i xng qua CD v php quay mt gc -900.
Vy ma trn bng tch ca 2 ma trn bin i thnh phn:
0 1 0

Ta = T4 xT5 = 1 0 0
8
0 1

A1B1C1D1 ta homogen = ABCDta homogen Ta


8 3
3 0 1
0 1 0

8 7
7 0 1
=
x 1 0 0 =

4 6
6 4 1

0 1
4 4 1 8
4 4

Vy A1=(8,-3) B1=(8,-7) C1=(4,-6) D1=(4,-4)


b) Sinh vin t gii (xem nh bi tp rn luyn)
B

1
1

I.10. Bin i h trc ta (hay bin i ngc)


Xt v d bin i tnh tin hnh vung P theo vector v(1,2) thnh hnh vung Q c
minh ha nh hnh v sau:

74

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

yQ

yQ
O

r
v

yP
O

r
v

P
yP

xQ

xP

Tnh tin object

xQ

xP

Tnh tin h trc ta

r
Ta thy khi tnh tin hnh P theo vector v ta c hnh Q, y c gi l php bin i
r
thun. Ngc li, khi ta tnh tin h trc ta OXY theo vector v ta c h trc ta
mi OXY. Lc ny, ta ca hnh P trong h trc OXY tng ng ta ca hnh
Q trong h ta OXY:
Hay

POXY = QOXY

(a)
0 0

1 0
v y 1

m QOXY = POXY T vi T = 0
v
x
1
1
suy ra: QOXY .T = POXY .T .T = POXY (b)
t (a) v (b) suy ra:
1

1
-1
QO ' X 'Y ' = QOXY .T vi T = 0
v
x

0
1
vy

0
1

Hay ni cch khc: l mt im Q c ta (xQ,yQ) trong h ta OXY s c ta l


(xQ, yQ) trong h ta OXY v
(xQ, yQ, 1) = (xQ, yQ, 1).T-1
Mt cch tng qut:
Gi s gi 1 l mt php bin i Homogen bin im P thnh im Q
vi ma trn bin i l Tthun.
Cng s dng php bin i 1 nhng ln ny l bin i h trc OXY
thnh h trc OXY. Th ma trn bin i s l Tnghch = T-1.
V lc mt im P trong h trc OXY s c gi tr ta trong h trc
OXY l:
P = P.Tnghch = P.T-1

75

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

I.11. Ci t
Sinh vin cn xy dng cc th tc tm ma trn ca cc php bin i c bn

trn. Mi th tc c cung cp cc u vo cn thit v u ra l mt ma trn


bin i (mng 2 chiu 3x3 phn t).
Xy dng mt th tc vi u vo l mt a gic v mt ma trn bin i, u
ra l a gic c bin i (bng cch nhn cc nh ca a gic vi ma
trn bin i).
Vit chng trnh s dng hai th tc trn minh ho cc php bin i c
bn. Chng trnh cho php bin i (nh tnh tin, quay, bin i t l, bin
dng,) cc hnh c bn nh tam gic, t gic, ng gic, hay mt hnh bt
k no nh hnh cc k t A, F, H, K.

II. Cc php bin i Affine 3D


II.1. Cc h trc ta
nh v mt im trong khng gian, ta c th chn nhiu h trc ta :
H ta trc tip : nu ta ang nhn mt phng (XY) th trc Z hng vo
mt chng ta (Qui tc bn tay phi).
H ta gin tip : Ngc li (Qui tc bn tay tri).
Z

Z
Y

O
Y
X

O
H gin tip

H trc tip

Thng thng, ta lun lun nh v mt im trong khng gian qua h trc tip.

P(x,y,z)

P(R,,)
R

H ta -ct

H ta Cu (Pole)

76

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

Trong h ta trc tip, Ta c cng thc chuyn i ta t h ta cu sang h ct nh sau:


x = R.Cos().Cos()
y = R.Sin().Cos()
z = R.Sin()
R2 = x2 + y2 + z2
thun tin cho vic tnh ton chng ta s s dng h to thun nht
(homogen), ma trn ca cc im c dng (x,y,z,1). Ma trn bin i l ma trn vung
4x4.

II.2. Cc cng thc bin i


Php bin i Affine 3D dng thun nht c dng: Q = P.T
vi P = (Px, Py, Pz, 1); Q = (Qx, Qy, Qz, 1) v ma trn bin i T c dng:
t11 t12 t13 0

t 21 t 22 t 23 0
t
t
t
0

31 32 33
tr tr tr 1
y
z

II.2.a.

Php tnh tin


1

0
Ma trn ca php tnh tin theo vector Tr = (trx, try, trz) l:
0

tr
x

II.2.b.

0
1
0

0
0
1

try

trz

0
0

Php bin i t l

Ma trn ca php bin i t l trong khng gian 3 chiu c dng:


sx 0 0 0

0 sy 0 0
T =
0 0 sz 0

0 0 0 1

Trong :
sx : h s t l theo trc X
sy : h s t l theo trc Y
sz : h s t l theo trc Z

II.2.c.

Php i xng

i xng qua mt (OXY):

0
0

0 0
1 0
0 1
0 0

0
0

1
77

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

i xng qua mt (OXZ):

i xng qua mt (OYZ):

II.2.d.

1 0

0 1
0 0

0 0

1 0

0 1
0 0

0 0

0 0

0 0
1 0

0 1
0 0

0 0
1 0

0 1

Php quay

Ta nhn thy rng, nu php quay quay quanh mt trc no th thnh phn ta
ng vi trc ca vt th s khng thay i. Do , ta c ma trn ca cc php quay
nh sau:
Cos ( ) Sin( ) 0 0

Sin( ) Cos ( ) 0 0
Quay quanh trc Z:
0
0
1 0

0
0
0 1

Quay quanh trc X:

0
0
1

0 Cos ( ) Sin( )
0 Sin( ) Cos ( )

0
0
0

0
0

Quay quanh trc Y:

Cos ( )

0
Sin( )

0
0

0 Sin( )
1
0
0 Cos ( )
0
0

Ch : Tch ca 2 ma trn ni chung khng giao hon.

III. Cc php chiu vt th trong khng gian ln mt phng


III.1. Php chiu phi cnh (Perspective)
Php chiu ny cho hnh nh gn ging nh khi ta nhn vt th trong th gii thc.
tm hnh chiu P(x,y) ca P(x,y,z), ta ni P vi mt (tm chiu). Giao im ca
ng ny vi mt quan st chnh l P.

78

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

Y
P(x,y,z)
y' P

(0,0,E)
Z

Mt
E

Mt phng
chiu

Gi s P nm pha trc mt, tc l P.z < E. Phng trnh tham s ca tia chiu i qua P
c vit:
E*(1-t) + P*t vi tR
Hay vit c th l:
P(t) = (0,0,E).(1-t) + (x,y,z).t (*)
Vi P(t) l im trn tia chiu ph thuc vo tham s t.
x P = 0(1 t ) + x.t

(EP): y P = 0(1 t ) + y.t (*)


z = E (1 t ) + z.t
P
Giao im vi mt phng quan st l P s c thnh phn Z = 0. nn phng trnh
(*) tr thnh
x P ' = 0(1 t ) + x.t

y P ' = 0(1 t ) + y.t


z = E (1 t ) + z.t = 0
P'
T E.(1-t) + z.t=0 suy ra t =

x = xP =

x
1 z / E

1
z
1
E

. Thay t vo 2 phng trnh trn ta tnh c:

y = yP =

y
1 z / E

Nhn xt

i/ Php chiu phi cnh khng gi nguyn hnh dng ca vt th.


ii/ Ch c nhng ng thng song song vi nhau ng thi song song vi mt phng
chiu th mi cho nh song song vi nhau, cn tt c cc ng thng khc u
cho nh hi t n tm chiu (mt).
iii/ Vt trc mt phng chiu th c phng ln, sau mt phng chiu th b thu
nh. Vt xa th trng nh, gn th trng ln.

79

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

III.2. Php chiu song song


Nu chng ta chn phng chiu vung gc vi mt phng chiu (v cng l
vung gc vi mt phng OXY) th:
x = x;
y = y

IV. Quan st vt th 3D & Quay h quan st


Khi m t vic quan st mt vt th trong khng gian ta cn lu cc im sau:
Vt th c m t (hay o c) trong h trc ta quy chiu ca ring n v
c gi l h trc cc b (O, X, Y, Z) (hay thut ng l Local Coordinates)
Mt nm gc ca mt h ta gin tip th hai tm gi l (O, X , Y , Z) v
c gi l h ta ngi quan st (hay h quan st-View coordinates)
Mt phng chiu vung gc vi ng thng OO
Trc Z ca h to quan st hng vo gc O.
Z

Y
X

X
Z

Mt phng chiu
(s c th hin ln mn hnh)

Y
X
Y

X
Z

Mt phng chiu
(s c th hin ln mn hnh)

By gi, ta kho st php bin i mt im P(x,y,z) trong h to th nht sang


P(x,y,z) trong h to th hai ri chuyn sang to trn mt phng quan st.
Bc 1: Tnh tin h trc ta t gc O thnh O.

80

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

Z1
Z

Y
X
O

Y1

Z
O

X1
Y

Ma trn ca php tnh tin h trc ta theo vector OO l:


0
0 0
1
0
0
1

0
1
0 0
0
1
0
A=
=
0
0
1 0
0
0
1

M N P 1 R.Cos ( ).Cos ( ) R.Sin( ).Cos ( ) R.Sin( )


0
0

v h (OXYZ) bin i thnh h (OX1Y1Z1).


Bc 2: Quay h (OX1,Y1,Z1) mt gc - (=900 - ) quanh trc Z1 theo chiu kim
ng h. Php quay ny lm cho trc m ca Y1 ct trc Z.

Z2

Gc quay

Z
Y
X
O

Y1

Z
O

Y2

X2 X1

X
Ta gi Rz l ma trn ca php quay quanh trc Z mt gc a
Cos (a ) Sin(a ) 0 0

Sin(a) Cos(a) 0 0
Rz =
0
0
1 0

0
0
0
1

81

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

V y l php quay h trc, nn phi dng ma trn nghch o Rz1


Cos (a) Sin(a)

Sin(a) Cos (a)


1
Rz =
0
0

0
0

0
0
1
0

0
0

ta thay gc a = - . Theo cc php ton lng gic:


Sin(-') = -Sin(') = -Sin(900 - ) = -Cos()
Cos(-') = Cos(') = Cos(900-) = Sin()
Nn ma trn ca php quay tm c s c dng:
Sin( ) Cos ( ) 0 0

Cos ( ) Sin( ) 0 0

B=
v h (OX1,Y1,Z1) bin i thnh h (OX2,Y2,Z2).

0
0
1 0

0
0
0 1

Bc 3: Quay h (OX2,Y2,Z2) mt gc 90 + quanh trc X2. Php bin i ny s

lm cho trc Z2 hng n gc O (v ng thi khin cho 2 mt phng OYZ v OY2Z2


trng nhau) .

Y3

Gc Quay

Z2

Y
X
O

Z3
O

Y2

X3
Y

X
Ta c:
0
0
1

0 Cos (a) Sin(a )


Rx =
0 Sin(a ) Cos (a )

0
0
0

0 -1
R x=
0

0
0
1

0 Cos (a) Sin(a)


0 Sin(a ) Cos (a )

0
0
0

0
0

Thay gc a = 900 + , ta c: Cos(900 + ) = -Sin() v Sin(900 + ) = Cos() nn


ma trn tm c s c dng:

82

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

0
0
1

0 Sin( ) Cos( )
C=
0 Cos( ) Sin( )

0
0
0

0
0

Lc ny, h (OX2,Y2,Z2) bin i thnh h (OX3,Y2,Z3).


Bc 4: Bin i h trc tip (OX3,Y3,Z3) thnh h gin tip.

Trong bc ny, ta phi i hng trc X3 bng cch i du cc phn t ca ct


X. Ta nhn c ma trn:
Z
Y
X
O
Z
O

X3
Y

X
1

0
D=
0

0
1
0
0

0
0
1
0

0
v h (OX3Y3Z3) bin i thnh h (OXYZ).
0

Tm li

Cc im trong khng gian s nhn trong h quan st mt ta c dng:


(x, y, z, 1) = (x, y, z, 1).A.B.C.D
Gi T = A.B.C.D, ta tnh c:
sin( ) Cos ( ).Sin( ) Cos ( ).Cos ( ) 0

Cos ( ) Sin( ).Sin( ) Sin( ).Cos ( ) 0

T=
0
Sin( )
0
Cos ( )

0
0
1
R

Cui cng ta c:
(x, y, z, 1) = (x, y, z, 1).T

hay:
x = -x.Sin() + y.Cos()
y = -x.Cos().Sin() - y.Sin().Sin() + z.Cos()
z = -x.Cos().Cos() - y.Sin().Cos() - z.Sin() + R

83

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

* By gi ta li chiu nh ca h quan st ln mn hnh.

IV.1. Php chiu phi cnh


By gi ta quan tm n bi ton chiu mt im P trong h ta quan st ln
mt phng chiu t trc mt ngi quan st (tc vung gc vi trc z) v cch mt mt
khong l D. Lc ny bi ton c lp li ch cn mt h ta 3 chiu (h ta quan
st) v mt h ta 2 chiu (h ta trn mt phng chiu), nn cho d hiu (v
quen thuc) ta tm gi h ta quan st l h OXYZ, v h ta trn mt phng chiu
l h OXY
Y

y'

P(x,y,z)
O

P(x,y)
O

D
Mt chiu

Z
X

P(x,y,z)

Mt chiu

x'

P(x,y,z)

X
Cho mt im P(x,y,z) v hnh chiu ln mt phng chiu ca n l P(x,y).
gi D l khong cnh t mt phng chiu n mt (gc ta ).
Xt cc tam gic ng dng, ta c:
x/x = D/z
v
y/y = D/z
hay x= x.D/z
v
y= y.D/z
Ch : ni mt cch khc l to x v y c nhn vi mt h s D/z. Nn nu z>D
th kt qu l thu nh (hay hi t) ngc li khi z<D th kt qu c phng ln.

Phng to

Thu nh

Mt
Vt th
Mn hnh

Mn hnh

84

Chng 4: Cc php bin i hnh hc Nguyn Hu Ti

IV.2. Php chiu song song


Php chiu song song c th c xem nh tm chiu xa v cc nn lc ny ta
c:

x = x

y = y

KT LUN

Ta c 4 gi tr nh hng n php chiu vt th 3D l: cc gc , , khong


cch R t O n O v khong cch D t O n mt phng quan st.
Nh vy:
Tng gim s gip ta c th di chuyn h quan st quanh trc OZ quan st
bn mt bn ca vt th.
Tng gim s gip ta c th di chuyn quanh gc O theo hng vung gc vi
mt phng OXY quan st c mt trn hay mt di ca vt th.
Tng gim R quan st vt t xa hay gn.
Tng gim D phng to hay thu nh nh.

IV.3. Ci t
Sinh vin cn xy dng mt th tc cho php chuyn to ca i tng t h to
trc tip sang h to quan st.
Xy dng mt th tc cho php chiu vt th t h to quan st ln mt phng
quan st theo php chiu song song hay phi cnh ri v kt qu chiu ln mn hnh.
Xy dng chng trnh s dng 2 th tc trn minh ho hnh nh ca mt hnh
hp. Nng cao hn sinh vin cn theo i cc gc v chng trnh c th th
hin c hnh hp t nhiu gc .

IV.4. V d minh ha
Vit chng trnh m t php quay ca mt hnh lp phng quanh cc trc.

V. Bi tp cui chng
1. Ci t thut ton xn mt on thng vo mt hnh ch nht c cnh khng
song song vi trc ta .
2. Vit chng trnh v mt Ellipse c cc trc khng song song vi h trc ta
.
3. Da vo bi tp 2, hy m phng qu trnh quay ca mt Ellipse xung quanh
tm ca n.
4. M phng qu trnh quay, tnh tin ca mt hnh bt k trong mt phng quanh
trc ta .
5. M phng chuyn ng ca tri t xung quanh mt tri ng thi m t
chuyn ng ca mt trng xung quanh tri t.
6. Vit chng trnh v ng h ang hot ng.
7. Vit chng trnh v cc khi a din u trong khng gian.

85

Chng V: Cc phng php dng ng cong


v mt cong

Trong chng ny chng ta s xem xt mt s phng php to ra cc


ng cong v mt cong trn biu din cc vt th l phng php Bezier v
B-Spline. y ta ch bn n cc phng php xy dng ng v mt cong da
trn mt s c im d liu m t v ng cong . Cc d liu m t l cc
im kim sot t c th ni suy ra ng cong v mt cong mong mun.
Hay ni r hn l vi mt ng cong bt k ta c th tip cn theo 2 cch:
1. Ly mt s im trn ng cong lm mu ri tm mt hm ton hc ph hp
v tinh chnh hm ny sao cho n i qua cc im mu v khp vi ng
cong ban u. Khi ta c c cng thc ca ng cong v dng n pht
sinh li.
2. Cch khc l dng mt tp cc im kim sot v dng mt thut ton xy
dng nn mt ng cong ca ring n da trn cc im ny. C kh nng l
ng cong c to ra khng khp vi ng cong ban u, lc ny ta s di
chuyn mt vi im kim sot v khi thut ton pht sinh mt ng cong
mi da trn cc im kim sot mi thay i ny. Tin trnh thay i cc im
kim sot c lp i lp li cho n khi ng cong c to ra khp vi
ng cong mong mun (hay ng cong mu). Lc ny ta s lu tr tp im
kim sot ny pht sinh li ng cong khi cn.
y ta s tip cn vn theo phng php th hai. Cc ng cong hay mt
cong c xy dng y c gi l cc ng cong hoc mt cong Bezier hay
mt loi na l ng cong hoc mt cong Spline.

I. ng cong Bezier & mt cong Bezier.


Trong phn ny chng ta s trnh by phng php nh ngha mt
ng cong tham s P(t) da trn mt tp cc im. Trc tin ta xem xt tng
ca thut ton Casteljau nh ngha cc ng cong loi ny, sau s a ra
dng ton hc ca ng cong Bezier qua cng thc Bernstein.

86

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

I.1. Thut ton De Casteljau:


xy dng ng cong P(t), thut ton ny da trn mt dy cc im
cho trc ri to ra cc gi tr P(t) ng vi cc gi tr t khc nhau. Khi thay i cc
im ny th s ko theo s thay i dng ca ng cong. Phng php to
ng cong y l da trn mt dy cc thao tc ni suy tuyn tnh (hay ni suy
khong gia in-between).
V d vi 3 im P0, P1, P2 ta c th xy dng mt ng cong Parabol ni
suy t 3 im ny bng cch: chn mt gi tr t no nm gia 0 v 1 ri chia
on P0P1 theo t l t, ta c P01(t) trn P0P1 .Tng t chia tip P1P2 theo cng
t l t ta c P11(t). Ni P01(t) vi P11(t), Li ly im trn P01P11 chia theo t l t
ta c P02(t).
Vi cch lm ny, khi ly t nhng gi tr khc nhau gia 0 v 1 th s
c tp im P02(t), v chnh l ng cong P(t).
Biu din bng phng trnh:
P01(t)=(1-t).P0 + t.P1
P11(t)=(1-t).P1 + t.P2
P02(t)=(1-t).P01+ t.P11
1
Thay P0 v P11 bng v phi ca hai phng trnh trn ta c:
P(t)=P02(t)=(1-t)2.P0+2t(1-t).P1 + t2.P2
y l mt ng cong bc 2 theo t vi cc tham s P0,P1,P2 do n l mt
Parabol.
Tng qut ta c thut ton Casteljau cho (L+1) im:
Gi s tp im l P0,P1,,PL
Vi mi gi tr t cho trc ta to ra im Pir(t) th h th r t th h th (r-1)
trc theo phng trnh:
Pir(t)=(1-t).Pir-1(t) + t.Pi+1r-1(t)
Vi r=1,2,,L;
i=0,1,2,,L-r
Th h cui cng P0L(t) c gi l ng cong Bezier, v cc im
P0,P1,,PL c gi l cc im kim sot hay a gic Bezier.

I.2. Dng BERNSTEIN ca cc ng cong BEZIER


ng cong Bezier da trn (L+1) im kim sot P0,P1,PL c cho bi
cng thc
L

P(t ) = Pk BkL (t )
k =0

P(t) ng vi mt gi tr t no nm gia 0 v 1 l mt im trong 2D hay 3D.


BkL (t ) c gi l a thc BERNSTEIN v c cho bi cng thc:
BkL (t ) = C Lk (1 t ) L k t k =

L!
(1 t ) L k t k
k!( L k )!

,vi k L

87

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

Mi a thc Bernstein c bc l L.
Thng thng ta cn gi cc BkL(t) l cc hm trn. Bi ta c th hiu vect P(t)
nh l mt s pha trn ca cc vct P0,P1,,PL vi mt t l nht nh theo cng
thc Bernstein cc gi tr t khc nhau gia 0 v 1.
P1

P2
P1

P0

P1

P0

P11

P0

P12

P03

P21

P01

P0

P2

ng cong Bezier bc 2

P0

P3

ng cong Bezier bc 3

ng cong Bezier bc 3 c v bi chng trnh Paint


i vi mt BEZIER ta c phng trnh sau:
M

P (u , v ) = Pi , k BiM (u ) BkL (v )
i =0 k =0

Trong trng hp ny khi a din kim sot s c (M+1)(L+1) nh.

I.3. Dng biu din ma trn ca ng Bezier


thch hp cho cc tnh ton trn my tnh (vic tnh ton tr nn hp l
v nhanh chng) ngi ta thng biu din cng thc di dng ma trn
BL(t) = [B0L(t), B1L(t), B2L(t),, BLL(t)]
P = [P0, P1, P2,,PL]

88

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

P0
P
L
1
L
L
L
L
L
P (t ) = Pk Bk (t ) = B0 (t ) B1 (t ) B2 (t ) L BL (t ) P2 = B L (t ) PT

k =0
M
PL

(PT l dng chuyn v ca P)

Mi BkL (t ) , vi k=0,1,L li c th xem l tch ca (t0, t1, t2,, tL) vi cc h s


tng ng ca cc ti i=0..L. Vector (t0, t1, t2,, tL) c gi l c s lu tha
(Power basic). Di dng a thc c th biu din BkL (t ) nh sau:
BkL (t ) = a0kt0 + a1kt1 + a2kt2 + + aLktL = (t0, t1, t2,, tL)(a0k, a1k, a2k,, aLk)T
Do P(t) c th biu din li nh sau:
P(t) = PowL(t).BezL.PT
Trong :
PowL(t) = (t0, t1, t2,, tL)
BezL l ma trn biu din mng BL(t) trong mi ct i ca ma trn ng vi
cc h s tng ng (a0i, a1i, a2i,, aLi) ca a thc BiL(t).
V d ma trn Bez3 cho cc ng Bezier bc 3:
0

0
0

0
0
1

3
0
3
Bez 3 =
3 6
3

1
3 3

to ra mt ng cong Bezier t mt dy cc im kim sot ngi ta


p dng phng php Polyline gn ng bng cch ly mu hm P(t) cc gi tr
cch u nhau ca tham s T. V d nh ti = i/N vi i=0,1,2,,N. Khi ta s
c cc im P(ti) t cng thc, ni cc im ny li bng cc on thng ta s
c ng cong Bezier gn ng. tnh P(ti) c th p dng dng ma trn ca
P(t) nh va ni trn, khi ch c thnh phn PowL(t) l thay i, cn tch
vi P = (P0, P1,, PL) l khng i.
BezL.PT

I.4. Cc tnh cht ca ng cong BEZIER


ng cong Bezier c mt s tnh cht quan trng sau:
I.4.a.
Ta c

Ni suy c cc im u v im cui:
Tht vy:
L

P(t ) = Pk BkL (t )
k =0

89

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

Khi ly gi tr t tin n 0 th ta c:
L
L
L
L
Lim+ (P(t ) ) = Lim+ Pk BkL (t ) = Lim+ Pk BkL (t ) = Pk Lim+ BkL (t ) = Pk Lim+ BkL (t )
k = 0 t 0
k = 0 t 0

t 0
t 0
k =0
k = 0 t 0

M ta thy:

( )

Lim+ BkL (t ) = Lim+ CLk (1 t ) L k t k = CLk Lim+ (1 t ) L k Lim+ t k = CLk 1 0 = 0 vi k0


t 0

t 0

t 0

t 0

Khi k=0 th:

L!
Lim+ (B0L (t ) ) = Lim+ (CL0 (1 t ) L 0 t 0 ) = Lim+
(1 t ) L 0 t 0 = Lim+ ((1 t ) L 0 t 0 )
t 0
t 0
t 0 0! L!
t 0
= Lim+ ((1 t ) L ) Lim+ (t 0 ) = Lim+ ((1 t ) L ) Lim+ (1) = Lim+ ((1 t ) L ) 1 = Lim+ ((1 t ) L ) = 1
t 0

Vy:

t 0

t 0

t 0

t 0

t 0

Lim+ (P(t ) ) = P0 1 + P1 0 + P2 0 + K + PL 0 = P0
t 0

Tng t cho Lim (P (t ) ) ta c Lim (P (t ) ) = PL


t 1

t 1

Vy ng cong Bezier bt u ti im P0 v kt thc ti im PL


I.4.b.

Tnh bt bin Affine:


Khi bin i Affine mt ng cong Bezier, ta khng cn bin i mi
im trong ng cong mt cch ring r m ch cn bin i Affine cc im
kim sot ca ng cong , ri s dng cong thc Bernstein ti to ng
cong Bezier c bin i. Ta gi y l tnh bt bin Affine ca cc ng
Bezier.
Chng minh:
Gi s ng vi mt gi tr t c th, th P(t) l mt im, v c bin i
Affine thnh P(t) th:
P(t)=P(t).M + Tr =

P B
k =0

L
k

(t ) .M + Tr

N: ma trn bin i
Tr: vct tnh tin
L

P(t ) = (Pk .M + Tr )BkL (t ) (*)

Xt ng cong

k =0

c to ra bng cch bin i Affine cc vct Pk , ta s chng minh ng cong


ny chnh l P(t).
Khai trin (*) ta c:
L

k =0

k =0

k =0

k =0

k =0

Pk .M .BkL (t ) + Tr .BkL (t ) = Pk .M .BkL (t ) + Tr BkL (t ) = Pk .M .BkL (t ) + Tr


do

B
k =0

L
k

(pcm)

(t ) = 1

90

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

(Chng minh

B
k =0

L
k

(t ) = 1 . Tht vy, ta bit khai trin nh thc Newton (a+b) ,

y p dng vi a=(1-t) v b=t lc ny

B
k =0

L
k

(t ) = [(1 t ) + t ] = 1L = 1 ).
L

V vy ta c P(t) nm trn ng cong Bezier to ra bi cc im kim sot Pk .


Vi Pk l nh ca Pk qua php bin i Affine.
I.4.c.

Tnh cht ca bao li


Ta nhc li bao li ca cc im kim sot l tp nh nh nht cha tt c
cc im kim sot . cng chnh l tp tt c cc t hp li ca cc im
kim sot.
L

k Pk vi k 0 v
k =0

k =0

=1

Do P(t) l mt t hp li ca cc im kim sot t, v khng c h s Bernstein no


m v

B
k =0

L
k

(t ) = 1 nn mi im trong ng cong Bezier s nm trong bao li

ca cc im kim sot.
I.4.d.

chnh xc tuyn tnh:

ng cong Bezier c th tr thnh mt ng thng khi tt c cc im


kim sot nm trn mt ng thng, v khi bao li ca chng l mt ng
thng nn ng Bezier do b kp vo trong bao li nn n cng tr thnh ng
thng.
I.4.e.

Bt bin vi nhng php bin i Affine:

C th i ng cong Bezier trong mt khong tham s khc vi khong


(0,1), v d nh mt khong (a,b) no bi mt nh x no , v d: ng cong
tham s t thnh ng cong tham s u khng lm thay i ng cong ban u
(dng tnh bt bin Affine).
I.4.f.

o hm ca cc ng Bezier:
L

P(t) =(P(t))= L Pk BkL 1 (t ) , Pk=Pk+1 - Pk


k =0

l mt ng cong Bezier khc c to ra t cc vct kim sot Pk.

91

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

I.5. nh gi ng cong Bezier & s khc bit ca ng cong Spline:


Bng cc im kim sot, ta c th to ra cc dng ng cong khc nhau
bng cch hiu chnh cc im kim sot cho ti khi to ra c mt dng ng
cong mong mun. cng vic ny c lp i lp li cho n khi ton th ng
cong tha mn yu cu.
Tuy nhin, c mt vn i vi ng cong Bezier l tnh cc b yu ca
n, ngha l khi ta thay i bt k mt im kim sot no th ton b ng cong
b thay i theo, nhng trong thc t thng ta mong mun ch thay i mt t v
dng ng cong gn khu vc ang hiu chnh cc im kim sot.
Tnh cc b yu ca ng cong Bezier c th thy c qua vic tt c cc
a thc BkL(t) u khc 0 trn khong [0,1]. Mt khc ng cong P(t) bn thn n
li l mt t hp tuyn tnh ca cc im kim sot c gia trng bi cc hm
BkL(t) nn ta suy ra rng mi im kim sot u c nh hng n ng cong
tt c cc gi tr t(0,1). Do hiu chnh bt k im kim sot no cng u nh
hng n dng ng cong trn ton th.
gii quyt vn ny ngi ta i n s dng mt tp cc hm trn
khc nhau thay v ch mt hm trn BkL(t) nh ca ng cong Bezier, cc hm
trn ny c gi mang ch l mt phn ca khong [0,1], hay ni cch khc l mi
hm trn s ch trn vi mt s im kim sot cho ra mt phn ca on cong.
Tp cc on cong do mi hm trn mang li s to nn mt ng cong m ta
mong mun. Nh vy hm trn chnh l mt tp cc a thc c nh ngha trn
nhng khong k nhau, c ni li vi nhau to nn mt ng cong lin tc.
Cc ng cong kt qu c gi l a thc ring phn hay tng phn.
V d ta nh ngha hm g(t) gm 3 a thc a(t), b(t) v c(t) nh sau:
c gi mang [0,1]
a(t)= 1/2 t2
2
g(t)=
b(t)=3/4(t - 3/2)
c gi mang [1,2]
c gi magn [2,3]
c(t)=1/2(3 - t)2
Gi mang ca g(t) l [0,3]
Cc gi tr ca t ng vi cc ch ni ca cc on gi l nt (knot).
Hn na ti cc ch ni ng cong g(t) l trn, khng b gp khc. Ta gi
l hm Spline.
Vy mt hm Spline cp m l a thc ring phn cp m c o hm cp m-1 lin
tc mi nt. Da trn tnh cht ca hm Spline, ta c th dng n nh mt hm
trn to ra ng cong P(t), da trn cc im kim sot P0,P1,,PL.
Khi :
L

P (t ) = Pk G k (t )
k =0

92

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

II. ng cong Spline v B-Spline:

Mt ng cong Spline c v bi chng trnh AutoCad

(ng cong Multi-Spline vi cc im iu khin (vector tip tuyn) gip iu khin


cong)

Mt hm Spline cp m l a thc ring phn cp m c o hm cp m-1 lin


tc mi nt.
Da trn tnh cht ca hm Spline, ta c th dng n nh mt hm trn to ra
ng cong P(t), da trn cc im kim sot P0,P1,,PL.
Khi :

P (t ) = Pk G k (t )
k =0

Theo trn ta c
L

P (t ) = Pk Rk (t )
k =0

vi : Pk : k=0,1,,L l cc im kim sot.


Rk(t) : k=0,1,,L l cc hm trn, lin tc trong mi on con [ti,ti+1 ] v
mi nt. Mi Rk(t) l mt a thc ring phn (piceewise polynomial). Cc on
ng cong ring phn ny gp nhau mi nt v to cho ng cong tr nn lin
tc. Ta gi nhng ng cong nh vy l Spline. Cho trc mt vector nt, th c
nhiu h hm trn c th c dng to ra cc ng cong Spline c th nh

93

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

ngha trn vector nt . Mi h nh vy c gi l c s cho cc Spline. Trong


s cc h hm ny, c mt c s c th m cc hm trn ca n c gi mang nh
nht m nh vy n em li kh nng kim sot cc b ln nht. l cc BSpline ( B l vit tt ca Basic).
i vi cc hm B-Spline, mi a thc ring phn to nn n c mt cp
no , ngi ta gi l m, do thay v dng k hiu Rk(t) cho cc hm ring phn
ny bi Nk,m(t).
Do ng cong B-Spline c th biu din l :
L

P (t ) = Pk N k ,m (t )
k =0

Trong cc hm B-Spline cp m th hm B-Spline cp 2 v cp 3 l quang trng


nht, n c dng trong hu ht cc chng trnh x l ha.
Tm li: xy dng cc ng cong B-Spline ta cn c:
Mt vc t nt T=(t0,t1,)
(L+1) im kim sot Pk
Cp m ca cc hm B-Spline v cng thc c bn cho hm B-Spline
Nk,m(t).
Nk,m(t)=Nk, m-1(t) + Nk+1, m-1(t)
y l mt cng thc quy vi
1 nut k < t k +1
N k ,l (t ) =
0 ng-c li

(Hm hng 1 trn on [tk,tk+1])


i vi cc mt B-Spline th ta c cng thc biu din tng t:
m L

P(u,v)= Pi, k Ni, m(u) Nk, m(v)


i=0 k=0

(tng t nh mt Bezier)
* Ghi ch: Cc ng Bezier l cc ng B-Spline.
Sau y l mt cng thc cho ng cong Spline bc 3 c tn l Hermite
Spline vi cng thc sau:

P (u ) = u 3 u 2

Pk 1
P
u 1 Mc k
Pk +1

Pk + 2

vi Mc c gi l ma trn ct yu:
s
s 2 s s 2
2s s 3 3 2s s

Mc =
s
0
0
s

1
0
0
0

vi s = (1-t)/2.

Hay dng tng minh s l:


94

Chng 5: Cc phng php dng ng cong & mt cong


Nguyn Hu Ti

P(u)

=
=

Pk-1[-su3 + 2su2 su] + Pk [(2-s)u3 + (s-3)u2 + 1] +


Pk+1 [(s-2)u3 + (3-2s)u2 + su) ] + Pk+2 [su3 - su2]
Pk-1 CAR0(u) + Pk CAR1(u) + Pk+1 CAR2 (u) + Pk+2 CAR3(u)

v ta gi CARk(u) vi k=0,1,2,3 l cc hm trn (blending).

95

Chng VI: M hnh WireFrame

Th gii quanh ta hu ht u l nhng i tng 3 chiu (3D, gm chiu


rng, chiu di v chiu cao). Bng nhng k thut nh v, chp hnh, quay
phim chng ta thng c biu din hnh nh thc 3 chiu ca i tng di
nhng gc nhn khc nhau bng cc hnh v trn mt phng hai chiu ca giy,
khung v hay mn nh.v.v th hin li cc i tng thc t. Cc hnh nh
phi tun theo mt s quy lut v phi cnh, sng ti nhm gip ngi xem c th
tng tng li hnh nh mong mun.
Ngy nay di s tin b ca my tnh in t th nhu cu th hin cc i
tng bng my tnh in t tr thnh mt nhu cu thit yu. Th hin cc i
tng thc bng my tnh c bit l biu din cc i tng 3 chiu l mt cng
vic em li li ch rt ln, bi n d dng cho ta nhng gc nhn khc nhau,
nhng cch th hin, nhng bin i v nhiu tc ng khc mt cch hiu qu m
khng mt nhiu thi gian v tin ca. Nu nh trc y, mt ngi kin trc s
lm vic trn bn giy vi cng c l bt v v giy, th cng vic l rt kh nhc,
i khi mt bng v ch v sai xt mt vi chi tit hay mun sa i mt vi im
trn bn v, th vic phi v li ton b bn v l iu khng trnh khi. Ngy nay,
vi s tr gip c lc ca my tnh, cc kin trc s c th nhanh chng th hin
cc tng ca mnh trn my tnh, cng vic th hin bng v tr nn d dng
hn, cc sai st hay sa i c thc hin mt cch d dng m khng nht thit
phi thc hin v li ton b bng v, ngoi ra my tnh cn c th th hin ra
nhiu bng v khc nhau cho cng mt i tng di nhiu gc nhn, v nhiu
chc nng tin ch khc i km tnh kt cu lc, to phi cnh, to on phim m
t cng trnh,
Trong phn ny chng ta s gii thiu mt s khi nim v k thut trong
vic biu din cc i tng 3 chiu trn my tnh, bt u t cc i tng n
gin nh cc hnh khi, cc a din, cc mt m ta c th n gin ho cch th
hin n bng mt tp cc nh v cc cnh ni lin.

96

Chng 6. M hnh wireframe Nguyn Hu Ti

I. M hnh Wireframe:
M hnh Wireframe hay cn gi l m hnh khung dy lu tr thng tin v
hnh dng (b khung) ca i tng. Thng tin lu tr c t chc thnh 2 danh
sch, mt danh sch nh, v mt danh sch cnh c to nn t cc nh cha
trong danh sch nh. Danh sch nh lu gi to cc nh ca i tng m
mi nh bao gm cc thnh phn to (x,y,z), danh sch cnh lu gi danh sch
cc cp th t im to nn cnh m to ca cc im ny cha trong danh sch
im.
V d: lu tr hnh dng mt chic gh g th s nh hnh v sau:
Z

(-1,-1,3)

(-1,-1,2)
(1,-1,3)
(1,-1,2)
(-1,-1,0)

(1,-1,0)
X

1
(1,1,0)

1
(-1,-1,-3)

(1,-1,-3)
Danh sch nh
Stt
X
Y
Z
1
1
1
-3
2
-1
1
-3
3
-1
-1
-3
4
1
-1
-3
5
1
1
0
6
-1
1
0
7
-1
-1
0
8
1
-1
0
9
1
-1
2
10
-1
-1
2
11
1
-1
3
12
-1
-1
3

(-1,1,0)
Y

(-1,1,-3)

(1,1,-3)

Danh sch cnh


Stt
nh 1
nh 2
1
1
5
2
2
6
3
3
12
4
4
11
5
5
6
6
6
7
7
7
8
8
8
5
9
9
10
10
11
12

97

Chng 6. M hnh wireframe Nguyn Hu Ti

M hnh wireframe cho mt nhn vt trong game

98

Chng 6. M hnh wireframe Nguyn Hu Ti

C nhiu cch lu gi mt m hnh WireFrame trong mt ng dng nh: mng,


xu, Danh sch mc ni, v mi hnh thc u c nhng u nhc im ring.
y chng ta s gii thiu mt cu trc Record n gin da trn 2 mng c nh
lu gi thng tin v nh v cnh.
Const
MaxDinh=50;
{S nh ln nht cho php lu tr}
MaxCanh=100;
{S cnh ln nht cho php lu tr}
Type
Pointer_3D=record
x,y,z:real;
end;
WireFrame=record
SoDinh
Dinh
SoCanh
Canh

: 0..MaxDinh; { cha s nh ca i tng}


: Array[1..MaxDinh] of Pointer_3D;
: 0..MaxCanh; { cha s cnh ca i tng}
: Array[1..MaxCanh] of record
D1,D2: 0..MaxDinh;
end;

end;
Trong mi cnh l mt phn t ca mng Canh, phn t Canh[i] cha hai thng
tin D1 v D2 l th t ca 2 nh trong danh sch Dinh, m hai nh to nn
cnh.

II. V hnh da trn d liu kiu WireFrame vi cc php


chiu
V mt i tng dng m hnh khung th mt cch n gin l ta v cc
cnh trong danh sch. Song v mt cnh trong khng gian 3-chiu ln mt
phng 2-chiu th ta cn thc hin cc php chiu chiu chng ln mt phng
chiu, hay ni mt cch c th l ta cn chiu cc im u mt ca cc cnh ln
mt phng chiu ri sau ni chng li
K thut chung v mt on thng 3D:
+ Chiu mi im u mt thnh tng im 2-chiu
+ V on thng ni hai im chiu ta c on thng chiu
iu ny lm c bi v cc php chiu ni chung bo ton ng thng. Vn
cn li l i tm hnh chiu ca mt im trong khng gian 3-chiu ln mt phng
chiu. Ta xem xt hai php chiu di y

II.1. Php chiu trc giao n gin


Chiu mt im P(x,y,z) ln mt mt phng th n gin nht l chn mt
phng chiu l mt phng to . V d nh chiu ln mt phng OXY, khi ta
99

Chng 6. M hnh wireframe Nguyn Hu Ti

ch vic b i thnh phn z trong to ca im v gi nguyn cc thnh phn


x,y ta c to ca im chiu trn mt phng OXY.

II.2. Php chiu phi cnh n gin


Php chiu phi cnh c thc hin kh n gin, song n cho ta mt ci
nhn kh t nhin hn v i tng 3D so vi php chiu trc giao. Chng ta
lm quen vi cch nhn phi cnh trong i sng hng ngy
Php chiu phi cnh ph thuc vo v tr tng i ca mt v mt phng
chiu. V d nh trong hnh sau:
Y

Nh trnh by trong
chng IV (Cc php bin
P(x,y,z)
i hnh hc) ta c hnh
chiu phi cnh P' ca P ln
P
mt phng OXY c cc
thnh phn to l:
x'=x/(1-z/E) v y'=y/(1-z/E)
(0,0,E)
X
Mt
Ta d dng thy rng
Z
php chiu phi cnh gn
E
Mt phng
ging vi php chiu trc
chiu
giao trc y ngoi tr x
v y c nhn ln mt h
s t=1/(1-z/E). Tha s ny th thuc vo khong cch tng i E gia mt nhn
v mt phng chiu, v n s lm cho vt th (hay thnh phn) gn mt th c
hnh dng to ra cn nhng vt th (hay thnh phn) xa th c hnh dng nh li.

II.2.a.

Ci t thut ton
Sau y l chng trnh minh ho vic s dng m hnh WireFrame biu
din mt vt th l mt chic gh c m t u chng, ng thi chng
trnh cn ng dng kin thc ca chng Cc php bin i hnh hc, cho
php ngi quan st c th quan st vt th mi gc cnh nh chng trnh
thit lp h quan st v cho php ngi s dng quay h quan st bng cch dng
cc phm mi tn.
Program View_3D_Object;

{Chng trnh quan st i tng 3D n gin}

100

Chng 6. M hnh wireframe Nguyn Hu Ti


uses graph, crt;
const maxdinh=100;
maxcanh=200;
gocdt:real=35;
gocphi:real=30;
R:real=5;
d:real=17;
type point_3d=record
x,y,z:real;
end;
wireframe=record
sodinh:1..maxdinh;
dinh:array[1..maxdinh] of point_3d;
socanh:1..maxcanh;
canh:array[1..maxcanh] of record
D1,D2:1..maxdinh;
end;
end;
var wi,wic: wireframe;
hesophong:integer;
Color:byte;
procedure KhoiTaoDoHoa;

{Khi to ch ho}
var gd,gm,errorcode:integer;
begin
gd:=detect;
initgraph(gd,gm,'c:\bp\bgi\');
errorcode:=graphresult;
if errorcode<>grok then
writeln('graphics error');
end;
Procedure KhoiTaoGhe(var Wi:WireFrame);

{Khi to d liu m t v chic gh ta cp u chng vo bin Wi}


begin
With Wi do
begin
SoDinh:=12;
SoCanh:=10;
Dinh[1].x:= 1; Dinh[1].y:= 1; Dinh[1].z:=-3;
Dinh[2].x:=-1; Dinh[2].y:= 1; Dinh[2].z:=-3;
Dinh[3].x:=-1; Dinh[3].y:=-1; Dinh[3].z:=-3;
Dinh[4].x:= 1; Dinh[4].y:=-1; Dinh[4].z:=-3;
Dinh[5].x:= 1; Dinh[5].y:= 1; Dinh[5].z:= 0;
Dinh[6].x:=-1; Dinh[6].y:= 1; Dinh[6].z:= 0;
Dinh[7].x:=-1; Dinh[7].y:=-1; Dinh[7].z:= 0;
Dinh[8].x:= 1; Dinh[8].y:=-1; Dinh[8].z:= 0;
Dinh[9].x:= 1; Dinh[9].y:=-1; Dinh[9].z:= 2;
Dinh[10].x:=-1; Dinh[10].y:=-1; Dinh[10].z:= 2;
Dinh[11].x:= 1; Dinh[11].y:=-1; Dinh[11].z:= 3;

101

Chng 6. M hnh wireframe Nguyn Hu Ti


Dinh[12].x:=-1; Dinh[12].y:=-1; Dinh[12].z:= 3;
Canh[1].D1:=1; Canh[1].D2:=5;
Canh[2].D1:=2; Canh[2].D2:=6;
Canh[3].D1:=3; Canh[3].D2:=12;
Canh[4].D1:=4; Canh[4].D2:=11;
Canh[5].D1:=5; Canh[5].D2:=6;
Canh[6].D1:=6; Canh[6].D2:=7;
Canh[7].D1:=7; Canh[7].D2:=8;
Canh[8].D1:=8; Canh[8].D2:=5;
Canh[9].D1:=9; Canh[9].D2:=10;
Canh[10].D1:=11;Canh[10].D2:=12;
end;
end;
procedure ChuyenSangHeTrucQuanSat(wi:wireframe;var
wic:wireframe);

{Chuyn thng tin m t i tng t h trc OXYZ sang h trc Quan st


OXYZ, thng tin m t i tng trong h trc Quan st c cha trong bin
Wic}
var i:byte;
gdt,gphi:real;
begin
wic:=wi;

{Chuyn n v o gc sang Radian s dng cho cc hm Sin v Cos}


gdt:=gocdt/180*pi;
gphi:=gocphi/180*pi;
for i:=1 to wi.sodinh do
with wi.dinh[i] do
begin
wic.dinh[i].x:=-x*sin(gdt)+y*cos(gdt) ;
wic.dinh[i].y:=-x*cos(gdt)*sin(gphi)-y*sin(gdt)*sin(gphi)+z*cos(gphi);
wic.dinh[i].z:=-x*cos(gdt)*cos(gphi)-y*sin(gdt)*cos(gphi)-z*sin(gphi)+R;
end;
end;
procedure ChieuTrucGiao_Ve(wic:wireframe;hesophong:integer);

{Thc hin chiu trc giao ln mt phng chiu song song vi OXY ri nh x ln
mn hnh}
var i:byte;
xg,yg:integer;
dx:real;
begin
xg:=getmaxx div 2;
yg:=getmaxy div 2;
with wic do
for i:=1 to socanh do
begin
setcolor(color);
line(round(dinh[canh[i].D1].x*hesophong)+xg,

102

Chng 6. M hnh wireframe Nguyn Hu Ti


-round(dinh[canh[i].D1].y*hesophong)+yg,
round(dinh[canh[i].D2].x*hesophong)+xg,
-round(dinh[canh[i].D2].y*hesophong)+yg);
end;
end;
procedure xoay;
{Xoay quanh vt th quan st c ti cc v tr khc nhau, bng cch thay i cc
gc v gc khi ngi s dng bm cc phm mi tn}
var ch:char;
begin
repeat
ch:=readkey;
if ord(ch)=0 then
begin
ch:=readkey;
case ch of
#72:if gocphi>0 then gocphi:=gocphi-1
else gocphi:=360;
#80:if gocphi<360 then gocphi:=gocphi+1
else gocphi:=1;
#77:if gocdt>0 then gocdt:=gocdt-1
else gocdt:=360;
#75:if gocdt<360 then gocdt:=gocdt+1
else gocdt:=1;
end;
if ord(ch) in [72,75,77,80] then
begin

{Xa hnh c bng cch v mu Black (mu en)}


color:=Black;
ChieuTrucGiao_Ve(wic,hesophong);

{V hnh mi bng mu White (mu Trng)}


color:=White;
ChuyenSangHeTrucQuanSat(wi,wic);
ChieuTrucGiao_Ve(wic,hesophong);
end;
end
until ch=#27;
end;
BEGIN
KhoiTaoGhe(Wi);
KhoiTaoDoHoa;hesophong:=25;
setcolor(2);
outtextxy(30,30,'Press Across key to change View');
ChuyenSangHeTrucQuanSat(wi,wic);
color:=15;
ChieuTrucGiao_Ve(wic,hesophong);
xoay;
closegraph;
END.

103

Chng 6. M hnh wireframe Nguyn Hu Ti

III. Bi tp cui chng


Hng dn nng cao: Sinh vin cn nng cp chng trnh trn bng vic xy
dng cc m-un sau:
+ Xy dng chng trnh con cho php c thng tin m t i tng trong
mt file text vi cu trc dng:
- Dng u tin: cha tn ca i tng
- Dng th 2: cha 2 s nguyn l s nh v s cnh ca i tng
- Dng th 3 tr i mi dng cha 3 s thc ln lt l 3 thnh phn
to x,y,z ca nh
- Tip theo l cc dng cha to nh l cc dng cha thng tin
m t v cc cnh, mi dng gm 2 s nguyn l th t ca hai nh to nn
cnh.
V d thng tin m t chic gh trn s c m t trong file text nh sau:
Hinh cai ghe tua
12 10
1
1
-1
1
-1
-1
1
-1
1
1
-1
1
-1
-1
1
-1
1
-1
-1
-1
1
-1
-1
-1
1
5
2
6
3
12
4
11
5
6
6
7
7
8
8
5
9
10
11
12

-3
-3
-3
-3
0
0
0
0
2
2
3
3

+ Xy dng chng trnh con cho php thc hin chiu phi cnh ri nh x
ln mn hnh thay th cho chng trnh con ChieuTrucGiao_Ve dng php chiu
trc giao. y chng ta dng cng thc chiu phi cnh tm ra trong chng
cc php bin i hnh hc mc Quan st vt th 3D & Quay h quan st, l
cng thc:
x= x.D/z

y= y.D/z

+ Nng cp chng trnh ngi s dng c th dng cc phm S v P


chuyn t php chiu trc giao sang php chiu phi cnh v ngc li.

104

Chng VII: M hnh cc mt a gic & Vn


kh mt khut

I. Cc khi nim chung


I.1. Cu trc vt th bng m hnh "cc mt a gic"
Mt vt th 3D c th biu din trong my tnh bng nhiu m hnh khc
nhau, song hai m hnh ph bin nht l m hnh khung dy (WireFrame) v
m hnh cc mt a gic ( Polygon mesh model)
M hnh WireFrame: trnh by chng trc, n cho ta hnh dng ca vt
th di dng mt b khung
M hnh cc mt a gic: y mt vt th 3D c xc nh thng qua cc
mt (thay v cc cnh nh trong m hnh WireFrame), v mi mt mt li c
xc nh thng qua cc im m cc im ny c xem nh l cc nh ca
mt a gic, vi m hnh cc mt a gic th chng ta khng ch to ra c
hnh dng ca vt th nh m hnh Wireframe m cn th hin c cc c
tnh v mu sc v nhiu tnh cht khc ca vt th. Song c th m t vt
th 3D mt cch trung thc (nh trong th gii thc) th i hi ngi lp trnh
phi tnh ton v gi lp nhiu thng tin, m mu cht l vn kh mt khut
v chiu sng.Trong chng ny chng ta s tp trung nghin cu vn kh
mt khut.
V d: M t vt th nh trong hnh v sau:

105

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

Mt 1

1
Mt 5
3

Mt 4

Mt 3
5
4
Mt 2
6

- Danh sch cc nh: 1,2,3,4,5,6 (nh vi m hnh Wireframe)


- Danh sch cc mt c xc nh theo bng sau:
Mt
nh
1
1,2,3
4,5,6
2
3
1,3,6,4
3,2,5,6
4
1,2,5,4
5

(a) Mt con Cp vi cc mt a gic cha t mu. (b) T mu a gic theo mu

106

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

Mt nhn vt game theo m hnh cc mt a gic cng vi php nh x b mt vt


liu ln cc a gic.
Chng ta c th a ra nhiu cu trc d liu khc nhau lu tr cho a gic.
Di y l pht tho mt kiu cu trc:
Point3D=record
x,y,z:real;
end;
Vector3D=record
x,y,z:real;
end;
RGBColor=record

{im 3 chiu}
{Vector 3 chiu. Mc d n ging vi
Point3D song ta vn khai cc thut
ton c tng minh}
{Cu trc mu sc ca mt mt}
107

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

B,G,R:Byte;
end;
KieuMat=record
PhapVT:Vector3D;
Sodinh:cardinal;
List:array of integer;
Color:RGBColor;

{Php vector ca mt}


{S nh ca mt}
{Danh sch th t cc nh to nn mt.
y ta dng mng ng}
{mu sc ca mt}

end;
Obj3D=record
{i tng 3 chiu}
ObjName:string;
{Tn ca i tng}
Sodinh:cardinal;
{S nh}
Dinh: array of point3d; {Danh sch nh. y ta dng kiu
mng ng}
SoMat:cardinal;
{S mt}
Mat:array of KieuMat; {Danh sch mt}
Xworld,Yworld,Zworld,Zoom:Real; {To v kch thc tht
ca vt trong h to th gii}
end;
Khi ci t cho mt ng dung c th vic s dng mng c nh c th gy
ra cc tr ngi v kch thc ti a hay ti thiu, cng nh vic s dng b nh
khng ti u. V th ngoi cch dng mng c nh, ta c th dng mng ng
trong mt s ngn ng nh Visual Basic, Delphi hay Visual C++, hoc dng
cu trc danh sch mc ni. Song song vi iu l vic bt i hay a thm cc
thuc tnh cn thit biu din cc c tnh khc ca mt hay ca i tng

* Vn kh mt khut:
Khi th hin vt th 3D mt vn ny sinh l lm sao ch th hin cc mt
c th nhn thy c m khng th hin cc mt khut pha sau. Vic mt mt b
khut hay khng b khut th tu thuc vo cu trc cc mt ca vt th v v tr
ca im nhn cng nh bi cnh m vt th c t vo.

II. Cc phng php kh mt khut


II.1. Gii thut ngi th sn v sp xp theo chiu su (Depth-Sorting)
Ngi th sn (hay Depth-sorting) l tn ca mt thut gii n gin nht
trong s cc thut ton v nh thc 3 chiu. Nu ngi th sn lm vic,
chng ta s thy anh ta sn bc tranh t trong ra ngoi, vi cc cnh vt t xa n
gn. Chng ta c th p dng mt cch tng t v cc a gic trong danh sch
cc a gic. Song c mt vn cn phi chn la, l mt a gic tn ti trong
khng gian 3 chiu c ti 3 bn nh, v nhng nh ny c th c cc gi tr z (
gi tr su ) khc nhau. Chng ta s khng bit chn gi tr no trong s chng.

108

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

T nhng kinh nghim trong thc t, ngi ta cho rng nn s dng gi tr z trung
bnh s cho kt qu tt trong hu ht cc trng hp.
Nh vy, chng ta cn phi sp xp cc mt theo th t t xa n gn, ri
sau v cc mt t xa trc, ri v cc mt gn sau, nh th th cc mt gn
s khng b che khut bi cc mt xa, m ch c cc mt xa mi c th b cc
mt gn che khut, do cc mt gn v sau nn c th c v chng ln hnh
nh ca cc mt xa.
Nh vy, thut gii Depth-Sorting c thc hin mt cch d dng khi
chng ta xc nh mt gi tr su (l gi tr z trong h to quan st) i din
cho c mt. Cc mt da vo su i din ca mnh so snh ri sp xp theo
mt danh sch gim dn (theo su i din). Bc tip theo l v cc mt ln
mt phng theo th t trong danh sch.
Gii thut cn mt s vng mc sau:
Khi hai mt l ct nhau th thut gii ny ch th hin nh chng chng ln
nhau.

Hnh nh tht

Khi v bng gii thut trn


(Hnh II.1)

Khi hai mt l trong cng mt khong khng gian v su v hnh chiu


ca chng ln mt phng chiu l chng ln nhau (hay chng mt phn ln
nhau). V d:
Mt nhn

Mt B
Mt A

(Hnh II.2)

T nhng v d trn chng ta c th thy rng, c nhng trng hp cc a


gic c sp xp sai dn n kt qu hin th khng ng. Liu chng ta c th

109

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

khc phc c vn ny khng? Cu tr li d nhin l c nhng cng c


ngha l chng ta s phi x l thm rt nhiu cc trng hp v lm tng phc
tp tnh ton.
Php kim tra phn ko di Z
Php kim tra ny nhm xc nh phn ko di z ca hai a gic c gi
ln nhau hay khng? Nu cc phn ko di Z l gi ln nhau rt c th
cc a gic ny cn c hon i. V th php kim tra tip theo phi
c thc hin.
Php kim tra phn ko di X
Php kim tra ny tng t nh php kim tra trc, nhng n s kim
tra phn ko di X ca hai a gic c gi ln nhau hay khng? Nu c,
th rt c th cc a gic ny cn c hon i. V th php kim tra
tip theo phi c thc hin.
Php kim tra phn ko di Y
Php kim tra ny kim tra phn ko di Y ca hai a gic c gi ln
nhau hay khng? Nu c, th rt c th cc a gic ny cn c hon
i. V th php kim tra tip theo phi c thc hin.
Php kim tra cnh xa
Gi s A v B l hai a gic m sau khi sp xp theo su trung bnh
th A ng trc B. Song qua 3 php kim tra trn m vn khng xc
nh c liu trt t trn l ng hay cha. Lc ny chng phi tin
hnh php kim tra cnh xa. Php kim tra cnh xa nhm xc nh xem
a gic B c nm pha sau cnh xa ca a gic A hay khng? Nu c th
trt t ny l ng, ngc li th phi qua bc kim tra tip theo.
kim tra a gic B c nm sau cnh xa ca a gic A hay khng,
chng ta thc hin vic kim tra mi nh ca a gic B. Nu cc nh
ny u nm v cng mt pha ca a gic A theo chiu trc Z hay
khng, nu ng th kt qu trt t trn l ng. Ngc li, c th xy ra
mt trong hai tnh hung nh hnh (II.1) v (II.2), xc nh c ta
phi tip tc sang bc kim tra tip theo.
Php kim tra cnh gn
Php kim tra cnh gn nhm xc nh xem a gic A c nm pha sau
cnh gn ca a gic B hay khng? Nu c th trt t xc nh trc y
khng ng, chng ta cn phi hon i li trt t. Ngc li th r rng
hai a gic ang ct nhau (nh hnh II.1) hoc cho vo nhau, lc ny
chng ta phi tin hnh chia nh hai a gic A v B thnh 3 (hoc 4) a
gic con, ng chia ct chnh l ng giao ct ca 2 a gic. Sau php
chia chng ta tin hnh sp xp li cc a gic con.

Hnh nh 2 mt a gic cho vo nhau

110

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

II.2. Thut ton chn lc mt sau


S rt n gin nu ta dng Vector php tuyn kh cc mt khut ca
mt i tng 3D c v li. Ta s tnh gc gia vc t hng nhn V v php
vector N ca mt, nu gc ny l ln hn 90o th mt l khng nhn thy (b khut),
ngc li th mt l kh kin.
Du ca tch v hng ca 2 vector l dng nu gc gia chng nh hn
hay bng 90o. Vy thut ton xt mt mt b khut hay khng ch n gin l:

If V.N >= 0 then


Mt quan st thy
Else
Mt khng quan st thy (mt khut)
Mt nhn

Vector hng nhn


(c ly ngc vi hng
nhn ca ngi quan st)
V <90o nn mt quan st c

111

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

II.2.1 Ci t minh ho cho thut ton chn lc mt sau


Function Tich_vo_huong(v,n:Vector3D):real;
{Tnh tch v hngca 2 vector}
Begin
Tich_vo_huong:=v.x*n.x+v.y*n.y+v.z*n.z;
End;
Procedure DrawObj_FilterRearFace(Obj:Obj3D; Canvas:TCanvas;
Width,Height:integer; Zoom:real; V:Vector3D);
{V i tng theo thut ton chn lc mt sau.
Trong :
+ Obj: cha i tng 3D cn v
+ Canvas: Vi v (hay vng m khung)
+ Width, Height: Kch thc ca Canvas
+ Zooom: H s t l khi v i tng (Hay h s thu phng)
+ V: Vector hng nhn. Nu Obj c chuyn sang h to quan st
OUVN th V=(0,0,-1)}
Var i,k,P,cx,cy:integer;
Poly:array of TPoint;
begin
cx:=Width div 2;cy:=Height div 2;
{Duyt qua tt c cc mt ca i tng}
For k:=0 to Obj.SoMat-1 do
if Tich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0 then
{Mt kh kin}
begin
setlength(Poly,Obj.Mat[K].Sodinh);
{Thit lp di ca mng Poly
bng s nh ca a gic}
For i:=0 to Obj.Mat[K].Sodinh -1 do
{a to cc nh ca a gic vo Poly}
begin
P:=Obj.Mat[K].list[i];
Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx;
Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy;
end;
{Thit lp mu cho bt t trc khi t}
canvas.Brush.Color
:=rgb(Obj.Mat[K].Color.R,Obj.Mat[K].Color.G,Obj.Mat[K].Color.G);
Canvas.Polygon(poly);
{T a gic vi mu c thit lp}
end;
setlength(poly,0);
end;
112

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

R rng, thut ton rt n gin v phc tp tnh ton khng cao. Song
khi s dng phi lun m bo rng i tng c t tnh l c v li, nu i
tng khng tho mn iu kin th chng ta phi p dng mt thot ton khc
hay c nhng sa i cn thit trnh s th hin sai lc.
Hng dn thm:

1. Tch hu hng ca 2 vector 2. Quy tc bn tay phi

3. p dng

Thng thng vector php tuyn c t ng tnh ton da vo danh sch cc


nh ca mt a gic. V th khi lu tr danh sch cc nh ca a gic ngi ta
thng thng nht theo mt chiu v thng thng l theo chiu dng (ngc
chiu kim ng h) khi ta nhn tr pha ngoi vo mt a gic.
r r
Cng thc tnh tch 2 vector b c = a nh sau:

II.3. Thut ton vng m su (Z-Buffer)


Bng cch tnh gi tr su (l gi tri Z trong h to quan st) ca mi
im trong tt c cc mt a gic, ti mi im trn mt phng chiu c th c nh
ca nhiu im trn nhiu mt a gic khc nhau, song hnh v ch c th hin
hnh nh ca im c su thp nht ( tc l im gn nht). Vi cch thc
hin ny gii thut c th kh c tt c cc trng hp m cc gii thut khc
mc phi.
Gii hn ca phng php ny l i hi nhiu b nh v thc hin nhiu
tnh ton. Z_Buffer l mt b m dng lu su cho mi pixel trn hnh nh
ca vt th, thng thng ta t chc n l mt ma trn hnh ch nht. Nu dng 1
byte biu din su ca mt pixel, th mt vt th c hnh nh trn mt phng
chiu l 100x100 s cn 10000 byte dng lm Depth Buffer, v khi vng
m su s cho php ta phn bit c 256 mc su khc nhau, iu ny c
ngha l nu c 257 pixel 257 su khc nhau th khi but ta phi quy 2
pixel no v cng mt su. Nu ta dng 4 byte biu din su ca mt
pixel, th khi vng m su s cho php ta phn bit c 4294967296 (232)
113

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

mc su khc nhau, song lc s phi cn 40000 byte cho mt b m kch


thc 100x100. Do tnh cht 2 mt ny nn tu vo tnh hung v yu cu m ta c
th tng hay gim s byte lu gi su ca 1 pixel. V thng thng ngi ta
dng 4 byte lu gi su ca mt im, khi th chnh xc rt cao.
Mt cu hi c th t ra l lm sao c th tnh su ca mi im trong
a gic. y c 2 phng php: phng php trc tip v phng php gin tip.
Phng php trc tip: s tnh su ca mi im da vo phng trnh
mt phng cha a gic. Vi phng php ny chng ta cn duyt qua tt
cc im ca a gic (tt nhin ch hu hn im), bng cch cho cc thnh
phn x v y, nu cp gi tr (x,y) tho trong min gii hn ca a gic th
chng ta s tm thnh phn th 3 l z bng cch thay th x v y vo phng
trnh mt phng tnh ra thnh phn z. V mt ton hc th phng php
trc tip r rng l rt khoa hc, song khi p dng ta s gp phi mt s
vng mc l:
Cn phi tnh bao nhiu im hnh nh th hin ca a gic ln mt
phng chiu mn v cng khng b tnh trng qu mn (tc l v rt nhiu
im chng cht ln nhau khng cn thit m li gy ra tnh trng chm
chp v tng phc tp tnh ton. Cng nn nh rng khi th hin mt a
gic ln mt phng chiu th nh ca n c th c phng to hay thu nh).
Phng php gin tip: Chng ta s tnh su ca mt im gin tip
thng qua su ca cc im ln cn. thc hin chng ta tin hnh
theo cc bc sau:
Gi G l mt mt a gic c biu din bi tp cc im P1, P2, Pn v
G l hnh chiu ca G xung mt phng chiu vi tp cc nh P1,P2,
Pn.
th hin hnh nh ca G ln mt phng chiu th r rng l chng ta phi
tin hnh t a gic G. Song nh thut ton pht biu, chng ta cn xc
nh xem mi im M bt k thuc G l nh ca im M no trn G v
da vo su ca M so snh vi su c trong z-buffer quyt
nh l c v im M hay khng. Nu ta gn thm cho cc im nh mt
thnh phn na, l gi tr su ca im to nh (tc l im to ra
im nh sau php chiu) th lc ny ta khng cn thit phi xc nh M
tnh su, m ta c th tnh c gi tr su ny qua cng thc sau:
Nu M nm trn on thng PQ vi t l l: PM/PQ=t
V bit c su ca P v Q ln lt l z(P) v z(Q) th su m
im nh M nhn c l
z(M)=z(P)+(z(Q)-z(P))t
(II.3.1)
Ta c th s dng c cng thc trn vi tt c cc php
chiu c bo ton ng thng. T ta c th xc nh quy trnh v a
gic G l nh ca G nh sau:
+ Gn thm cho mi im nh ca a gic G mt thnh phn z c gi tr
bng su ca im to nh. C ngha l P1 s cha thm gi tr z(P1), P2
114

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

s cha thm gi tr z(P2), hay mt cch tng qut Pi s cha thm gi tr


z(Pi) vi i=1..n.
Tin hnh t a gic G theo mt quy trnh tng t nh thut ton
t a gic theo dng qut. l ta cho mt dng qut chy ngang qua a
gic t nh n y a gic, ti mi v tr bt k ca dng qut, chng ta
tin hnh tm tp cc giao im ca dng qut vi a gic. Gi {xm} l tp
cc giao im, mt iu cn ch l ta cn tnh su cho cc giao im
ny. Gi s xi l giao im ca ng qut vi cnh PiPj th th ta c th
tnh ra su ca xi thng qua cng thc (II.3.1) nh sau:
Nu gi yscan l gi tr tung ca dng qut th th:
z(xi) = z(Pi)+[z(Pj)-z(Pi)]*[(yscan y(Pi))/(y(Pj)-y(Pi))] (II.3.2)
{trong y(P) l thnh phn to y ca im P}
R rng qua cng thc trn ta thy, nu xi l trung im ca PiPj th z(xi)
= z(Pi)+z(Pj)*1/2
II.3.a.

Ci t minh ho cho thut ton vng m su


T nhng phn tnh trn chng ta c th tin hnh khai bo cc cu trc d
liu cn thit v ci t cho thut ton.
Khai bo cc cu trc d liu cn thit:
Sau y l cc khai bo cn thit cho php lu tr mt i tng 3D theo
m hnh cc mt a gic, cng cc khai bo cn thit tin hnh kh mt
khut theo thut ton z-Buffer theo ngn ng Pascal trong mi trng ca
trnh bin dch Delphi
{Bt u phn khai bo phc v cho gii thut Z-buffer}
Z_BufferType=Array of Array of cardinal; {Kiu b m Z, y l mt
mng ng 2 chiu m mi phn t c kiu cardinal, iu c ngha l
vng m su s cho php ta phn bit c 4294967296 (232) mc su
khc nhau}
NutPoly_Z=record
{Cu trc ca mt nh ca a gic
chiu G }
x,y:Integer;
{To ca nh trn mt phng
chiu}
z:real;
{Thnh phn su i km (l su
ca to nh)}
end;
Polygon_Z =array of NutPoly_Z; {a gic chiu l mt mng ng.
Nh mt a gic 2 chiu, song
mi mt nh c cha thm thnh
phn su ca nh}
{Cu trc ca cc cnh a gic c xy
CanhCat_Z=record
dng nhm phc v cho qu trnh tnh
giao im}

115

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

y1,y2:Integer;
cnh (y1<=y2)}
xGiao:real;

xStep:real;
zGiao:real;

zStep:real;

{Tung bt u v kt thc ca mt
{honh xut pht ca cnh. Song
trong qu trnh tnh ton n s l tung
giao im ca cnh vi ng qut
ngang}
{Gi tr thay i ca x khi y thay i 1
n v, n cho bit dc ca cnh}
{Gi tr su ti im xut pht ca
cnh. Song trong qu trnh tnh ton n
s l gi tr su ca giao im vi
ng qut ngang}
{Gi tr su ca giao im tip theo
so vi gi tr su ca giao im trc
s chnh lch nhau mt khong l
zStep}

end;
DanhSachCanhCat_Z=array of CanhCat_Z;
{Danh sch cc
cnh c to ra t a gic chiu G, danh sch ny nhm ph v cho qu
trnh tnh ton cc giao im vi ng qut cng nh su ca mi giao
im}
GiaoDiem_Z=record {Lu to giao im v su tng ng vi
giao im }
x,y:Integer;
{To giao im}
z:real;
{Gi tr su}
ChiSoCanh:integer;
{Ch s cnh ct to ra giao im (Nhm
mc ch kh cc giao im tha)}
end;
DanhsachGiaoDiem_Z=array of GiaoDiem_Z;
{Kt thc phn khai bo phc v cho gii thut Z-buffer}
DrawObj(Obj:Obj3D;
Zmin,ZMax:Real;
Procedure
Z_Buffer:Z_BufferType;
Canvas:TCanvas;
Width,Height:integer;
Zoom:real);
{u vo: + i tng 3D cha trong Obj
+ Gii hn su trong khng gian m chng trnh x l l
t Zmin n Zmax. Ta s thc hin nh x cc gi tr su tnh c ca
cc im trn a gic sang khng gian 0..4294967294. Bit rng su
Zmin ng vi 0 v Zmax ng vi 4294967294. ( su 4294967295 lm gi
tr mc nh cho cc im nn
+ Z_Buffer: l ma trn cha su cc im nh ca cc i
tng th hin trn Canvas (xem nh l mt phng chiu). Nu ta cha
v i tng no trc th Z_Buffer c khi ng l 4294967295
Canvas: Tm vi v. Chng ta s thc hin v hnh nh ca
i tng ln Canvas.
Width,Height: L chiu rng v cao ca Canvas

116

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

+ Zoom: t l th hin i tng ln Canvas sau khi thc hin


php chiu, ta c th hiu nm na l t l thu phng.
}
Var i,k,P,cx,cy:integer;
Poly:Polygon_Z;
CuongDoSang:Real;
Color:Tcolor;
begin
cx:=Width div 2;cy:=Height div 2;
For k:=0 to Obj.SoMat-1 do
{Duyt qua tt c cc mt a gic}
begin
setlength(Poly,Obj.Mat[K].Sodinh);
{Thit lp s phn t ca
Poly bng s nh ca mt
m n sp cha}
{Duyt qua tt c cc nh
For i:=0 to Obj.Mat[K].Sodinh -1 do
ca mt v thit lp gi tr
cho mi nh ca Poly}
begin
P:=Obj.Mat[K].list[i]; {nh th i trong a gic K s l nh th
P trong danh sch nh ca Obj}
{Dng php chiu trc giao chiu im Obj.dinh[P] xung
OXY

nh
l
mt
phng
ta
c
ta
(Obj.dinh[P].y,Obj.dinh[P].x), ri sau phng theo t l l
Zoom v tnh tin theo vector (cx,cy) nhm gip a hnh nh ra
vng gia Canvas}
Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx; }
Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy;
Poly[i].Z:=((Obj.dinh[P].z-ZMin)/(ZMax-Zmin)*4294967294);
//MaxCardinal=429496729
5
{Gi tr su ca nh Poly[i] l gi tr Obj.dinh[P].z song
c nh x vo khng gian nguyn 0..4294967294}
end;
Color:=RGB(Obj.Mat[K].Color.R,Obj.Mat[K].Color.G,Obj.Mat[K].Color.
B);
FillPolygon3D(Poly,Color,Z_Buffer,CanVas);
end;
setlength(poly,0);
end;

117

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

Procedure
FillPolygon3D(Poly:Polygon_Z;Color:TColor;Z_Buffer:Z_BufferType;Can
vas:TCanvas);
{Th tc t mu mt a gic theo thut ton Z_Buffer}
var L,H,ND,NG,i,j,Y,MaxY,MinY:integer;
D:DanhSachCanhCat_Z;
G:DanhsachGiaoDiem_Z;
Z_BufferW,Z_BufferH:Integer;
{L,H:Gii hn ch s ca mng Poly
D:Danh sch cc cnh c to ra t Poly, cha nhng thng tin cn thit
tnh giao im v su ca giao im mt cch nhanh chng
ND: S phn t ca mng D
G: Cha danh sch cc giao im c c sau mi ln dng qut thay i
NG:s phn t ca mng G}
Procedure TaoDanhSachCanhCat;
{Th tc ny to ra danh sch D, l danh sch cc cnh ca a gic t
thng tin u vo Poly}
Var i,d1,d2,Dem,Dy,Cuoi:integer;
begin
{Xc nh s cnh ca a gic}
If (Poly[L].x<>Poly[H].x)or(Poly[L].y<>Poly[H].y) then
begin
ND:=H-L+1;
setlength(D,ND);
Cuoi:=H;
end
else
begin
ND:=H-L;
setlength(D,ND);
Cuoi:=H-1;
end;
Dem:=0;
{To ra cc cnh}
For i:=L to Cuoi do
begin
If i<H then j:=i+1 else j:=L;
{Xc nh im u v im cui ca cnh, im u l im c gi
tr y nh}
If Poly[i].y<=Poly[j].y then
begin d1:=i;d2:=j end
else
begin d1:=j;d2:=i end;
D[dem].y1:=Poly[d1].y;D[dem].y2:=Poly[d2].y; {Lu tr tung
xut pht v kt thc}

118

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

D[dem].xGiao:=Poly[d1].x;
D[dem].zGiao:=Poly[d1].z;
im u ca cnh}

{Tung xut pht. Khi u th


(D[dem].y1,D[dem].xGiao) chnh
l to ca im u ca cnh}
{ su ca giao im ti im

{ chnh lch tung ca im


Dy:=(Poly[d2].y-Poly[d1].y);
u v im cui}
If Dy<>0 then
begin
D[dem].xStep:=(Poly[d2].x-Poly[d1].x)/Dy;
D[dem].zStep:=(Poly[d2].z-Poly[d1].z)/Dy;
{T chnh lch Dy ta suy ra gia trng ca x v su z khi
gi tr y tng 1 n v. Nu khi dng qut i qua im u th to giao
im l (D[dem].y1,D[dem].xGiao) vi su l D[dem].zGiao, nu sau
dng qut tng 1 n v th r rng to giao im s l
(D[dem].y1+1,D[dem].xGiao+D[dem].xStep) v su s l
(D[dem].zGiao+D[dem].zStep)}
end
else
begin
D[dem].xStep:=0;
D[dem].zStep:=0;
end;
Dem:=Dem+1;
end;
end;
Procedure TaoDanhSachGiaoDiem;
{To danh sch cc giao im vi ng qut c tung y hin thi}
Var i:integer;
begin
Setlength(G,ND);
NG:=0;
{Duyt qua tt c cc cnh}
for i:=0 to ND -1 do
begin
{C giao im vi
If (D[i].y1<=y)and(y<=D[i].y2) then
ng qut y}
Begin
{Lu li to giao im v su}
G[NG].x:=round(D[i].xGiao);
G[NG].y:=y;
G[NG].z:=D[i].zGiao;
{Ch s cnh to ra giao im.
G[NG].ChiSoCanh:=i;
Nhm phc v cho qu trnh lc
b cc giao im khng cn thit}
119

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

{Lu li Tung v su ca giao im vi ng qut tip


theo (y+1) vo chnh D[i].xGiao v D[i].zGiao}
D[i].xGiao:=D[i].xGiao+D[i].xStep;
D[i].zGiao:=D[i].zGiao+D[i].zStep;
NG:=NG+1;
end;
end;
end;
Procedure SapXepVaLoc;
{Sp xp li cc giao im v lc b cc giao im tha}
Var i,j,C1,C2:integer;
Tg:GiaoDiem_Z;
Begin
{Sp xp li cc giao im}
for i:=0 to NG-2 do
For j:=i+1 to NG-1 do
If G[i].x>G[j].x then
begin
Tg:=G[i];G[i]:=G[j];G[j]:=Tg;
end;
i:=0;
{Kh nhng Giao im tha}
While i<(NG-2) do
begin
If G[i].x=G[i+1].x then {2 giao im trng nhau}
begin C1:=G[i].ChiSoCanh;C2:=G[i+1].ChiSoCanh;
{C1 v C2 l hai cnh to nn 2 giao im trng nhau
ang xt}
If ((D[C1].y1<>D[C2].y1)and(D[C1].y2<>D[C2].y2))or
(D[C1].y1=D[C1].y2)or(D[C2].y1=D[C2].y2) then
{Xo bt mt giao im nu nh: 2 cnh to nn 2 giao im
ny nm v hai pha ca ng qut hoc c mt cnh l nm
ngang}
begin
For j:=i to NG-2 do G[j]:=G[j+1];
NG:=NG-1;
end;
end;
i:=i+1;
end;
end;
Procedure ToMauCacDoan;
{Thc hin t mu cc on thng l phn giao ca ng qut vi a
gic. l cc on x1x2, x3x4,}
Var i,x,K:integer;Dz:real;

120

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

Z:Cardinal;
begin
i:=0;
While i<NG-1 do
begin
K:=G[i+1].x - G[i].x;
If k<>0 then
Dz:=(G[i+1].z-G[i].z)/K
else
Dz:=0;
For x:=G[i].x to G[i+1].x do
{Vi mi on ta thc hin tnh su ca tng im ri so snh vi
gi tr c trong Z_Buffer}
begin
If (0<=x)and(x<=Z_BufferW)and(0<=y)and(y<=Z_BufferH)
then
begin
z:=round(G[i].z);
If Z_Buffer[x,G[i].y]>Z then {So snh su ca im
tnh c vi su c }
{Nu su ca im tnh c nh hn su c
trong Z_Buffer th r rng l im tnh c gn hn
im v trc trong vng m Z v Canvas}
begin
Canvas.Pixels[x,G[i].y]:=Color;
{V
im ln Canvas}
Z_Buffer[x,G[i].y]:=Z;
{Cp nht
su ca im
va v vo
vng m Z}
end;
end;
G[i].z:=G[i].z+Dz; {Gn gi tr su ca im tip theo
vo trong G[i].z}
end;
i:=i+2;
end;
end;
{Th tc chnh}
begin
{Xc nh gii hn trn v gii hn di
L:=low(Poly); H:=High(Poly);
ca Poly}
{Xc nh cc chiu ca ma trn
Z_BufferW:=high(Z_Buffer);
Z_Buffer}
rng
(t
Z_BufferH:=high(Z_Buffer[0]); {Z_BufferW+1:Chiu
0..Z_BufferW)

121

Chng 7: M hnh cc mt a gic & vn kh mt khut


- Nguyn Hu Ti

Z_BufferH+1:Chiu
cao
(t
0..Z_BufferH)}
{ Tm gi tr y ln nht v nh nht ca a gic Poly t cho dng
qut thc hin qut t trn min n max}
MaxY:=Poly[L].y;MinY:=MaxY;
For i:=L+1 to H do
if MaxY<Poly[i].y then
MaxY:=Poly[i].y
else
If MinY>Poly[i].y then
MinY:=Poly[i].y;
TaoDanhSachCanhCat;

{To danh sch cc cnh ca a gic Poly vi


cc tham s thit lp nhm gip cho vic tnh
ton giao im c d dng}

For y:=MinY to MaxY do {Cho dng qut chy t MinY n MaxY }


begin
TaoDanhSachGiaoDiem;
{Tm danh sch cc giao im ca
ng qut y vi cc cnh ca Poly}
SapXepVaLoc;
{Sp xp li cc giao im v lc b cc
giao im tha}
ToMauCacDoan;
{Da vo cc giao im xc nh ra
cc on nm trong a gic, t t mu tng im trn on da vo
su so snh vi gi tr su tng ng trn Z_Buffer}
end;
Setlength(D,0);
{Gii phng mng D}
Setlength(G,0);
{Gii phng mng G}
end;

III. Bi tp cui chng


1. Ci t cho thut gii Depth-Sorting
Ci t chng trnh cho php biu din v quan st vt 3D th theo m
hnh "cc mt a gic" trong s dng thut gii Depth-Sorting kh cc mt
khut
2. Ci t cho thut gii chn lc mt sau
Ci t chng trnh cho php biu din v quan st vt 3D th theo m
hnh "cc mt a gic" trong s dng thut gii chn lc mt sau kh cc
mt khut. Vi i tng l cc hnh lp phng, t din, bt din, cu,
3. Ci t cho thut gii vng m su
Ci t chng trnh cho php biu din v quan st vt 3D th theo m
hnh "cc mt a gic" trong s dng thut gii chn lc mt sau kh cc
mt khut. Vi i tng l cc mt ct nhau, cc hnh li lm bt k.

122

Chng VIII: Cc m hnh chiu sng

I. Khi nim
Khi biu din cc i tng 3 chiu, mt yu t khng th b qua tng
tnh thc ca i tng l to bng sng cho vt th. thc hin c iu
ny, chng ta cn phi ln lt tm hiu cc dng ngun sng c trong t nhin,
cng nh cc tnh cht c trng khc nhau ca mi loi ngun sng. T a ra
cc gii php k thut khc nhau nhm th hin s tc ng ca cc ngun sng
khc nhau ln i tng.

II. Ngun sng xung quanh


nh sng xung quanh l mc sng trung bnh, tn ti trong mt vng khng
gian. Mt khng gian l tng l khng gian m ti mi vt u c cung cp
mt lng nh sng ln b mt l nh nhau, t mi pha mi ni. Thng thng
nh sng xung quanh c xc nh vi mt mc c th gi l mc sng xung
quanh ca vng khng gian m vt th c ng, sau ta cng vi cng
sng c c t cc ngun sng khc c c cng sng cui cng ln mt
im hay mt mt ca vt th.

III. Ngun sng nh hng


Ngun sng nh hng ging nh nhng g m mt tri cung cp cho
chng ta. N bao gm mt tp cc tia sng song song, bt k cng ca chng
c ging nhau hay khng. C hai loi kt qu ca nh sng nh hng khi chng
chiu n b mt l: khuych tn v phn chiu. Nu b mt phn x ton b
(ging nh mt gng) th cc tia phn x s c hng ngc vi hng ca gc
ti (Hnh III.1). Trong trng hp ngc li, nu b mt l khng phn x ton
phn (c nhm, x x) th mt phn cc tia sng s b to i cc hng khc hay
b hp th, phn cn li th phn x li, v lng nh sng phn x li ny t l vi
gc ti. y chng ta s quan tm n hin tng phn x khng ton phn v
y l hin tng ph bin (v ch c nhng i tng c cu to t nhng mt

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

nh mt gng mi xy ra hin tng phn x ton phn), v ng thi tm cch


tnh cng ca nh sng phn x trn b mt.
Vector php tuyn ca mt

nh sng phn x

nh sng ti

nh sng phn

nh sng ti

Hnh III.1 S phn x ca nh sng trn cc b mt


Vector php tuyn ca mt

Vector php tuyn ca mt


nh sng phn

nh sng ti
nh sng phn x

(a)

nh sng ti

(b)

Hnh III.2 S phn x khng ton phn ca nh sng


Trong hnh III.2 th hin s phn x nh sng khng ton phn. m nt ca
cc tia nh sng ti th hin cng sng cao, mnh ca cc tia phn x th
hin cng sng thp. Ni chung, khi b mt l khng phn x ton phn th
cng ca nh sng phn x (hay tm gi l tia phn x) lun b hn so vi
cng ca nh sng ti (hay gi l tia ti), v cng ca tia phn x cn t
l vi gc gia tia ti vi vector php tuyn ca b mt, nu gc ny cng nh th
cng phn x cng cao (hnh III.2 (a)), nu gc ny ln th cng phn x
rt thp (hnh III.2 (b)). y ta s ch quan tm n thnh phn nh sng khuych
tn v tm b qua hin tng phn x ton phn. cho tin trong vic tnh ton
ta tm i hng ca tia ti thc s, vy by gi hng ca tia ti c xem l
hng ngc li ca tia sng ti.
Nu gi l gc gia tia ti vi vector php tuyn ca b mt th Cos() ph thuc
vo tia ti a v vector php tuyn ca mt n theo cng thc:

rr
a.n
Cos( ) = r r
a .n

(III.1)
124

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

Trong cng thc trn Cos() bng tch v hng ca a v n chia cho tch
ln ca chng. Nu ta chun ho ln ca cc vector a v n v 1 t trc th
ta c th tnh gi tr trn mt cch nhanh chng nh sau:
Cos() = tch v hng ca a v n = a.x*n.x+a.y*n.y+a.z*n.z
V gc ti c gi tr giao ng trong khong t 0 n 90o nn Cos() c gi tr t
0 n 1. Vy ta c th s dng hm Cos() nh l hm phn nh mi quan h ca
cng nh sng ti (nh sng nh hng) v nh sng phn x li, nh sau:
Cng nh sng phn x = cng ca nh sng nh hng * Cos() (III.2)
. Vy qua cng thc (III.1) v (III.3) chng ta c th tnh c cng ca nh
sng phn x trn b mt khi bit c cng ca nh sng nh hng cng
nh cc vector php tuyn ca mt v tia ti.

III.1. Ci t thut ton


Di y l phn trnh by cc th tc phc v cho vic v i tng 3D
c li, theo thut ton chn lc mt sau c tnh n vn chiu sng ca ngun
sng xung quanh v ngun sng nh hng.
Function Cuong_Do_Anh_Sang_Dinh_Huong(v,n:Vector3D):real;
{Th tc tnh cng nh sng phn x trn b mt ca a gic khi bit c tia
ti v v vector php tuyn n}
var s,t:real;
begin
s:=sqrt(v.x*v.x+v.y*v.y+v.z*v.z)*sqrt(n.x*n.x+n.y*n.y+n.z*n.z);
{Gn S bng tch ca |v|*|n|}
if s=0 then {Mt trong hai vector bng 0 do tm xem cng sng bng 1}
begin Cuong_Do_Anh_Sang_Dinh_Huong:=1;end
else
Begin t:=tich_vo_huong(v,n); {Tnh tch v hng ca v v n}
If t>0 then {Nu gc gia v v n nm trong khong t 0 n 90 th}
Cuong_Do_Anh_Sang_Dinh_Huong:=(T/s)
else
Cuong_Do_Anh_Sang_Dinh_Huong:=0;
end;
end;
Procedure
DrawObj_FilterRearFace(Obj:Obj3D;
Canvas:TCanvas;
Width,Height:integer; Zoom:real;
AnhSangNen,AnhSangDinhHuong:real;
VectorChieuSang:vector3D; V:Vector3D);
{V i tng 3D c li theo thut ton chn lc mt sau c tnh n vn
chiu sng ca ngun sng xung quanh v ngun sng nh hng.
Trong :
+ Obj: cha i tng 3D cn v
+ Canvas: Vi v (hay vng m khung)
+ Width, Height: Kch thc ca Canvas
+ Zooom: H s t l khi v i tng (Hay h s thu phng)
125

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

+ V: Vector hng nhn. Nu Obj c chuyn sang h to quan st


OXYZ th V=(0,0,-1)
+ AnhSangNen: Gi tr cng ca nh sng xung quanh m i tng
c th thu nhn c
+ AnhSangDinhHuong: Gi tr cng ca nh sng nh hng m i
tng c th thu nhn c
*Ch : AnhSangNen + AnhSangDinhHuong <=1. y ta xem tng
cng ca cc ngun sng to ra gii hn trong khong 0..1. T chng ta
c th iu chnh cng chiu sng ca ccngun sng bng cch tng h s
cng ca n song vn phi lun lun tho mn tng ca chng nh hn hay
bng 1. Khi mt mt nhn c tng cng sng l 1 t cc ngun sng khc
nhau cung cp th mt s cho mu thc ca n. Nu tng cng sng m n thu
c t cc ngun sng nh hn 1 mt s hi ti i.
+ VectorChieuSang: y l vector biu din tia ti (ch n c hng
ngc vi hng ca nh sng chiu ti nh ni trong phn l thuyt
}
Var i,k,P,cx,cy:integer;
Poly:array of TPoint;
CuongDoSang:Real;
R,G,B:byte;
begin
cx:=Width div 2;cy:=Height div 2;
For k:=0 to Obj.SoMat-1 do
if Tich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0 then {Nu mt l kh kin
(khng b khut) th}
begin
{Thit lp a gic l hnh chiu ca mt xung mt phng OXY (c tnh
tin v i hng trc Y)}
setlength(Poly,Obj.Mat[K].Sodinh);
For i:=0 to Obj.Mat[K].Sodinh -1 do
begin
P:=Obj.Mat[K].list[i];
Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx;
Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy;
{To ca nh sau khi chiu l (Obj.dinh[P].x,Obj.dinh[P].y), song
c bin i t l vi h s l zoom ri i hng trc Y v tnh tin
theo vector (cx,cy)}
end;
{Tnh cng sng m mt nhn c: bng tng cng sng do
ngun sng xung quanh (nh sng nn) v ngun sng nh hng cung
cp}
126

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

CuongDoSang:=AnhSangNen + AnhSangDinhHuong *
Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang,Obj.Mat[K].PhapV
T);
{ y cng sng m mt nhn c do ngun sng nh hng cung
cp ph thuc khng ch vo cng sng m ngun pht ra, m cn ph
thuc vo hng n nh sng ca mt v c biu din bi biu thc:
AnhSangDinhHuon*Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang
,Obj.Mat[K].PhapVT)}
R:=round(Obj.Mat[K].Color.R*CuongDoSang);
G:=round(Obj.Mat[K].Color.G*CuongDoSang);
B:=round(Obj.Mat[K].Color.B*CuongDoSang);
{Thit lp mu sc cho mt bng cch: ly cng mu sc mt nh ca
mt Obj.Mat[K].Color, nhn vi cng sng m n nhn c trong
thc t tnh ton c CuongDoSang. T ta thy, nu mt nhn c
y nh sng (cng sng =1) th mt s c mu mt nh ca n
(xc nh khi thit k i tng), ngc li th mt s c mu sc ti hn.
Nu mt khng c chiu sng t cc ngun sng (cng sng =0) th
mt s c mu en}
canvas.Brush.Color :=rgb(R,G,B);
Canvas.Pen.Color:=canvas.Brush.Color;
Canvas.Polygon(poly);
{v a gic vi mu sc c xc nh trc bi bt t (Brush.Color) v
bt v (Pen.Color)}
end;
setlength(poly,0);
end;

IV. Ngun sng im


Ngun sng nh hng l tng ng vi ngun sng im t v tn.
Nhng khi ngun sng im c mang n gn i tng th cc tia sng t n
pht ra khng cn song song na m c ta ra theo mi hng theo dng hnh
cu. V th, cc tia sng s ri xung cc im trn b mt di cc gc khc nhau.
Gi s vector php tuyn ca mt l n=(xn, yn, zn), im ang xt c to l (x0,
y0, z0) v ngun sng im c ta l (plx, ply, plz) th nh sng s ri n im
ang st theo vector (x0-plx, y0-ply, z0-plz), hay tia ti:
a = (plx - x0, ply - y0,plz - z0).
V t cng sng ti im ang xt s ph thuc vo Cos() gia n v a nh
trnh by trong phn ngun sng nh hng.
Vy vi ngun sng nh hng, chng ta cn tnh tia ti cho mi im trn
mt, t kt hp vi vector php tuyn ca mt tnh c cng sng ti
im , nu tnh ton trc tip th c th mt kh nhiu thi gian do phi tnh
vector a v tnh Cos() thng qua cng thc (II.1) vi tt c cc im trn mt.
127

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

Nn nh rng trong tnh hng ngun sng im th chng ta buc lng phi tnh
Cos() thng qua cng thc (II.1) v vector a s thay i khi mt hay ngun sng
thay i (tr khi mt tnh, song nu mt tnh v ngun sng c nh th suy ra
chng ta ch cn tnh cng sng mt ln).

V. M hnh bng Gouraud


M hnh bng Gouraud l mt phng php v bng, to cho i tng 3D
c hnh dng cong c mt ci nhn c tnh thc hn. Phng php ny t c s
trn thc t sau: i vi cc i tng 3D c b mt cong th ngi ta thng xp
s b mt cong ca i tng bng nhiu mt a gic phng, v d nh mt mt cu
c th sp s bi mt tp cc mt a gic phng c kch thc nh sp xp li, khi
s a gic xp x tng ln (c ngha l din tch mt a gic nh li) th tnh thc
ca mt cu s tng, s cho ta cm gic mt cu trng trn tra hn, mn v cong
hn. Tuy nhin, khi s a gic xp s mt mt cong tng th khi lng tnh ton
v lu tr cng tng theo t l thun theo s mt, iu dn n tc thc hin
s tr nn chm chp hn. Chng ta hy th vi mt v d sau: m phng mt
mt cu ngi ta sp s n bi 200 mt th cho ta mt cm gic hi g gh, nhng
vi 450 mt th ta thy n mn v trn tra hn, song khi s mt l 16200 th cho ta
cm gic hnh cu rt trn v mn (hnh III.1). Tuy hnh nh mt cu vi 16200
mt a gic th mn hn so vi 200 mt, song lng tnh ton phi thc hin trn
mi a gic cng tng ln gp 16200/200= 81 ln.

Hnh V: (200 mt)

(450 mt)

(16200 mt)
128

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

Song vn vn cn ny sinh mt khi ta phng ln hay thu nh vt th.


Nu ta phng ln th r rng l cc a gic cng c phng ln theo cng t l,
dn n hnh nh v cc mt a gic li hin r v gy ra cm gic g gh khng
trn mn. Ngc li, khi ta thu nh th nu s a gic xp x ln th s dn n tnh
trng cc a gic qu nh, chng cht ln nhau khng cn thit.
gii quyt vn trn, chng ta c th tin hnh theo phng php t
bng Gouraud. M hnh bng Gouraud to cho i tng mt ci nhn ging nh
l n c nhiu mt a gic bng cch v mi mt khng ch vi mt cng sng
m v vi nhiu cng sng khc nhau trn cc vng khc nhau, lm cho mt
phng nom nh b cong. Bi thc cht ta cm nhn c cong ca cc mt cong
do hiu ng nh sng khi chiu ln mt, ti cc im trn mt cong s c php
vector khc nhau nn s n nhn v phn x nh sng khc nhau, t chng ta
s cm nhn c cc sng khc nhau trn cng mt mt cong.

Hnh III.2: (T bng thng)

(T bng theo Gouraud)

Thng th mi mt a gic c mt vector php tuyn, v nh phn trn


trnh by, vector php tuyn c dng tnh cng ca nh sng phn x
trn b mt ca a gic t suy ra cng sng ca mt. Tuy nhin m hnh
Gouraud li xem mt a gic khng ch c mt vector php tuyn, m mi nh
ca mt a gic li c mt vector php tuyn khc nhau, v t vector php tuyn
ca cc nh chng ta s ni suy ra c vector php tuyn ca tng im trn mt
a gic, t da vo vector m tnh c cng sng ca im. Nh th,
cc im trn cng mt mt ca a gic phng s c cng sng khc nhau, do
php vector ni suy c khc nhau nn tnh ra sng khc nhau, v cho ta cm
gic mt a gic khng phi l mt phng m l mt cong.

129

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

(Vector php tuyn ca cc im trn mt mt cong)


Thc cht th mi mt a gic ch c mt vector php tuyn, song phng
php Gouraud tnh ton vector trung bnh ti mi nh ca a gic bng cch: ly
trung bnh cng cc vector php tuyn ca cc a gic c cha nh ang xt.

Vector trung bnh cng bng trung


bnh cng ca cc vector php
tuyn ln cn

Vic ni suy vector php tuyn ca tng im trn mt a gic c thc


hin tng t nh vic ni suy su trong gii thut vng m su c
trnh by trong chng trc.

130

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

Ni suy cc vector php tuyn cho tng im trn mt a gic

Hin nay, trong cc tin ch to m hnh, ngi ta cho php chng ta nhp
v iu chnh hng cho cc vector nt ti cc nh ca a gic thay v tnh ni suy
t cc vector php tuyn. Nh hnh minh ha sau:

V.1. Ci t thut ton


Di y l phn trnh by cc th tc phc v cho vic v i tng 3D
c li v cong, theo thut ton chn lc mt sau c tnh n vn chiu sng ca
ngun sng xung quanh v ngun sng nh hng xong mi a gic s c t
bng theo phng php Gouraud.
{Bt u phn khai bo phc v cho gii thut t a gic theo phng php
Gouraud}
Type
NutPolyGourand=record
N:Vector3D;
x,y:Integer;

{1 nh ca a gic chiu (l nh ca mt a
gic xung mt phng OXY}
{Php vector ti 1 nh ca a gic}
{To ca nh}
131

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

end;
PolygonGourand =array of NutPolyGourand;
CanhCat=record
y1,y2:Integer;
xGiao:real;
XStep:real;
NGiao:Vector3D;
NStep:Vector3D;

{mng ng dng cha


cc nh ca a gic
chiu}
{Mt cnh ca a gic c to ra nhm phc
v cho qu trnh tnh giao im nhanh}

{Php vector ti nh, song n s c cha


php vector tai giao im vi ng qut}
{ bin thin ca Php vector khi di chuyn
dc theo cnh, mi ln y thay i 1 n v th
php vector thay i mt lng l NStep}

end;
DanhSachCanhCat=array of CanhCat;
GiaoDiem=record
{Cu trc cha giao im ca ng qut
ngang vi cnh a gic chiu }
x,y:Integer;
{To giao im}
NGiao:Vector3D;
{Php vector ti giao im}
ChiSoCanh:integer;
{Ch s cnh to ra giao im}
end;
DanhsachGiaoDiem=array of GiaoDiem;
Procedure
DrawObjGouraud_FilterRearFace(Obj:Obj3D;Canvas:TCanvas;Width,Height:inte
ger;Zoom:real;
AnhSangNen,AnhSangDinhHuong:real;VectorChieuSang:vector3D;V:Vector3D);
{V i tng 3D c li v cong}
Var i,j,k,Dem,P,Q,cx,cy:integer;
Poly:PolygonGourand;
{Cha Danh sch cc mt c lin kt n mt
DinhLinkMat:array of Record
inh}
SoMat:Integer;
A:array of integer;
end;
{S mt c lin kt vi nh th i}
CMLD:array of integer;
begin
cx:=Width div 2;cy:=Height div 2;
Setlength(DinhLinkMat,Obj.Sodinh);
Setlength(CMLD,Obj.Sodinh);
For i:=0 to obj.Sodinh-1 do CMLD[i]:=0;
{Xc nh mi nh c bao nhiu mt lin kt n}
132

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

For i:=0 to obj.SoMat -1 do


For j:=0 to obj.mat[i].Sodinh-1 do
begin
K:=obj.mat[i].List[j];
CMLD[k]:=CMLD[k]+1; {S mt lin kt n nh th k c tng ln
khi c mt mt c lin kt n n }
end;
{Thit lp danh sch cc mt lin kt n tng nh ca i tng}
For i:=0 to obj.Sodinh-1 do
begin
setlength(DinhLinkMat[i].A,CMLD[i]); {S mt lin kt vi nh i l
CMLD[i]}
DinhLinkMat[i].SoMat:=0;
end;
{Qu trnh xc nh r nhng mt no lin kt vi nh i}
For i:=0 to obj.SoMat -1 do
For j:=0 to obj.mat[i].Sodinh-1 do
begin
K:=obj.mat[i].List[j];
Dem:=DinhLinkMat[K].SoMat;
DinhLinkMat[K].A[Dem]:=i;
DinhLinkMat[K].SoMat:=DinhLinkMat[K].SoMat+1;
end;
Setlength(CMLD,0);
For k:=0 to Obj.SoMat-1 do
if Tich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0 then {Nu mt l kh kin}
begin
setlength(Poly,Obj.Mat[K].Sodinh);
For i:=0 to Obj.Mat[K].Sodinh -1 do
begin
{thit lp cc thuc tnh ca nh th i ca Poly (a gic chiu) }
P:=Obj.Mat[K].list[i];
Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx;
Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy;
{Tnh Vector php tuyn ti nh Poly bng cch tnh tng ca cc
vector php tuyn ca cc mt c lin kt vi nh }
Poly[i].N.x :=0;Poly[i].N.y :=0;Poly[i].N.z :=0;
For j:=0 to DinhLinkMat[P].SoMat-1 do
begin
Q:=DinhLinkMat[P].A[j];//Mat ke voi dinh P
Poly[i].N.x :=Poly[i].N.x+obj.Mat[Q].PhapVT.x;
Poly[i].N.y :=Poly[i].N.y+obj.Mat[Q].PhapVT.y;
Poly[i].N.z :=Poly[i].N.z+obj.Mat[Q].PhapVT.z;
end;
end;
FillPolygonGourand(poly,VectorChieuSang,AnhSangNen,AnhSangDinhHuong,C
anVas,Obj.Mat[K].Color);
133

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

{T a gic Poly theo thut ton t a gic theo dng qut, song c ni suy vector
php tuyn cho mi im, v tnh cng sng ca mi im trong a gic da
vo vector php tuyn ti im .}
end;
setlength(poly,0);
For i:=0 to obj.Sodinh-1 do
setlength(DinhLinkMat[i].A,0);
Setlength(DinhLinkMat,0);
end;
Procedure
FillPolygonGourand(Poly:PolygonGourand;Vector_Chieu_Sang:Vector3D;
Anh_Sang_Nen,Anh_Sang_Chieu:real;Canvas:TCanvas;Color:RGBColor);
{T a gic Poly theo thut ton t a gic theo dng qut, song c ni suy vector
php tuyn cho mi im, v tnh cng sng ca mi im trong a gic da
vo vector php tuyn ti im .
Th tc ny tng t nh th tc t a gic theo thut ton Z-Buffer song thay v
ni suy su z ca mi im, th th tc ny s ni suy php vector ca mi
im, ri da vo php vector ca im m tnh ra cng sng m n c
c do ngun sng nh hng cung cp.}
var L,H,ND,NG,i,j,Y,MaxY,MinY:integer;
{L,H:Gioi han chi so cua mang Poly
ND: So phan tu cua mang D:DanhSachCanhCat
NG:So phan tu cua mang G:DanhsachGiaoDiem}
D:DanhSachCanhCat;
G:DanhsachGiaoDiem;
Procedure TaoDanhSachCanhCat;
Var i,d1,d2,Dem,Kc,Cuoi:integer;
begin
If (Poly[L].x<>Poly[H].x)or(Poly[L].y<>Poly[H].y) then
begin
ND:=H-L+1;
setlength(D,ND);
Cuoi:=H;
end
else
begin
ND:=H-L;
setlength(D,ND);
Cuoi:=H-1;
end;
Dem:=0;
For i:=L to Cuoi do
134

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

begin
If i<H then j:=i+1 else j:=L;
If Poly[i].y<=Poly[j].y then
begin d1:=i;d2:=j end
else
begin d1:=j;d2:=i end;
D[dem].y1:=Poly[d1].y;D[dem].y2:=Poly[d2].y;
D[dem].xGiao:=Poly[d1].x;
D[dem].NGiao:=Poly[d1].N;
Kc:=(Poly[d2].y-Poly[d1].y);
If Kc<>0 then
begin
D[dem].XStep:=(Poly[d2].x-Poly[d1].x)/Kc;
D[dem].NStep.x:=(Poly[d2].N.x-Poly[d1].N.x)/Kc;
D[dem].NStep.y:=(Poly[d2].N.y-Poly[d1].N.y)/Kc;
D[dem].NStep.z:=(Poly[d2].N.z-Poly[d1].N.z)/Kc;
end
else
begin
D[dem].XStep:=0;
D[dem].NStep.x:=0;
D[dem].NStep.y:=0;
D[dem].NStep.z:=0;
end;
Dem:=Dem+1;
end;
end;
Procedure TaoDanhSachGiaoDiem;
Var i,Dy:integer;
begin
Setlength(G,ND);
NG:=0;
for i:=0 to ND -1 do
begin
If (D[i].y1<=y)and(y<=D[i].y2) then
begin
Dy:=y-D[i].y1;
G[NG].x:=round(D[i].xGiao+D[i].XStep*Dy);
G[NG].y:=y;
G[NG].NGiao.x:=D[i].NGiao.x+D[i].NStep.x*Dy;
G[NG].NGiao.y:=D[i].NGiao.y+D[i].NStep.y*Dy;
G[NG].NGiao.z:=D[i].NGiao.z+D[i].NStep.z*Dy;
G[NG].ChiSoCanh:=i;
NG:=NG+1;
end;
end;
end;
Procedure SapXepVaLoc;
135

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

Var i,j,C1,C2:integer;
Tg:GiaoDiem;
begin
for i:=0 to NG-2 do
For j:=i+1 to NG-1 do
If G[i].x>G[j].x then
begin
Tg:=G[i];G[i]:=G[j];G[j]:=Tg;
end;
i:=0;
{Khu nhung Giao Diem thua}
While i<(NG-2) do
begin
If G[i].x=G[i+1].x then //Trung nhau
begin C1:=G[i].ChiSoCanh;C2:=G[i+1].ChiSoCanh;
If ((D[C1].y1<>D[C2].y1)and(D[C1].y2<>D[C2].y2))or
(D[C1].y1=D[C1].y2)or(D[C2].y1=D[C2].y2) then
//Xoa bo bot 1 giao diem
begin
For j:=i to NG-2 do G[j]:=G[j+1];
NG:=NG-1;
end;
end;
i:=i+1;
end;
end;
Procedure ToMauCacDoan;
Var i,x,K:integer;CuongDoSang,Dx,Dy,Dz:real;
Re,Gr,Bl,Cd:byte;
begin
If Red then Re:=1 else Re:=0;
If Green then Gr:=1 else Gr:=0;
If Blue then Bl:=1 else Bl:=0;
i:=0;
While i<NG-1 do
begin
K:=G[i+1].x - G[i].x;
If k<>0 then
begin
Dx:=(G[i+1].NGiao.x-G[i].NGiao.x)/K;
Dy:=(G[i+1].NGiao.y-G[i].NGiao.y)/K;
Dz:=(G[i+1].NGiao.z-G[i].NGiao.z)/K;
end
else
begin
Dx:=0;Dy:=0;Dz:=0;
end;
For x:=G[i].x to G[i+1].x do
136

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

begin
CuongDoSang:=Anh_Sang_Nen + Anh_Sang_Chieu*
Cuong_Do_Anh_Sang_Dinh_Huong(Vector_Chieu_Sang,G[i].NGiao);
{Cng sng ti mi im c tnh bng tng ca cng nh
sng nn cng vi cng c c t ngun sng nh hng, song
tnh c cng sng c c t ngun nh hng cung cp th
chng ta da vo tia ti (Vector_Chieu_Sang) v php vector ca im
G[i].Ngiao.}
Cd:=round(255*CuongDoSang);
Canvas.Pixels[x,G[i].y]:=rgb(Cd*Re,Cd*Gr,Cd*Bl);
{Ni suy php vector ca im tip theo v gn vo G[i].NGiao}
G[i].NGiao.x:=G[i].NGiao.x+dx;
G[i].NGiao.y:=G[i].NGiao.y+dy;
G[i].NGiao.z:=G[i].NGiao.z+dz;
end;
i:=i+2;
end;
end;
begin
L:=low(Poly); H:=High(Poly);
MaxY:=Poly[L].y;MinY:=MaxY;
For i:=L+1 to H do
if MaxY<Poly[i].y then
MaxY:=Poly[i].y
else
If MinY>Poly[i].y then
MinY:=Poly[i].y;
TaoDanhSachCanhCat;
For y:=MinY to MaxY do
begin
TaoDanhSachGiaoDiem;
SapXepVaLoc;
ToMauCacDoan;
end;
Setlength(D,0);
Setlength(G,0);
end;

VI. Bi tp cui chng


Bi 1: Xy dng mt chng trnh cho php quan st vt th 3D c li. Chng
trnh cho php thay i v tr quan st, cho php th hin tc ng ca cc ngun
sng xung quanh v nh hng ln i tng.
137

Chng 8. Cc m hnh chiu sng Nguyn Hu Ti

Nng cao: Cho thp thay i cng ca cc ngun sng, cng nh thay
i hng chiu ca ngun sng nh hng.
Bi 2: Hy xy dng chng trnh vi cc chc nng nh Bi 1 song s dng
phng php t bng Gouraud.
Bi 3: Hy tng hp cc kin thc bit xy dng mt chng trnh m phng
th gii thc trong c nhiu i tng khc nhau vn ng.

138

Mc Lc
Chng I: Cc yu t c s ca ho ................................................................1
I. Cc khi nim c bn ...................................................................................................1
I.1. Thit b ho v im nh (Pixel) .................................................................................. 1
I.2. im v on thng trong mt phng............................................................................... 1

II. Cc thut ton v on thng ......................................................................................1


II.1. V on thng da vo phng trnh............................................................................... 2
II.2. V on thng da vo thut ton Bresenham ................................................................. 4

III. Cc thut ton v ng trn...................................................................................11


III.1. Thut ton v ng trn MidPoint.............................................................................. 11
III.2. Thut ton v ng trn Bresenham........................................................................... 15

IV. Thut ton v Ellipse ...............................................................................................18


IV.1. Thut ton Bresenham cho v hnh Ellipse .................................................................. 19

V. Bi tp cui chng ..................................................................................................24

Chng II: Cc h mu & c ch t chc b nh Card mn hnh ..................25


I. i nt v cu trc mn hnh mu..............................................................................25
II. Cc h mu................................................................................................................27
II.1. H RGB.......................................................................................................................... 27
II.2. H mu CMY ................................................................................................................. 28
II.3. H mu HSV .................................................................................................................. 29

III. C ch t chc b nh Card mn hnh ....................................................................34


III.1. C ch hot ng ca ch mn hnh 320x200x256 mu ......................................... 34
III.2. C ch hot ng ca mn hnh theo chun Vesa ........................................................ 48

Chng III: Cc php xn hnh & t mu .........................................................49


I. Trng hp F l mt tp hu hn im......................................................................50
II. Trng hp xn mt on thng vo mt vng hnh ch nht ca R2. ....................50
II.1. Khi c mt cnh ca hnh ch nht song song vi trc to ...................................... 50
II.2. Khi 1 cnh ca hnh ch nht to vi trc honh mt gc : ........................................ 57

III. Clipping mt a gic vo mt vng hnh ch nht..................................................58


III.1. Gii thut Sutherland Hodgman ................................................................................ 58

IV. Mt s thut ton t mu .........................................................................................59


IV.1. Gii thut vt du loang................................................................................................ 59
IV.2. Thut ton t mu a gic theo dng qut (Scan-line Algorithm)................................ 64

V. Bi tp cui chng ..................................................................................................67

Chng IV: Cc php bin i hnh hc ............................................................68


I. Cc php bin i Affine 2D (2- chiu) .....................................................................68
I.1. Php tnh tin................................................................................................................... 68
I.2. Php ng dng ............................................................................................................... 69
I.3. Php i xng.................................................................................................................. 69
I.4. Php quay quanh gc to ........................................................................................... 70
I.5. Php bin dng (Twist Transformation) .......................................................................... 70
I.6. To thun nht (Homogeneous Coordinates) ............................................................. 70
I.7. Tng hp cc php bin i Affine ................................................................................. 70
I.8. Php quay quanh im bt k.......................................................................................... 72
I.9. Cc v d minh ha.......................................................................................................... 72
I.10. Bin i h trc ta (hay bin i ngc) ................................................................ 74

I.11. Ci t............................................................................................................................ 76

II. Cc php bin i Affine 3D ....................................................................................76


II.1. Cc h trc ta ........................................................................................................... 76
II.2. Cc cng thc bin i................................................................................................... 77

III. Cc php chiu vt th trong khng gian ln mt phng .........................................78


III.1. Php chiu phi cnh (Perspective) .............................................................................. 78
III.2. Php chiu song song.................................................................................................... 80

IV. Quan st vt th 3D & Quay h quan st.................................................................80


IV.1. Php chiu phi cnh.................................................................................................... 84
IV.2. Php chiu song song ................................................................................................... 85
IV.3. Ci t........................................................................................................................... 85
IV.4. V d minh ha ............................................................................................................. 85

V. Bi tp cui chng ..................................................................................................85

Chng V: Cc phng php dng ng cong v mt cong .........................86


I. ng cong Bezier & mt cong Bezier. ....................................................................86
I.1. Thut ton De Casteljau: ................................................................................................. 87
I.2. Dng BERNSTEIN ca cc ng cong BEZIER.......................................................... 87
I.3. Dng biu din ma trn ca ng Bezier ...................................................................... 88
I.4. Cc tnh cht ca ng cong BEZIER .......................................................................... 89
I.5. nh gi ng cong Bezier & s khc bit ca ng cong Spline: ............................ 92

II. ng cong Spline v B-Spline: ..............................................................................93

Chng VI: M hnh WireFrame .......................................................................96


I. M hnh Wireframe: ...................................................................................................97
II. V hnh da trn d liu kiu WireFrame vi cc php chiu..................................99
II.1. Php chiu trc giao n gin........................................................................................ 99
II.2. Php chiu phi cnh n gin .................................................................................... 100

III. Bi tp cui chng ...............................................................................................104

Chng VII: M hnh cc mt a gic & Vn kh mt khut .................105


I. Cc khi nim chung ................................................................................................105
I.1. Cu trc vt th bng m hnh "cc mt a gic" ......................................................... 105

II. Cc phng php kh mt khut ............................................................................108


II.1. Gii thut ngi th sn v sp xp theo chiu su (Depth-Sorting) .......................... 108
II.2. Thut ton chn lc mt sau......................................................................................... 111
II.3. Thut ton vng m su (Z-Buffer) ...................................................................... 113

III. Bi tp cui chng ...............................................................................................122

Chng VIII: Cc m hnh chiu sng .............................................................123


I. Khi nim .................................................................................................................123
II. Ngun sng xung quanh..........................................................................................123
III. Ngun sng nh hng.........................................................................................123
III.1. Ci t thut ton ........................................................................................................ 125

IV. Ngun sng im ...................................................................................................127


V. M hnh bng Gouraud...........................................................................................128
V.1. Ci t thut ton ......................................................................................................... 131

VI. Bi tp cui chng...............................................................................................137

Mc Lc 139

You might also like