You are on page 1of 145

MC LC

Chng 1: CC YU T C S CA HA
1.1. Tng quan v ha my tnh............................................................................... 1
1.1.1. Gii thiu v ha my tnh ................................................................................ 1
1.1.2. Cc k thut ha ................................................................................................ 1
1.1.2.1. K thut ha im........................................................................................ 1
1.1.2.2. K thut ha vector...................................................................................... 2
1.1.3. ng dng ca ha my tnh............................................................................... 2
1.1.4. Cc lnh vc ca ha my tnh .......................................................................... 3
1.1.5. Tng quan v mt h ha .................................................................................. 4
1.2. Mn hnh ha...................................................................................................... 6
1.3. Cc khi nim........................................................................................................... 6
1.3.1. im..................................................................................................................... 6
1.3.2. Cc biu din ta ............................................................................................ 8
1.3.3. on thng........................................................................................................... 8
1.4. Cc thut ton v on thng................................................................................. 8
1.4.1. Bi ton................................................................................................................ 8
1.4.2. Thut ton DDA................................................................................................... 9
1.4.3. Thut ton Bresenham....................................................................................... 10
1.4.4. Thut ton MidPoint .......................................................................................... 12
1.5. Thut ton v ng trn..................................................................................... 14
1.5.1. Thut ton Bresenham....................................................................................... 14
1.5.2. Thut ton MidPoint .......................................................................................... 16
1.6. Thut ton v Ellipse............................................................................................. 17
1.6.1. Thut ton Bresenham....................................................................................... 17
1.6.2. Thut ton MidPoint .......................................................................................... 20
1.7. Phng php v th hm s ............................................................................. 21
Bi tp............................................................................................................................ 23

Chng 2: T MU
2.1. Gii thiu cc h mu............................................................................................ 25
2.2. Cc thut ton t mu .......................................................................................... 28
2.2.1. Bi ton.............................................................................................................. 28
2.2.2. Thut ton xc nh P S ................................................................................. 28
2.2.3. Thut ton t mu theo dng qut ..................................................................... 30
2.2.4. Thut ton t mu theo vt du loang................................................................ 30
Bi tp............................................................................................................................ 31

Chng 3: XN HNH
3.1. t vn ............................................................................................................... 32
3.2. Xn on thng vo vng hnh ch nht............................................................. 32
3.2.1. Cnh ca hnh ch nht song song vi cc trc ta ..................................... 32
3.2.1.1. Thut ton Cohen Sutherland ...................................................................... 33
3.2.1.2. Thut ton chia nh phn................................................................................. 34
3.2.1.3. Thut ton Liang Barsky ............................................................................. 35
3.2.2. Khi cnh ca hnh ch nht to vi trc honh mt gc ................................ 36
3.3. Xn on thng vo hnh trn.............................................................................. 37
3.4. Xn ng trn vo hnh ch nht...................................................................... 38
3.5. Xn a gic vo hnh ch nht ............................................................................. 39
Bi tp............................................................................................................................ 40

Chng 4: CC PHP BIN I
4.1. Cc php bin i trong mt phng..................................................................... 41
4.1.1. C s ton hc ................................................................................................... 41
4.1.2. V d minh ha .................................................................................................. 43
4.2. Cc php bin i trong khng gian.................................................................... 45
4.2.1. Cc h trc ta .............................................................................................. 45
4.2.2. Cc cng thc bin i ...................................................................................... 46
4.2.3. Ma trn nghch o ............................................................................................ 48
4.3. Cc php chiu ca vt th trong khng gian ln mt phng ........................... 48
4.3.1. Php chiu phi cnh......................................................................................... 48
4.3.2. Php chiu song song......................................................................................... 50
4.4. Cng thc ca cc php chiu ln mn hnh....................................................... 50
4.5. Ph lc .................................................................................................................... 56
4.6. V d minh ha....................................................................................................... 59
Bi tp............................................................................................................................ 61

Chng 5: BIU DIN CC I TNG BA CHIU
5.1. M hnh WireFrame.............................................................................................. 63
5.2. V m hnh WireFrame vi cc php chiu........................................................ 64
5.3. V cc mt ton hc............................................................................................... 65
Bi tp............................................................................................................................ 68

Chng 6: THIT K NG V MT CONG BEZIER V B-SPLINE
6.1. ng cong Bezier v mt Bezier........................................................................ 69
6.1.1. Thut ton Casteljau .......................................................................................... 70
6.1.2. Dng Bernstein ca ng cong Bezier ............................................................ 70
6.1.3. Dng biu din ma trn ca ng Bezier ........................................................ 71
6.1.4. To v v ng cong Bezier ............................................................................ 72
6.1.5. Cc tnh cht ca ng Bezier ......................................................................... 74
6.1.6. nh gi cc ng cong Bezier ....................................................................... 76
6.2. ng cong Spline v B-Spline ............................................................................ 77
6.2.1. nh ngha.......................................................................................................... 77
6.2.2. Cc tnh cht hu ch trong vic thit k cc ng cong B-Spline ................. 78
6.2.3. Thit k cc mt Bezier v B-Spline ................................................................. 79
6.2.4. Cc bng Bezier ................................................................................................. 80
6.2.5. Dn cc bng Bezier vi nhau ........................................................................... 81
6.2.6. Cc bng B-Spline ............................................................................................. 81

Chng 7: KH NG V MT KHUT
7.1. Cc khi nim......................................................................................................... 83
7.2. Cc phng php kh mt khut ........................................................................ 85
7.2.1. Gii thut sp xp theo chiu su ...................................................................... 85
7.2.2. Gii thut BackFace........................................................................................... 88
7.2.3. Gii thut vng m su ............................................................................... 90
Bi tp.......................................................................................................................... 103

Chng 8: TO BNG VT TH 3D
8.1. Khi nim............................................................................................................. 104
8.2. Ngun sng xung quanh...................................................................................... 104
8.3. Ngun sng nh hng ...................................................................................... 105
8.4. Ngun sng im.................................................................................................. 109
8.5. M hnh bng Gouraud....................................................................................... 110
Bi tp.......................................................................................................................... 121

Ph lc: MT S CHNG TRNH MINH HA
I. Cc thut ton t mu ............................................................................................ 122
II. Cc thut ton xn hnh........................................................................................ 129
III. V cc i tng 3D............................................................................................. 136

Ti liu tham kho...................................................................................................... 143

LI M U



ha l mt trong nhng lnh vc pht trin rt nhanh ca ngnh Cng ngh
thng tin. N c ng dng rng ri trong nhiu lnh vc khoa hc v cng ngh.
Chng hn nh y hc, kin trc, gii tr... ha my tnh gip chng ta thay i
cch cm nhn v s dng my tnh, n tr thnh nhng cng c trc quan quan
trng khng th thiu trong i sng hng ngy. V vy mn ha tr thnh
mt trong nhng mn hc chnh trong cc chuyn ngnh Cng ngh thng tin cc
trng i hc.
Cun sch Gio trnh l thuyt ha c bin son theo st ni dung
chng trnh o to c nhn Cng ngh thng tin. Ni dung ca gio trnh ny
cung cp mt s kin thc c bn v l thuyt v thut ton xy dng cc cng c
ha 2D v 3D. T gip sinh vin c th c lp xy dng nhng th vin
ha cho ring mnh v pht trin cc phn mm ng dng ha cao hn.
Gio trnh c chia lm 8 chng v phn ph lc, sau mi chng u c
phn bi tp kim tra kin thc v rn luyn kh nng lp trnh cho bn c.
thun tin cho vic trnh by thut ton mt cch d hiu, cc gii thut trong gio
trnh c vit trn ngn ng ta Pascal v cc m ngun c ci t trn Turbo
Pascal 7.0. Nhm gip bn c bt lng tng trong qu trnh ci t cc gii thut,
phn ph lc lit k mt s m ngun ci t cc thut ton trong cc chng. Tuy
nhin, bn c nn t ci t cc thut ton phn l thuyt, nu cm thy kh
khn lm mi nn tham kho phn ph lc ny.
Chng 1, 2 v 3 trnh by v cc yu t c s ca ha nh: mn hnh
ha, im, on thng, ng trn, cc h mu v cc thut ton t mu, xn hnh ...
Chng 4 trang b cc kin thc ton hc v cc php bin i trong khng gian 2D
v 3D. Chng 5, 6 v 7 gii thiu cc m hnh ha 3D, cc gii thut kh mt
khut v to bng cho vt th... Chng 8 trnh by v phng php thit k cc
ng cong Bezier v B-Spline.
Mc d rt c gng trong qu trnh bin son nhng chc chn gio trnh
ny vn khng th trnh khi nhng thiu st. Chng ti rt mong nhn c nhng
kin ng gp ca bn c cng nh cc bn ng nghip trong lnh vc ha
gio trnh ngy cng c hon thin hn trong ln ti bn sau. a ch lin lc:
Khoa Cng ngh Thng tin, trng i hc Khoa hc Hu.
in thoi: 054.826767. Email: paphuong@hueuni.edu.vn
nhtai@hueuni.edu.vn


Hu, thng 08 nn 2003
Cc tc gi
Updatesofts.com Ebooks Team
CHNG I
CC YU T C S CA HA

1.1. TNG QUAN V HA MY TNH
ha my tnh l mt lnh vc pht trin nhanh nht trong Tin hc. N c p
dng rng ri trong nhiu lnh vc khc nhau thuc v khoa hc, k ngh, y khoa,
kin trc v gii tr.
Thut ng ha my tnh (Computer Graphics) c xut bi nh khoa hc
ngi M tn l William Fetter vo nm 1960 khi ng ang nghin cu xy dng m
hnh bung li my bay cho hng Boeing.
Cc chng trnh ha ng dng cho php chng ta lm vic vi my tnh mt
cch thoi mi, t nhin.
1.1.1 Gii thiu v ha my tnh
ha my tnh l mt ngnh khoa hc Tin hc chuyn nghin cu v cc
phng php v k thut c th m t v thao tc trn cc i tng ca th gii
thc bng my tnh.
V bn cht: l mt qu trnh xy dng v pht trin cc cng c trn c hai
lnh vc phn cng v phn mm h tr cho cc lp trnh vin thit k cc chng
trnh c kh nng ha cao.
Vi vic m t d liu thng qua cc hnh nh v mu sc a dng ca n, cc
chng trnh ha thng thu ht ngi s dng bi tnh thn thin, d dng,... kch
thch kh nng sng to v nng cao nng sut lm vic.
1.1.2. CC K THUT HA
Da vo cc phng php x l d liu trong h thng, ta phn ra lm hai k thut
ha:
1.1.2.1. K thut ha im
Chng I. Cc yu t c s ca ha


2
Nguyn l ca k thut ny nh sau: cc hnh nh c hin th thng qua tng
pixel (tng mu ri rc). Vi k thut ny, chng ta c th to ra, xa hoc thay i
thuc tnh ca tng pixel ca cc i tng. Cc hnh nh c hin th nh mt li
im ri rc (grid), tng im u c v tr xc nh c hin th vi mt gi tr
nguyn biu th mu sc hoc d sng ca im . Tp hp tt c cc pixel ca grid
to nn hnh nh ca i tng m ta mun biu din.
1.1.2.2. K thut ha vector
Nguyn l ca k thut ny l xy dng m hnh hnh hc (geometrical model) cho
hnh nh i tng, xc nh cc thuc tnh ca m hnh hnh hc, sau da trn m
hnh ny thc hin qu trnh t trt (rendering) hin th tng im ca m hnh,
hnh nh ca i tng.
k thut ny, chng ta ch lu tr m hnh ton hc ca cc thnh phn trong m
hnh hnh hc cng vi cc thuc tnh tng ng m khng cn lu li ton b tt c
cc pixel ca hnh nh i tng.
1.1.3. ng dng ca ha my tnh hin nay
Ngy nay, ha my tnh c s dng rng ri trong nhiu lnh vc khc
nhau nh: Cng nghip, thng mi, qun l, gio dc, gii tr,... Sau y l mt s
ng dng tiu biu:
1.1.3.1. To giao din (User Interfaces): nh cc chng trnh ng dng WINDOWS,
WINWORD, EXCEL ... ang c a s ngi s dng a chung nh tnh thn
thin, d s dng.
1.1.3.2. To ra cc biu dng trong thng mi, khoa hc v k thut: Cc biu
c to ra rt a dng, phong ph bao gm c hai chiu ln ba chiu gp phn
thc y xu hng pht trin cc m hnh d liu h tr c lc cho vic phn tch
thng tin v tr gip ra quyt nh.
1.1.3.3. T ng ha vn phng v ch bn in t: dng nhng ng dng ca
ha in n cc ti liu vi nhiu loi d liu khc nhau nh: vn bn, biu , th
v nhiu loi hnh nh khc ...
1.1.3.4. Thit k vi s tr gip ca my tnh (Computer aided design): Mt trong
nhng li ch ln nht ca my tnh l tr gip con ngi trong vic thit k. Cc ng
Chng I. Cc yu t c s ca ha


3
dng ha cho php chng ta thit k cc thit b c kh, in, in t, t, my bay,
... nh phn mm AUTOCAD ...
1.1.3.5. Lnh vc gii tr, ngh thut: cho php cc ha s to ra cc hnh nh ngay
trn mn hnh ca my tnh. Ngi ha s c th t pha mu, trn mu, thc hin mt
s thao tc: ct, dn, ty, xa, phng to, thu nh ... nh cc phn mm PAINTBRUSH,
CORELDRAW,...
1.1.3.6. Lnh vc bn : xy dng v in n cc bn a l. Mt trong nhng ng
dng hin nay ca ha l h thng thng tin a l (GIS - Geographical Information
System).
1.1.4. Cc lnh vc ca ha my tnh
1.1.4.1. Cc h CAD/CAM (CAD Computer Aided Design, CAM Computer
Aided Manufacture)
Cc h ny xy dng tp hp cc cng c ha tr gip cho vic thit k cc chi
tit v cc h thng khc nhau: cc thit b c kh, in t... Chng hn nh phn mm
Auto Cad ca hng AutoDesk...
1.1.4.2. X l nh (Image Processing)
y l lnh vc x l cc d liu nh trong cuc sng. Sau qu trnh x l nh, d
liu u ra l nh ca i tng. Trong qu trnh x l nh, chng ta s s dng rt
nhiu cc k thut phc tp: khi phc nh, xc nh bin...
V d: phn mm PhotoShop, Corel Draw, ...
1.1.4.3. Khoa hc nhn dng (Pattern Recognition)
Nhn dng l mt lnh vc trong k thut x l nh. T nhng mu nh c sn, ta
phn loi theo cu trc hoc theo cc phng php xc nh no v bng cc thut
ton chn lc c th phn tch hay tng hp nh cho thnh mt tp hp cc nh
gc, cc nh gc ny c lu trong mt th vin v cn c vo th vin ny nhn
dng cc nh khc.
V d: Phn mm nhn dng ch vit (VnDOCR) ca vin Cng ngh Thng tin
H Ni, nhn dng vn tay, nhn dng mt ngi trong khoa hc hnh s...
1.1.4.4. ha minh ha (Presentation Graphics)
Chng I. Cc yu t c s ca ha


4
y l lnh vc ha bao gm cc cng c tr gip cho vic hin th cc s liu
thng k mt cch trc quan thng qua cc mu th hoc biu c sn. Chng hn
nh cc biu (Chart) trong cc phn mm Word, Excel...
1.1.4.5. Hot hnh v ngh thut
Lnh vc ha ny bao gm cc cng c gip cho cc ha s, cc nh thit k
phim nh chuyn nghip thc hin cc cng vic ca mnh thng qua cc k xo v
tranh, hot hnh hoc cc k xo in nh khc...
V d: Phn mm x l cc k xo hot hnh nh: 3D Animation, 3D Studio
Max..., phn mm x l cc k xo in nh: Adobe Primiere, Cool 3D,...
1.1.5. Tng quan v mt h ha (Graphics System)
1.1.5.1. H thng ha
Phn mm ha: L tp hp cc cu lnh ha ca h thng. Cc cu lnh lp
trnh dng cho cc thao tc ha khng c cc ngn ng lp trnh thng dng nh
PASCAL, C, ... h tr. Thng thng, n ch cung cp nh l mt tp cng c thm
vo trong ngn ng. Tp cc cng c ny dng to ra cc thnh phn c s ca mt
hnh nh ha nh: im, on thng, ng trn, mu sc,... Qua , cc nh lp
trnh phi to ra cc chng trnh ha c kh nng ng dng cao hn.
Phn cng ha: L cc thit b in t: CPU, Card, mn hnh, chut, phm...
gip cho vic thc hin v pht trin cc phn mm ha.
1.1.5.2. Cc thnh phn ca mt h thng ha
Tp hp cc cng c ny c phn loi da trn nhng cng vic trong tng hon
cnh c th: xut, nhp, bin i nh, ... bao gm:
Tp cng c to ra nh gc (output primitives): cung cp cc cng c c bn
nht cho vic xy dng cc hnh nh. Cc nh gc bao gm cc chui k t, cc thc
th hnh hc nh im, ng thng, a gic, ng trn,...
Tp cc cng c thay i thuc tnh (attributes): dng thay i thuc tnh ca
cc nh gc. Cc thuc tnh ca nh gc bao gm mu sc (color), kiu ng thng
(line style), kiu vn bn (text style), mu t vng (area filling pattern),...
Chng I. Cc yu t c s ca ha


5
Tp cc cng c thay i h quan st (viewing transformation): Mt khi m cc
nh gc v cc thuc tnh ca n c xc nh trong h ta thc, ta cn phi chiu
phn quan st ca nh sang mt thit b xut c th. Cc cng c ny cho php nh
ngha cc vng quan st trn h ta thc hin th hnh nh .
Tp cc cng c phc v cho cc thao tc nhp d liu (input operations): Cc
ng dng ha c th s dng nhiu loi thit b nhp khc nhau nh bt v, bng,
chut, ... Chnh v vy, cn xy dng thm cc cng c ny iu khin v x l cc
d liu nhp sao cho c hiu qu.
Mt yu cu v phn cng khng th thiu t ra cho cc phn mm ha l:
tnh d mang chuyn (portability), c ngha l chng trnh c th chuyn i mt
cch d dng gia cc kiu phn cng khc nhau. Nu khng c s chun ha, cc
chng trnh thit k thng khng th chuyn i n cc h thng phn cng khc
m khng vit li gn nh ton b chng trnh.
Sau nhng n lc ca cc t chc chun ha quc t, mt chun cho vic pht trin
cc phn mm ha ra i: l GKS (Graphics Kernel System - H ha c
s). H thng ny ban u c thit k nh l mt tp cc cng c ha hai chiu,
sau c pht trin m rng trong ha ba chiu.
Ngoi ra, cn c mt s chun ha ph bin nh:
CGI (Computer Graphics Interface System): h chun cho cc phng php
giao tip vi cc thit b ngoi vi.
OPENGL: th vin ha ca hng Silicon Graphics.
DIRECTX: th vin ha ca hng Microsoft.
1.2. MN HNH HA
Mi my tnh u c mt CARD dng qun l mn hnh, gi l Video Adapter
hay Graphics Adapter. C nhiu loi adapter nh: CGA, MCGA, EGA, VGA,
Hercules... Cc adapter c th lm vic hai ch : vn bn (Text Mode) v ha
(Graphics Mode).
C nhiu cch khi to cc mode ha. Ta c th s dng hm $00 ngt $10
ca BIOS vi cc Mode sau:
Chng I. Cc yu t c s ca ha


6
Mode $12: ch phn gii 640x480x16
Mode $13: ch phn gii 320x200x256
Ta c th vit mt th tc khi to ch ha nh sau:
Procedure InitGraph(Mode:Word);
var Reg:Registers;
Begin
reg.ah := 0;
reg.al := mode;
intr($10,reg);
End;
Cc bn c th tham kho thm cc ti liu v lp trnh h thng.
1.3. CC KHI NIM
1.3.1. im (Pixel)
Trong cc h thng ha, mt im c biu th bi cc ta bng s.
V du: Trong mt phng, mt im l mt cp (x,y)
Trong khng gian ba chiu, mt im l b ba (x,y,z)
Trn mn hnh ca my tnh, mt im l mt v tr trong vng nh mn hnh dng
lu tr cc thng tin v sng ca im tng ng trn mn hnh.
S im v trn mn hnh c gi l phn gii ca mn hnh (320x200,
480x640, 1024x1024,...)
Cch hin th thng tin ln mn hnh ha:
Vng m mn hnh hay cn gi l b nh hin th c bt u t a ch
A000h:$0000h. V vy, hin th thng tin ra mn hnh th ta ch cn a thng tin
vo vng m mn hnh bt u t a ch trn l c.
C nhiu cch v mt im ra mn hnh: c th dng cc phc v ca BIOS hoc
cng c th truy xut trc tip vo vng nh mn hnh.
Nu dng phc v ca BIOS, ta dng hm $0C ngt $10:
Procedure PutPixel(Col,Row:Word; Color:Byte);
Var reg:Registers;
Begin
reg.ah:=$0C;
reg.al:=Color;
Chng I. Cc yu t c s ca ha


7
reg.bh:=0;
reg.cx:=Col;
reg.dx:=Row;
Intr($10,reg);
End;
Nu mun truy xut trc tip vo vng m mn hnh: Gi s mt im (x,y)
c v trn mn hnh vi phn gii 320x200x256 (mode 13h), im s c
nh v trong vng m bt u t a ch segment A000h v a ch offset c tnh
theo cng thc: Offset = y*320 + x.
Ta c th vit th tc nh sau:
Procedure PutPixel(x,y:Word; Color:Byte);
Var Offset:Word;
Begin
Offset:=(y shl 8) + (y shl 6) + x;
Mem[$A000:Offset]:=Color;
End;
1.3.2. Cc biu din ta
Hu ht cc chng trnh ha u dng h ta Decartes (Hnh 1.1).
Ta bin i:
O
Y
X X
Y
O
MaxY
MaxX

Ta th gii thc Ta thit b mn hnh.
Hnh 1.1
1.3.3. on thng
Trong cc h thng ha, cc on thng c biu th bi vic t on thng
bt u t im u mt ny ko di cho n khi gp im u mt kia.
1.4. CC THUT TON V ON THNG
Chng I. Cc yu t c s ca ha


8
1.4.1. Bi ton: V on thng i qua 2 im A(x1,y1) v B(x2,y2)
* Trng hp x1=x2 hoc y1=y2: rt n gin.
* Trng hp ng thng c h s gc m:
tng:
V cc Pixel c v cc v tr nguyn nn ng thng c v ging nh hnh
bc thang (do lm trn).
Vn t ra l chn cc ta nguyn gn vi ng thng nht.
1.4.2. Thut ton DDA (Digital differential analyzer)
Xt ng thng c h s gc 0<m1(gi s im u A nm bn tri v im cui
B nm bn phi). Nu ta chn x=1v tnh gi tr y k tip nh sau:
y
k+1
= y
k
+ y = y
k
+ m.x
= y
k
+ m
Vi h s gc m>1: ta hon i vai tr ca x,y cho nhau. Nu chn y=1 th:
x
k+1
= x
k
+ 1/m
Tng t, nu im B nm bn tri v A nm bn phi th:
y
k+1
= y
k
- m (0<m1, x= -1)
x
k+1
= x
k
- 1/m (m>1, y= -1)
Tm li: Ta c thut ton v ng thng DDA nh sau:
Nhp A(x1,y1) B(x2,y2)
Tnh x = x2 - x1 y = y2 - y1 Step = Max(|x| , |y|)
Khi to cc gi tr:
IncX = x/Step; IncY = y/Step; {bc tng khi v}
x = x1; y = y1; {Chn im v u tin}
V im (x,y);
Cho i chy t 1 n Step:
x = x + IncX; y = y + IncY;
V im (Round(x),Round(y))
T ta c th tc v on thng theo thut ton DDA nh sau:
Procedure DDALine(x1,y1,x2,y2:Integer);
var dx,dy,step,i:integer;
Chng I. Cc yu t c s ca ha


9
xInc,yInc,x,y:real;
Begin
dx:=x2-x1; dy:=y2-y1;
If abs(dx)>abs(dy) Then step:=abs(dx)
else step:=abs(dy);
xInc:=dx/step;
yInc:=dy/step;
x:=x1;
y:=y1;
Putpixel(round(x),round(y),15);
for i:=1 to step do
Begin
x:=x+xInc;
y:=y+yInc;
Putpixel(round(x),round(y),15);
End;
End;
1.4.3. Thut ton Bresenham
Phng trnh ng thng c th pht
biu di dng: y = m.x + b (1)
Phng trnh ng thng qua 2 im:

1 2
1
x x
x x

=
1 2
1
y y
y y

(*)
t x = x2 - x1
y = y2 - y1
(*) y = x.
x
y

+ y1 - x1.
x
y


Suy ra m =
x
y

nn y = m. x (2)
b = y1 - m.x1 (3)
Ta ch xt trng hp h s gc 0<m<1.
Gi s im (xi,yi) c v. Ta phi chn im k tip l:
x
i
x
i
+1
y
i
+
1

y

y
i

Hnh 1.2
Chng I. Cc yu t c s ca ha


10
(x
i
+ 1,y
i
) hoc (x
i
+1,y
i
+1) (Xem hnh 1.2)
Xt khong cch gia 2 im chn vi im nm trn ng thc. Nu khong
cch no b hn th ta ly im .
t:
d
1
= y - y
i
= m.(x
i
+1) + b - y
i

d
2
= (y
i
+1) - y = y
i
+ 1 - m.(x
i
+ 1) - b
Suy ra:
d
1
- d
2
= 2m.(x
i
+ 1) - 2y
i
+ 2b - 1
= 2.
x
y

.(x
i
+ 1) - 2y
i
+ 2b - 1
x(d
1
- d
2
) = 2y.x
i
- 2x.y
i
+ 2y + x.(2b - 1)
t p
i
= x(d
1
- d
2
) v C = 2y + x.(2b - 1)
th p
i
= 2y.x
i
- 2x.y
i
+ C (4)
p
i+1
= 2y.x
i+1
- 2x.y
i+1
+ C
Suy ra:
p
i+1
- p
i
= 2y(x
i+1
- x
i
) - 2x(y
i
- y
i+1
)
= 2y - 2x(y
i+1
- y
i
) (5)
( v x
i+1
- x
i
= 1 )
* Nhn xt:
. Nu p
i
< 0: Chn y
i+1
= y
i
T (5) p
i+1
= p
i
+ 2y. (d
1
<d
2
)
. Nu p
i
0: Chn y
i+1
= y
i
+ 1 T (5) p
i+1
= p
i
+ 2y - 2x. (d
1
>d
2
)
Vi im mt u tin, theo (4) ta c:
p
1
= 2y.x
1
- 2x.y
1
+ 2y + x[2.(y
1
- m.x
1
) - 1] = 2y - x
T , ta c th tm tt thut ton v ng thng theo Bresenham cho trng hp h
s gc 0<m<1 nh sau:
Bc 1: Nhp cc im u mt. im u mt bn tri cha ta (x1,y1), im
u mt bn phi cha ta (x2,y2).
Bc 2: im c chn v u tin l (x1,y1).
Bc 3: Tnh x = |x2 - x1| , y = |y2 - y1| v P
1
= 2y - x
Nu p
i
< 0 th im k tip l (x
i
+ 1,y
i
)
Ngc li: im k tip l (x
i
+ 1,y
i
+ 1)
Chng I. Cc yu t c s ca ha


11
Bc 4: Tip tc tng x ln 1 Pixel. v tr x
i
+1, ta tnh:
p
i+1
= p
i
+ 2y nu p
i
< 0
p
i+1
= p
i
+ 2.( y - x) nu p
i
0
Nu p
i+1
< 0 th ta chn to y k tip l y
i+1

Ngc li th ta chn y
i+1
+1
Bc 5: Lp li bc 4 cho n khi x = x2.
Sau y l th tc ci t thut ton:
Procedure LINE(x1,y1,x2,y2:integer); { 0<m<1}
var dx,dy,x,y,p,c1,c2,xMax:integer;
Begin
dx:=abs(x1-x2);
dy:=abs(y1-y2);
c1:=2*dy;
c2:=2*(dy-dx);
p:=2*dy-dx;
if x1>x2 then
begin
x:=x2; y:=y2; xMax:=x1;
end
else
begin
x:=x1;y:=y1;xMax:=x2;
end;
putpixel(x,y,red);
while x<xMax do
begin
x:=x+1;
if p<0 then p:=p+c1
else begin
y:=y+1;
p:=p+c2;
end;
Chng I. Cc yu t c s ca ha


12
putpixel(x,y,red);
end;
end;
1.4.4. Thut ton MidPoint
Ta ch xt trng hp h s gc 0<m<1.
Thut ton ny a ra cch chn im S(x
i
+1,y
i
) hay P(x
i
+1,y
i
+1) bng cch so
snh im thc Q(x
i
+1,y) vi im M (trung im ca S v P).
Nu im Q nm di im M th chn im S
Ngc li, chn im P. (Xem hnh 1.3)
Ta c dng tng qut ca phng trnh ng thng:
Ax + By + C = 0
vi A = y2 y1 , B = (x2 x1) ,
C = x2.y1 x1.y2
t F(x,y) = Ax + By + C, ta c nhn xt:
< 0 nu (x,y) nm pha trn ng thng
F(x,y) = 0 nu (x,y) thuc v ng thng
> 0 nu (x,y) nm pha di ng thng
Lc ny, vic chn cc im S hay P c a v vic xt du ca:
p
i
= F(M) = F(x
i
+ 1,y
i
+
2
1
)
Nu p
i
< 0 M nm trn on
thng Q nm di M Chn S
Nu p
i
0 M nm di on
thng Q nm trn M Chn P
Mt khc:
p
i
= F(x
i
+ 1,y
i
+
2
1
)
p
i+1
= F(x
i+1
+ 1,y
i+1
+
2
1
)
nn
p
i+1
- p
i
= F(x
i+1
+ 1,y
i+1
+
2
1
) - F(x
i
+ 1,y
i
+
2
1
)
P

Q
M


S


x
i

x
i
+1
y
i
+
1



y
i

Hnh 1.3
Chng I. Cc yu t c s ca ha


13
= A(x
i+1
+1) + B(y
i+1
+
2
1
) + C - A(x
i
+1) - B(y
i
+
2
1
) - C
= A(x
i+1
- x
i
) + B(y
i+1
- y
i
)
= A + B(y
i+1
- y
i
) (v x
i+1
- x
i
=1)
Suy ra:
p
i+1
= p
i
+ A + B(y
i+1
- y
i
) (*)
*Nhn xt:
. Nu p
i
< 0: Chn im S: y
i+1
= y
i
T (*) suy ra p
i+1
= p
i
+ A
. Nu p
i
0: Chn im P: y
i+1
= y
i
+ 1 T (*) suy ra p
i+1
= p
i
+ A + B
Vi im mt u tin, ta c:
p
1
= F(x
1
+ 1,y
1
+
2
1
) = A(x
1
+1) + B(y
1
+
2
1
) + C
= Ax
1
+ Bx
1
+ C + A +
2
B
= A +
2
B
(v Ax
1
+ Bx
1
+ C = 0)
Thut ton MidPoint cho kt qu tng t nh thut ton Bresenham.
1.5. THUT TON V NG TRN
Xt ng trn (C) tm O(x
c
,y
c
) bn knh R.
Phng trnh tng qut ca ng trn c dng:
(x - x
c
)
2
+ (y - y
c
)
2
= R
2
(*)
y = y
c
R x x
C
2 2
( ) (1)
n gin thut ton, u tin ta xt ng
trn c tm gc ta (x
c
=0 v y
c
=0).
* tng:
Do tnh i xng ca ng trn nn nu im
(x,y)(C) th cc im (y,x), (-y,x), (-x,y), (-x,-y), (-y,-x), (y,-x), (x,-y) cng (C) (Hnh 1.4)
V vy, ta ch cn v mt phn tm cung trn ri ly i xng qua gc O v 2 trc to
th ta c c ton b ng trn.
1.5.1. Thut ton Bresenham
Gi s (x
i
,y
i
) v c. Cn chn im k tip l (x
i
+1,y
i
) hoc (x
i
+1,y
i
-1)
(Hnh 1.5)
T phng trnh: x
2
+ y
2
= R
2

ta tnh c gi tr y thc ng vi x
i
+1 l:
(-x,-
y)
(x,y
)
(y,x
)
(-
y,x)
(-
x,y)
(-y,-
x)
(x,-
y)
(
y,-
Hnh
1.4
Chng I. Cc yu t c s ca ha


14
y
2
= R
2
- (x
i
+1)
2

t: d
1
= y
i
2
- y
2
= y
i
2
- R
2
+ (x
i
+ 1)
2

d
2
= y
2
- (y
i
- 1)
2
= R
2
- (x
i
+ 1)
2
- (y
i
- 1)
2

Suy ra:
p
i
= d
1
- d
2
= 2.(x
i
+ 1)
2
+ y
i
2
+ (y
i
- 1)
2
- 2R
2
(2)
p
i+1
= 2.(x
i+1
+ 1)
2
+ y
2
i+1
+ (y
i+1
- 1)
2
- 2R
2
(3)
T (2) v (3) ta c:
p
i+1
- p
i
= 4x
i
+ 6 + 2.(y
2
i+1
- y
i
2
) - 2.(y
i+1
- y
i
)
p
i+1
= p
i
+ 4x
i
+ 6 + 2.(y
2
i+1
- y
i
2
) - 2.(y
i+1
- y
i
)
(4)
* Nhn xt:
Nu p
i
< 0: chn y
i+1
= y
i
(4) p
i+1
= p
i
+ 4x
i
+ 6
Nu p
i
0: chn y
i+1
= y
i
- 1 (4) p
i+1
= p
i
+ 4.(x
i
- y
i
) + 10
Ta chn im u tin cn v (0,R), theo (2) ta c: p1 = 3 - 2R
Tm li: Ta c thut ton v ng trn:
Bc 1: Chn im u cn v (x1,y1) = (0,R)
Bc 2: Tnh P u tin: p1 = 3 - 2R
Nu p < 0: chn im k tip l (x
i
+1,y
i
). Ngc li chn im (x
i
+ 1,y
i
- 1)
Bc 3: x:=x + 1, tnh li p:
Nu p
i
< 0: p
i+1
= p
i
+ 4x
i
+ 6. Ngc li: p
i+1
= p
i
+ 4.(x
i
- y
i
) + 10
Khi :
Nu p
i+1
< 0: chn im k tip l (x
i
+1,y
i+1
). Ngc li chn im (x
i
+1,y
i+1
-1)
Bc 4: Lp li bc 3 cho n khi x = y.
Sau y l th tc ci t thut ton:
Procedure Circle(x0,y0,r:Integer);
Var p,x,y:Integer;
Procedure VeDiem;
Begin
PutPixel( x0 + x , y0 + y , color);
PutPixel( x0 - x , y0 + y , color);
PutPixel( x0 + x , y0 - y , color);
PutPixel( x0 - x , y0 - y , color);
y
i

y
y
i
-
1
x
i

x
i
+1
Hnh
1.5
Chng I. Cc yu t c s ca ha


15
PutPixel( x0 + y , y0 + x , color);
PutPixel( x0 - y , y0 + x , color);
PutPixel( x0 + y , y0 - x , color);
PutPixel( x0 - y , y0 - x , color);
End;
Begin
x:=0; y:=r;
p:=3 - 2*r;
While x<=y do
Begin
VeDiem;
If p<0 then p:=p + 4*x + 6
Else
Begin
p:=p + 4*(x-y) + 10;
y:=y-1;
End;
x:=x+1;
End;
End;
1.5.2. Thut ton MidPoint
T phng trnh ng trn: x
2
+ y
2
= R
2

t F(x,y) = x
2
+ y
2
- R
2
,ta c:
< 0 nu (x,y) trong ng trn
F(x,y) = 0 nu (x,y) trn ng trn
> 0 nu (x,y) ngoing trn
Lc ny, vic chn cc im S(x
i
+1,y
i
) hay
P(x
i
+1,y
i
-1) c a v vic xt du ca:
p
i
= F(M) = F(x
i
+ 1,y
i
-
2
1
) (Hnh 1.6)
Nu p
i
< 0 M nm trong ng trn Q gn S hn Chn S
Nu p
i
0 M nm ngoi ng trn Q gn P hn Chn P
y
i



y
i
-
1
x
i
x
i
+1
S


M
Q
P
Hnh
1.6
Chng I. Cc yu t c s ca ha


16
Mt khc:
p
i
= F(x
i
+ 1,y
i
-
2
1
)
p
i+1
= F(x
i+1
+ 1,y
i+1
-
2
1
)
nn
p
i+1
- p
i
= F(x
i+1
+ 1,y
i+1
-
2
1
) - F(x
i
+ 1,y
i
-
2
1
)
= [(x
i+1
+1)
2
+ (y
i+1
-
2
1
)
2
- R
2
] - [(x
i
+1)
2
+ (y
i
-
2
1
)
2
- R
2
]
= [(x
i
+2)
2
+ (y
i+1
-
2
1
)
2
- R
2
] - [(x
i
+1)
2
+ (y
i
-
2
1
)
2
- R
2
]
= 2x
i
+ 3 + (y
i+1
2
- y
i
2
) - (y
i+1
- y
i
)
Suy ra:
p
i+1
= p
i
+ 2x
i
+ 3 + (y
i+1
2
- y
i
2
) - (y
i+1
- y
i
) (*)
*Nhn xt:
. Nu p
i
< 0: Chn im S : y
i+1
= y
i
T (*) p
i+1
= p
i
+ 2x
i
+ 3
. Nu p
i
0: Chn im P: y
i+1
= y
i
- 1 T (*) p
i+1
= p
i
+ 2(x
i
- y
i
) + 5
Vi im u tin (0,R), ta c:
p
1
= F(x
1
+ 1,y
1
-
2
1
) = F(1,R -
2
1
) = 1 + (R -
2
1
)
2
- R
2
=
4
5
- R
1.6. THUT TON V ELLIPSE
n gin, ta chn Ellipse c tm gc ta
. Phng trnh ca n c dng:

2
2
a
x
+
2
2
b
y
= 1
Ta c th vit li: y
2
= -
2
2
a
b
.x
2
+ b
2
(*)
* tng: Ging nh thut ton v ng trn.
Ch c s khc bit y l ta phi v 2 nhnh: Mt nhnh t trn xung v mt
nhnh t di ln v 2 nhnh ny s gp nhau ti im m h s gc ca tip
tuyn vi Ellipse = -1 (Hnh 1.7).
Phng trnh tip tuyn vi Ellipse ti im (x
0
,y
0
) (E) :
Hnh
1.7
Chng I. Cc yu t c s ca ha


17
x
0
.
2
a
x
+ y
0
.
2
b
y
= 1
Suy ra, h s gc ca tip tuyn ti im l: -
2
0
2
0
.
a y
b x
.
1.6.1. Thut ton Bresenham
y, ta ch xt nhnh v t trn xung.
Gi s im (x
i
,y
i
) c v. im tip theo cn chn s l (x
i
+1,y
i
) hoc
(x
i
+1,y
i
-1)
Thay (x
i
+1) vo (*): y
2
= -
2
2
a
b
.(x
i
+1)
2
+ b
2

t:
d
1
= yi
2
- y
2
= y
i
2
+
2
2
a
b
.(x
i
+1)
2
-b
2

d
2
= y
2
- (y
i
-1)
2
= -
2
2
a
b
.(x
i
+1)
2
+ b
2
- (y
i
-1)
2

p
i
= d
1
- d
2
= 2.[
2
2
a
b
.(x
i
+1)
2
- b
2
] + 2.(y
i
2
+ y
i
) -1
p
i+1
= 2.[
2
2
a
b
.(x
i+1
+1)
2
- b
2
] + 2.(y
i+1
2
+ y
i+1
) -1
Suy ra:
p
i+1
- p
i
= 2.
2
2
a
b
.[(x
i+1
+1)
2
- (x
i
+1)
2
] + 2.( y
i+1
2
- y
i
2
+ y
i+1
- y
i
) (**)
*Nhn xt:
p
i
< 0: Chn y
i+1
= y
i

(**) p
i+1
= p
i
+ 2.
2
2
a
b
.(2x + 3)
p
i
0: Chn y
i+1
= y
i
-1
(**) p
i+1
= p
i
+ 2.
2
2
a
b
.(2x + 3) - 4y
i

Vi im u tin (0,b), ta c:
p
1
= 2
2
2
a
b
- 2b + 1
T , ta c th tc v Ellipse nh sau:
Chng I. Cc yu t c s ca ha


18
Procedure Ellipse(xc,yc,a,b:Integer;Color:Byte);
Var p,a2,b2:real;
x,y:integer;
(*-------------------*)
Procedure VeDiem;
Begin
PutPixel(xc+x,yc+y,Color);
PutPixel(xc-x,yc+y,Color);
PutPixel(xc-x,yc-y,Color);
PutPixel(xc+x,yc-y,Color);
End;
(*-------------------*)
Begin
a2:=a*a;
b2:=b*b;
{Nhanh 1}
x:=0; y:=b;
p:=2*b2/a2 - 2*b + 1;
While (b2/a2)*(x/y)<1 do
Begin
VeDiem;
If p<0 then p:=p + 2*(b2/a2)*(2*x+3)
else Begin
p:=p - 4*y + 2*(b2/a2)*(2*x+3);
y:=y-1;
End;
x:=x+1;
End;
{Nhanh 2}
y:=0; x:=a;
p:=2*(a2/b2) - 2*a + 1;
While (a2/b2)*(y/x)<=1 do
Chng I. Cc yu t c s ca ha


19
Begin
VeDiem;
If p<0 then p:=p + 2*(a2/b2)*(2*y+3)
else Begin
p:=p - 4*x + 2*(a2/b2)*(2*y+3);
x:=x-1;
End;
y:=y+1;
End;
End;
1.6.2. Thut ton MidPoint
Gi :
Phng trnh Ellipse:
2
2
a
x
+
2
2
b
y
= 1
Nhnh 1:
p
1
= b
2
- a
2
b +
4
1
.a
2

If p
i
< 0 Then p
i+1
= p
i
+ b
2
+ 2b
2
x
i+1

else p
i+1
= p
i
+ b
2
+ 2b
2
x
i+1
- 2a
2
y
i+1

Nhnh 2:
p
1
= b
2
(x
i
+
2
1
)
2
+ a
2
(y
i
- 1)
2
- a
2
b
2

If p
i
> 0 Then p
i+1
= p
i
+ a
2
- 2a
2
y
i+1

else p
i+1
= p
i
+ a
2
+ 2b
2
x
i+1
- 2a
2
y
i+1

Procedure MidEllipse(xc,yc,a,b:Integer;Color:Byte);
Var p,a2,b2:real;
x,y:Integer;
(*-------------------*)
Procedure VeDiem;
Begin
PutPixel(xc+x,yc+y,Color);
PutPixel(xc-x,yc+y,Color);
PutPixel(xc-x,yc-y,Color);
Chng I. Cc yu t c s ca ha


20
PutPixel(xc+x,yc-y,Color);
End;
(*-------------------*)
Begin
a2:=a*a;
b2:=b*b;
{Nhanh 1}
x:=0; y:=b;
Vediem;
p:=b2 - a2*b + 0.25*a2;
While (b2/a2)*(x/y)<1 do
Begin
x:=x+1;
If p<0 Then p:=p + b2 + 2*b2*x
else begin
y:=y-1;
p:=p + b2 + 2*b2*x - 2*a2*y;
end;
Vediem;
End;
{Nhanh 2}
p:=b2*(x+0.5)*(x+0.5) + a2*(y-1)*(y-1)- a2*b2 ;
While y>0 do
Begin
y:=y-1;
If p>0 Then p:=p + a2 - 2*a2*y
else begin
x:=x+1;
p:=p + a2 + 2*b2*x - 2*a2*y;
end;
Vediem;
End;
Chng I. Cc yu t c s ca ha


21
End;
1.7. PHNG PHP V TH HM S
1.7.1. Bi ton: V th ca hm s y = f(x) trn on [Min,Max].
* tng: Cho x chy t u n cui ly cc ta (x,f(x)) sau lm trn
thnh s nguyn ri ni cc im li vi nhau.
1.7.2. Gii thut:
Bc 1: Xc nh on cn v [Min,Max].
Bc 2: - t gc ta ln mn hnh (x0,y0).
- Chia t l v trn mn hnh theo h s k.
- Chn bc tng dx ca mi im trn on cn v.
Bc 3: Chn im u cn v: x = Min, tnh f(x)
i qua ta mn hnh v lm trn:
x1:=x0 + Round(x.k);
y1:=y0 - Round(y.k);
Di chuyn n (x1,y1): MOVETO(x1,y1);
Bc 4:
Tng x ln vi s gia dx: x:=x + dx;
i qua ta mn hnh v lm trn:
x2:=x0 + Round(x.k);
y2:=y0 - Round(y.k);
V n (x2,y2): LINETO(x2,y2);
Bc 5: Lp li bc 4 cho n khi x > Max th dng.
V d: V th hm s f(x) = Sin(x)
Uses crt,Graph;
Var dau,cuoi:real;
Gd,Gm:Integer;
Function F(x:real):real;
Begin
F:=Sin(x);
End;
Procedure VeHinhSin(ChukyDau,ChuKyCuoi:real);
Chng I. Cc yu t c s ca ha


22
var x1,y1,x2,y2:integer;
a,x,k:real;
x0,y0:word;
Begin
x0:=GetMaxX div 2;
y0:=GetMaxY div 2;
K:=GetMaxX/30;
a:=Pi/180;
x:=ChuKyDau;
x1:=x0 + Round(x*k);
y1:=y0 - Round(F(x)*k);
Moveto(x1,y1);
While x<ChuKyCuoi do
Begin
x:=x+a;
x2:=x0 + Round(x*k);
y2:=y0 - Round(F(x)*k);
LineTo(x2,y2);
End;
End;
BEGIN
Gd:=0;
InitGraph(Gd,Gm,C:\BP\BGI);
Dau:=-4*Pi; cuoi:=4*Pi;
VeHinhSin(Dau,cuoi);
repeat until KeyPressed;
CloseGraph;
END.
BI TP
1. Cho hai im A(20,10) v B(25,13). Hy tnh cc gi tr Pi, xi, yi mi bc khi v
on thng AB theo thut ton Bresenham/MidPoint v kt qa in vo bng sau:
i 1 2 3 4 5 6
Chng I. Cc yu t c s ca ha


23
Pi

? ? ? ? ? ?
xi ? ? ? ? ? ?
yi

? ? ? ? ? ?
2. Ci t th tc v on thng theo thut ton Bresenham v MidPoint cho cc
trng hp h s gc m>1, m<-1, -1<m<0.
3. Vit th tc LineTo(x,y:Integer); v on thng t v tr hin thi n im c
ta (x,y).
4. Vit th tc LineRel(dx,dy:Integer); v on thng t v tr hin thi n im
mi cch im hin thi mt khong theo trc x l dx v theo trc y l dy.
5. Ci t th tc v ng trn theo thut ton MidPoint.
6. Vit th tc Arc(x0,y0,g1,g2:Integer; R:Word); v cung trn c tm (x0,y0)
bn knh R vi gc bt u l g1 v gc kt thc l g2.
7. Vit th tc Sector(x0,y0,g1,g2:Integer; Rx,Ry:Word); v cung Ellipse c tm
(x0,y0) bn knh theo trc X l Rx, bn knh theo trc Y l Ry vi gc bt u l g1
v gc kt thc l g2.
8. Vit th tc DrawPoly(P:Array; n:Byte; xc,yc,R:Word); v mt a gic u
c n nh lu trong mng P ni tip trong ng trn tm (xc,yc) bn knh R.
9. Vit th tc Circle3P(A,B,C:ToaDo2D); v ng trn i qua 3 im A,B,C.
10. Vit th tc Arc3P(A,B,C:ToaDo2D); v cung trn i qua 3 im A,B,C.
11. V th cc hm s sau:
y = ax
2
+ bx + c, y = ax
3
+ bx
2
+ cx + d, y = ax
4
+ bx
3
+ cx
2
+ dx + e
y =
d cx
b ax
+
+
, y =
e dx
c bx ax
+
+ +
2
.
12. V cc ng cong sau:
y
2
= 2px
2
2
a
x
+
2
2
b
y
= 1
2
2
a
x
-
2
2
b
y
= 1
Bi tp ln: Vit chng trnh kho st v v th cc hm s s cp bi tp s 11.
CHNG 2
T MU

2.1. GII THIU V CC H MU
Gic quan ca con ngi cm nhn c cc vt th xung quanh thng qua cc tia
sng mu tt hn rt nhiu so vi 2 mu trng en. V vy, vic xy dng nn cc
chun mu l mt trong nhng l thuyt c bn ca l thuyt ha.
Vic nghin cu v mu sc ngoi cc yu t v mt vt l nh bc sng, cng
, cn c 3 yu t khc lin quan n cm nhn sinh l ca mt ngi di tc ng
ca chm sng mu i n t vt th l: Hue (sc mu), Saturation ( bo ha),
Lightness ( sng). Mt trong nhng h mu c s dng rng ri u tin do
A.H.Munsell a ra vo nm 1976, bao gm 3 yu t: Hue, Lightness v Saturation.
Ba m hnh mu c s dng v pht trin nhiu trong cc phn cng l: RGB -
dng vi cc mn hnh CRT (Cathode ray bube), YIQ dng trong cc h thng ti vi
mu bng tn rng v CMY - s dng trong mt s thit b in mu.
Ngoi ra, cn c nhiu h mu khc nh: HSV, HSL, YIQ, HVC, ...
2.1.1.H RGB (Red, Green, Blue)
Mt ca chng ta cm nhn ba mu r nht l Red (), Green (lc), Blue (xanh).
V vy, ngi ta xy dng m hnh mu RGB (Red,Green, Blue) l tp tt c cc
mu c xc nh thng qua ba mu va nu. Chun ny u tin c xy dng cho
cc h v tuyn truyn hnh v trong cc my vi tnh. Tt nhin, khng phi l tt c
cc mu u c th biu din qua ba mu ni trn nhng hu ht cc mu u c th
chuyn v c.
H ny c xem nh mt khi ba chiu vi mu Red l trc X, mu Green l trc
Y v mu Blue l trc Z. Mi mu trong h ny c xc nh theo ba thnh phn
RGB (Hnh 2.1).

Chng II. T mu

26
Y
Z
X
Black
White
Blue Cyan
Yellow
Green
Red
Magenta

Hnh 2.1. H mu RGB
V d:
Mu Red l (1, 0, 0)
Mu Blue l (0, 0, 1)
Red + Green = Yellow
Red + Green + Blue = White
2.1.2. H CMY (Cyan, Magenta, Yellow)
H ny cng c xem nh mt khi ba chiu nh h RGB. Nhng h CMY tri
ngc vi h RGB, chng hn:
White c thnh phn (0, 0, 0)
Cyan c thnh phn (1, 0, 0)
Green c thnh phn (1, 0, 1) ...
Sau y l cng thc chuyn i t h RGB CMY :

B
G
R
Y
M
C
1
1
1

2.1.3. H YIQ
H mu ny c ng dng trong truyn hnh mu bng tn rng ti M, do n
c mi quan h cht ch vi mn hnh raster. YIQ l s thay i ca RGB cho kh
nng truyn pht v tnh tng thch vi ti vi en trng th h trc. Tn hiu truyn s
dng trong h thng NTSC (National Television System Committee).
Sau y l cng thc bin i t h RGB thnh h YIQ:
Chng II. T mu

27

B
G
R
Q
I
Y
*
311 . 0 523 . 0 212 . 0
321 . 0 275 . 0 596 . 0
114 . 0 587 . 0 299 . 0

Ma trn nghch o ca ma trn bin i RGB thnh h YIQ c s dng cho php
bin i t h YIQ thnh RGB.
2.1.4. H HSV (Hue, Saturation, Value)
M hnh mu ny cn c gi l h HSB vi B l Brightness ( sng) da trn c
s nn tng trc gic v tng mu, sc v sc thi m thut (Hnh 2.2).
Hue c gi tr t 0
0
360
0

S, V c gi tr t 0 1
Black
V
Cyan
0.0
Blue
1.0
Green
Red
H
White
S
Yellow
White

Hnh 2.2. H mu HSV
V d:
Red c biu din (0
0
, 1, 1)
Green c biu din (120
0
,1,1)
2.1.5. H HSL (Hue, Saturation, Lightness)
H ny c xc nh bi tp hp hnh chp su cnh i ca khng gian hnh tr
(hnh 2.3).
H
S
1.0 L
0.0
0.5
White
Red
Yellow Green
Cyan
Blue
Black
White

Hnh 2.3. H mu HSL
Chng II. T mu

28
2.2. CC THUT TON T MU
2.2.1. Bi ton
Cho a gic S xc nh bi n nh : P
1
, P
2
,
..., P
n
. Hy t mu min S.
* Phng php tng qut :
- Tm hnh ch nht W nh nht cha S
(hnh 2.4).
- Duyt qua tt c cc im P(x, y) W.
Nu P S th t mu im P.
2.2.2. Thut ton xc nh P S
2.2.2.1. S l a gic li
- Ly P W, ni P vi cc nh ca S th ta c n tam gic : S
i
= PP
i
P
i+1
, vi
P
n+1
=P
1.

- Nu
=
n
1
i
) dt(S
i
= dt(S) th P S.
Ta c cng thc tnh din tch ca S:
S=
=
+ +

n
i
i i i i
y x y x
1
1 1
| ) ( |
2
1

2.2.2.2. Trng hp tng qut (Thut ton Jordan)
Ly P(x, y) W, k na ng thng P xut pht t P v khng i qua cc nh
ca a gic S.
Gi S(P) l s giao im ca P vi cc bin ca S.
Nu S(P) l th P S.
* Vn cn li l tm S(P):
Bc 1: K na ng thng P // 0y v hng v pha y>0.
Bc 2: Vi mi cnh C
i
= P
i
P
i+1
ca S:
+ Nu x=x
i
th xt 2 cnh c 1 u l P
i
:
Nu y<y
i
th
S
W
P
2

P
3

P
4

P
5

P
1

Hnh 2.4
Chng II. T mu

29
Nu c 2 u kia cng mt pha ca P th ta tnh P ct c 2 cnh.
Ngc li : P ct 1 cnh.
+ Ngc li:
Nu x>Max(x
i
,x
i+1
) hoc x<Min(x
i
,x
i+1
) th P khng ct Ci
Ngc li:
-Nu y<= Min(y
i
, y
i+1
) th P ct C
i

-Ngc li :
Xt ta giao im (x0, y0) ca P vi C
i

Nu y >= y
0
th P khng ct C
i
. Ngc li P ct C
i
.
Thut ton ny c th c ci t bng on chng trnh nh sau:
Type ToaDo=record
x,y:integer;
End;
Mang=array[0..30] of ToaDo;

Function SOGIAODIEM(a:Mang; n:Byte):Integer;
var dem,i,j,s:Integer;
Begin
dem:=0;
for i:=1 to n do { Tim so giao diem }
begin
if i=n then j:=1 else j:=i+1;
if i=1 then s:=n else s:=i-1;
if x=a[i].x then
begin
if y<a[i].y then
if (x<=Min(a[s].x ,a[j].x))OR
(x>=Max(a[s].x,a[j].x)) then dem:=dem+2
else dem:=dem+1;
end
else
if (x>Min(a[i].x,a[j].x)) and
(x<Max(a[j].x,a[i].x)) then
if y<=Min(a[i].y,a[j].y) then dem:=dem+1
else if y <= (x-a[j].x)*(a[i].y-a[j].y)/
(a[i].x-a[j].x)+a[j].y then dem:=dem+1;
end;
SOGIAODIEM:=dem;
End;
Chng II. T mu

30
2.2.3. Thut ton t mu theo dng qut (Scanline)
t x
0
= Min(x
i
), i [1,n].
Bc 1: K Dy//0y i qua x
0
(hnh 2.5).
Bc 2: Xc nh cc giao im M
i-
(x,y) ca Dy vi cc cnh C
i
.
Nu c cnh C
i
= P
i
P
i+1
song song v
trng vi Dy th xem nh Dy ct Ci ti
2 im P
i
v P
i+1
.
Bc 3: Sp xp li cc im M
i
theo
th t tng dn i vi y
i
(im u
tin c th t l 1).
Bc 4: Nhng im nm trn Dy gia giao im l v giao im chn lin tip l
nhng im nm trong a gic v nhng im ny s c t.
Bc 5: Tng x
0
ln mt Pixel. Nu x
0
Max(x
i
) th quay li bc 1.
2.2.4. Thut ton t mu theo vt du loang
Ly P(x,y) S, t mu P.
Xt cc im ln cn ca P (Hnh 2.6).
Nu cc im ln cn vn cn thuc S v cha
c t mu th t mu cc im ln cn ...
Thut ton trn c th c minh ha bng th tc
qui:
Procedure TOLOANG(x,y:Integer; Color:Word);
Begin
If (P(x,y)S)and(P(x,y)cha t) Then
Begin
PutPixel(x,y,Color);
TOLOANG(x+1,y,Color);
TOLOANG(x-1,y,Color);
x
0
xi
x
Dy
y
Hnh 2.5
O
X
X
X
X
O
Hnh 2.6
Chng II. T mu

31
TOLOANG(x,y+1,Color);
TOLOANG(x,y-1,Color);
End;
End;
BI TP
1. Vit hm DienTich(P:Array; n:Byte); tnh din tch ca a gic li c n nh
lu trong mng P.
2. Vit hm KiemTra(x,y:Integer; P:Array; n:Byte):Boolean; kim tra im
(x,y) nm trong hay ngoi a gic c n nh c lu trong mng P theo hai cch:
- Dng cng thc tnh din tch a gic (i vi a gic li).
- Dng thut ton Jordan (i vi a gic bt k).
2. Vit chng trnh ci t thut ton t mu mt a gic theo thut ton Scanline.
3. Vit chng trnh ci t thut ton t mu mt a gic theo vt du loang theo hai
phng n:
a. qui.
b. Kh qui.
4. Vit th tc FillRec(x1,y1,x2,y2:Integer; color:Byte); t mu hnh ch nht xc
nh bi 2 nh (x1,y1) v (x2,y2).
5. Vit th tc FillEllipse(x,y,Rx,Ry:Integer; color:Byte); t mu Ellipse c tm
(x,y) v bn knh theo hai trc l Rx v Ry.
6. Vit th tc FillSector(x,y,Rx,Ry,g1,g2:Integer; color:Byte); t mu hnh qut
Ellipse c tm (x,y), bn knh theo hai trc l Rx v Ry, gc bt u l g1 v gc kt
thc l g2.
7. Vit th tc Donut(x,y,Rmin,Rmax:Integer; color:Byte); t mu hnh vnh
khn c tm (x,y) v bn knh hai ng trn tng ng l Rmin v Rmax.
Bi tp ln: Xy dng mt th vin ha MYGRAPH tng t nh th vin
GRAPH.TPU ca Turbo Pascal.
CHNG III
XN HNH

3.1. T VN
Cho mt min D R
n
v F l mt hnh trong R
n
(F R
n
). Ta gi F D l hnh c
c t F bng cch xn vo trong D v k hiu l Clip
D
(F).
Bi ton t ra l xc nh Clip
D
(F).
3.2. XN ON THNG VO VNG HNH CH NHT CA R
2

3.2.1. Cnh ca hnh ch nht song song vi cc trc ta
Lc ny:
D =
)
`

max min
max min
| ) , (
2
Y y Y
X x X
R y x
v F l on thng ni 2 im (x1,y1), (x2,y2) nn phng trnh ca F l:

x x x x t
y y y y t
= +
= +

1 2 1
1 2 1
( ).
( ).
t [0,1]
Do , F c th c vit di dng:
F = {(x,y) R
2
| x = x1 + (x2 -x1).t; y = y
1
+ (y2 -y1).t; 0 t 1}
Khi , giao im ca F v D chnh l
nghim ca h bt phng trnh (theo t):

Xmin x1+ (x2 - x1). t Xmax
Ymin 1+ (y2 - y1). t max
0 t 1


y Y
Gi N l tp nghim ca h phng trnh
trn.
Nu N = th Clip
D
(F) =
Nu N th N = [t
1
, t
2
] (t
1
t
2
)
Gi P, Q l 2 giao im xc nh bi:
xMin xMax X

y
yMax


yMin

A
B
P
Q
Hnh 3.1
Chng III. Xn hnh

33

Px x x x t
Py y y y t
= +
= +

1 2 1 1
1 2 1 1
( ).
( ).

Qx x x x t
Qy y y y t
= +
= +

1 2 1 2
1 2 1 2
( ).
( ).

th: Clip
D
(F) = PQ (Hnh 3.1)
3.2.1.1. Thut ton Cohen - Sutherland
Chia mt phng ra lm 9 vng, mi vng nh mt m nh phn 4 bit (hnh 3.2).
Bit 1: Qui nh vng nm bn tri ca s
Bit 2: Qui nh vng nm bn phi ca s
Bit 3: Qui nh vng nm bn di ca s
Bit 4: Qui nh vng nm bn trn ca s
Xt im P R
2
:
Pleft =

<
lai Ngc 0
min P nu
x
X 1

PRight =

>
lai Ngc 0
max P nu
x
X 1

PBelow =

<
lai Ngc 0
min P nu
y
Y 1

PAbove =

>
lai Ngc 0
max P nu
y
Y 1

Xt on thng AB, ta c cc trng hp sau:
i/ Nu M(A) = M(B) = 0000 th AB D Clip
D
(F) = AB
ii/ Nu M(A) AND M(B) 0000 th on AB nm hon ton bn ngoi hnh
ch nht Clip
D
(F) =
Ch : Php ton AND l php ton Logic gia cc bit.
iii/ Nu (M(A) AND M(B) = 0000) v (M(A) 0000 hoc M(B) 0000) th:
Gi s M(A) 0000 A nm ngoi hnh ch nht.
Nu Aleft = 1 : thay A bi im nm trn on AB v ct cnh tri (ni di)
ca hnh ch nht.
100
0
000
0
101
0
001
0
011
0
010
0
010
1
000
1
100
1
Hnh 3.2
Chng III. Xn hnh

34
Nu Aright = 1: thay A bi im nm trn on AB ct cnh phi (ni di) ca
hnh ch nht.
Nu ABelow = 1: thay A bi im nm trn on AB v ct cnh di (ni
di) ca hnh ch nht.
Nu AAbove = 1: thay A bi im nm trn on AB v ct cnh trn (ni
di) ca hnh ch nht.
Ch : Qu trnh ny c lp li: Sau mi ln lp, ta phi tnh li m ca A.
Nu cn, phi i vai tr ca A v B m bo A lun lun nm bn ngoi hnh ch
nht. Qu trnh s dng khi xy ra mt trong 2 trng hp: i/ hoc ii/
3.2.1.2. Thut ton chia nh phn
tng ca thut ton ny tng t nh thut ton tm nghim bng phng php
chia nh phn.
Mnh : Cho M: trung im ca on AB, M(A) 0000, M(B) 0000, M(M)
0000 th ta c:
[M(A) AND M(M)] 0000
hoc [M(M) AND M(B)] 0000.
ngha hnh hc ca mnh : Nu c ba im A, B, M u ngoi hnh ch
nht th c t nht mt on hon ton nm ngoi hnh ch nht.
Ta pht tho thut ton nh sau:
i/ Nu M(A) = 0000 v M(B) = 0000 th Clip
D
(F) = AB
ii/ Nu M(A) AND M(B) 0000 th Clip
D
(F) =
iii/ Nu M(A) = 0000 v M(B) 0000 th:
P:=A; Q:=B;
Trong khi |x
P
-x
Q
| + |y
P
- y
Q
| 2 th:
Ly trung im M ca PQ;
Nu M(M) 0000 th Q:= M.
Chng III. Xn hnh

35
Ngc li: P:= M.
Clip
D
(F) = AP
iv/ Nu M(A) 0000 v M(B) = 0000 th: i vai tr ca A, B v p dng ii/
v/ Nu M(A) 0000 M(B) v [M(A) AND M(B)]= 0000 th:
P:=A; Q:=B;
Ly M: trung im PQ;
Trong khi M(M) 0000 v |x
P
- x
Q
| + |y
P
- y
Q
| 2 th:
Nu M(M) AND M(Q) 0000 th Q:=M. Ngc li P:=M.
Ly M: trung im PQ.
Nu M(M) 0000 th Clip
D
(F) = . Ngc li, p dng ii/ ta c:
Clip
D
(MA) = MA
1

Clip
D
(MB) = MB
1

Suy ra: Clip
D
(F) = A
1
B
1

3.2.1.3. Thut ton Liang - Barsky
t x = x2 - x1 y = y2 - y1
p1 = - x q1 = x1 - xMin
p2 = x q2 = xMax - x1
p3 = - y q3 = y1 - yMin
p4 = y q4 = yMax - y1
th h bt phng trnh giao im ca F v D c th vit li:


=

1..4 k , Q .t P
k k
1 0 t

Xt cc trng hp sau:
i/ k: Pk = 0 v Qk < 0: ( ng thng song song vi cc bin v nm ngoi vng
hnh ch nht )
Chng III. Xn hnh

36
Clip
D
(F) =
ii/ k {1,2,3,4}: Pk 0 hoc Qk 0:
t K
1
= {k | Pk

> 0 }
K
2
= {k | Pk

< 0 }
u
1
= Max({
k
k
P
Q
| k K
2
} {0})
u
2
= Min({
k
k
P
Q
| k K
1
} {1})
Nu u
1
> u
2
th Clip
D
(F) =
Ngc li: Gi P, Q l 2 im tha

+ =
+ =
1
1
1
1
u y y Py
u x x Px
.
.
v

+ =
+ =
2
2
1
1
u y y Qy
u x x Qx
.
.

th Clip
D
(F) = PQ
3.2.2. Khi cnh ca vng hnh ch nht to vi trc honh mt gc (0, /2)
Ta dng php quay trc ta a bi ton v trng hp cc cnh ca hnh
ch nht song song vi cc trc ta (hnh 3.3).
Gi R l ma trn quay ca php i trc, ta c:

X
Y
min
min
|
\

|
= R.
X
Y
min
min
|
\

|


X
Y
max
max
|
\

|
= R.
X
Y
max
max
|
\

|

vi R =
cos( ) sin( )
sin( ) cos( )


|
\

|


x
O
y
Hnh 3.3
Chng III. Xn hnh

37
3.3. XN ON THNG VO HNH TRN
Gi s ta c ng trn tm O(xc,yc) bn knh R v on thng cn xn l AB vi
A(x1,y1), B(x2,y2) (Hnh 3.4).
* Thut ton:
Tnh d(O,AB)
Xt cc trng hp:
i/ Nu d > R th Clip
D
(F) =
ii/ Nu d = R th Clip
D
(F) = A
0
vi A
0
l
chn ng vung gc h t O xung AB.
iii/ Nu d < R th xt cc trng hp sau:
(OA < R) AND (OB < R) th ClipD(F) = AB
Nu mt im nm trong v im kia nm ngoi hnh trn, chng hn
OA<R v OB>R th Clip
D
(F) = AI vi I l giao im duy nht gia AB
v ng trn.
(OA > R) AND (OB > R) th ClipD(F) = IJ vi I, J l hai giao im ca
AB vi ng trn.
Sau y l phng php tm giao im gia on thng v ng trn:
Phng trnh ng trn: (x - xc)
2
+ (y - yc)
2
= R
2
(1)
Phng trnh on AB:


+ =
+ =
1 0
). 1 2 ( 1
). 1 2 ( 1

y y y y
x x x x
(2)
Thay (2) vo (1) ta suy ra: =
b
bc a a
2

Trong :
a = x.(x1 - x
c
) + y.(y1 - yc)
b = (x)
2
+ (y)
2

c = (x1 - x
c
)
2
+ (y1 - yc)
2
- R
2

A
B
Hnh 3.4
Chng III. Xn hnh

38
x = x2 - x1
y = y2 - y1
Da vo iu kin 0 1 chn giao im.
3.4. XN NG TRN VO HNH CH NHT C CC CNH SONG
SONG VI TRC TA
Lc ny:
D = {(x,y)| xMin x xMax ; yMin

y yMax }
F = { (x,y)| (x - x
C
)
2
+ (y - y
C
)
2
= R
2
}
*Trc ht, ta kim tra cc trng hp c bit sau:
i/ Nu xMin x
C
-R; x
C
+R xMax;
yMin y
C
-R; y
C
+R yMax;
th Clip
D
(F) = F (Hnh 3.5)
ii/ Nu x
C
+R < xMin
hoc x
C
-R > xMax
hoc y
C
+R < yMin
hoc y
C
- R > yMax
th Clip
D
(F) = (Hnh 3.6)
*Xt trng hp cn li: Tm cc giao im ca F v D. Sp xp cc giao im
theo chiu ngc kim ng h.
Cc cung trn c to bi 2 giao im lin tip s hon ton nm trong D
hoc hon ton nm bn ngoi D.
xc nh cc cung ny nm trong hay ngoi D, ta ch cn ly trung im
M ca cung . Nu M D th cung nm trong D, ngc li th n nm
ngoi D.
Hnh
3.5
Hnh
3.6
Chng III. Xn hnh

39
3.5. XN A GIC VO HNH CH NHT




Hnh 3.7. Xn a gic vo hnh ch nht
Thut ton SutherLand - Hodgman
i/ Nu tt c cc nh ca a gic u nm trong hnh ch nht th hnh cn xn
chnh l a gic v bi ton coi nh c gii quyt.
Hnh 3.8. Cc trng hp cn xt
ii/ Trng hp ngc li:
- Xut pht t mt nh nm ngoi hnh ch nht, ta chy theo dc bin ca a
gic. Vi mi cnh ca a gic, ta c cc trng hp sau:
Nu c hai nh u nm ngoi hnh ch nht th:
Nu Ma(A
i
) and Ma(A
i+1
) 0000 th khng lu nh
Ngc li th lu hai giao im.
Ai ngoi, A
i+1
trong: lu giao im P v A
i+1
.
C hai nh u nm trong hnh ch nht: lu A
i
v A
i+1
.
A
i
trong, A
i+1
ngoi: lu A
i
v giao im P.
Ai
Ai
+

Ai
+

Ai
Ai
Ai
+

Ai
+

Ai
Ai
Ai
+

Chng III. Xn hnh

40
- Sau khi duyt qua tt c cc cnh ca a gic th ta c c mt dy cc nh mi
pht sinh: B
1
, B
2
, ..., B
n

Nu trong dy cc nh mi ny c hai nh lin tip khng nm trn cng mt
cnh ca hnh ch nht , gi s hai nh l B
i
v B
i+1
th ta i dc cc cnh ca hnh
ch nht t B
i
n B
i+1
tm tt c cc nh ca hnh ch nht nm trong a gic ri
b sung chng vo gia B
i
v B
j
.
Tp nh mi tm c chnh l a gic xn c.
- Nu tp nh mi ny l rng: Nu c mt nh ca hnh ch nht nm trong a
gic th hnh xn c chnh l ton b hnh ch nht. Ngc li, hnh xn c l
rng.
BI TP
1. Vit hm MA(P:ToaDo):Byte; nh m cho im P.
2. Ci t thut ton xn mt on thng vo mt hnh ch nht theo cc thut ton:
Liang-Barsky, Cohen-Sutherland, chia nh phn.
3. Ci t thut ton xn mt on thng vo mt hnh trn.
4.Ci t thut ton xn mt a gic vo mt vng hnh ch nht.



CHNG IV
CC PHP BIN I

4.1. CC PHP BIN I TRONG MT PHNG
4.1.1. C s ton hc
Php bin i Affine 2D s bin im P(x,y) thnh im Q(x,y) theo h phng
trnh sau:
x = Ax + Cy + trx
y = Bx + Dy + try
Di dng ma trn, h ny c dng:
(x y) = (x y).
|
|

\
|
D C
B A
+ (trx try)
Hay vit gn hn: X = X.M + tr
vi X=(x,y); X=(x,y); tr=(trx,try) - vector tnh tin;
M =
|
|

\
|
D C
B A
- ma trn bin i.
4.1.1.1. Php ng dng
Ma trn ca php ng dng l:
M =
A
D
0
0
|
\

|

x Ax
y Dy
'
'
=
=


Cho php ta phng to hay thu nh hnh theo mt hay hai chiu.
4.1.1.2. 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
Chng IV. Cc php bin i

.
42
|
|

\
|
1
1
h
g

1 0
0 1
|
\

|
i xng qua Ox

|
\

|
1 0
0 1
i xng qua gc ta
4.1.1.3. Php quay
Ma trn tng qut ca php quay l R =
|
|

\
|
) ( ) (
) ( ) (


Cos Sin
Sin Cos

Ch :
Tm ca php quay c xt y l gc ta .
nh thc ca ma trn php quay lun lun bng 1.
4.1.1.4. Php tnh tin
Bin i (x,y) thnh (x,y) theo cng thc sau
x = x + M
y = y + N
thun tin biu din di dng ma trn, ta c th biu din cc ta di dng
ta thun nht (Homogen):
(x y 1).
1 0 0
0 1 0
1 M N
|
\

|
|
|
= (x + M y + N 1)
4.1.1.5. Php bin dng
Ma trn tng qut l: M =
Trong :
g = 0: bin dng theo trc x.
h = 0: bin dng theo trc y.
4.1.1.6. Hp ca cc php bin i
C ma trn bin i l tch ca cc ma trn ca cc php bin i.
Chng IV. Cc php bin i

.
43
V d: Php quay quanh mt im bt k trong mt phng c th thc hin bi tch
ca cc php bin i sau:
Php tnh tin tm quay n gc ta .
Php quay vi gc cho.
Php tnh tin kt qu v tm quay ban u.
Nh vy, ma trn ca php quay quanh mt im bt k c thc hin bi tch
ca ba php bin i sau:

1 0 0
0 1 0
1
|
\

|
|
|
M N
.
Cos Sin
Sin Cos
( ) ( )
( ) ( )


0
0
0 0 1

|
\

|
|
|
.
1 0 0
0 1 0
1 M N
|
\

|
|
|

4.2. V d minh ha
Vit chng trnh m phng php quay mt tam gic quanh gc ta .
Uses crt,Graph;
Type ToaDo=Record
x,y:real;
End;
var k,Alpha,goc:real;
P,PP,PPP,P1,P2,P3:ToaDo;
x0,y0:word;
ch:char;
Procedure VeTruc;
Begin
Line(GetMaxX div 2,0,GetMaxX div 2,GetMaxY);
Line(0,GetMaxY div 2,GetMaxX,GetMaxY div 2);
End;
Procedure VeHinh(P1,P2,P3:ToaDo);
Begin
Line(x0+Round(P1.x*k),y0-Round(P1.y*k),
x0+Round(P2.x*k),y0- Round(P2.y*k));
Line(x0+Round(P2.x*k),y0-Round(P2.y*k),
Chng IV. Cc php bin i

.
44
x0+Round(P3.x*k),y0- Round(P3.y*k));
Line(x0+Round(P3.x*k),y0-Round(P3.y*k),
x0+Round(P1.x*k),y0- Round(P1.y*k));
End;
Procedure QuayDiem(P:ToaDo;Alpha:real; var PMoi:ToaDo);
Begin
PMoi.x:=P.x*cos(Alpha)-P.y*sin(Alpha);
PMoi.y:=P.x*sin(Alpha)+P.y*cos(Alpha);
End;
Procedure QuayHinh(P1,P2,P3:ToaDo;Alpha:real;
var P1Moi,P2Moi,P3Moi:ToaDo);
Begin
QuayDiem(P1,Alpha,P1Moi);
QuayDiem(P2,Alpha,P2Moi);
QuayDiem(P3,Alpha,P3Moi);
End;
BEGIN
ThietLapDoHoa;
x0:=GetMaxX div 2;
y0:=GetMaxY div 2;
k:=GetMaxX/50;
Vetruc;
P.x:=5; P.y:=3; PP.x:=2; PP.y:=6; PPP.x:=6; PPP.y:=-4;
P1.x:=5; P1.y:=3; P2.x:=2; P2.y:=6; P3.x:=6; P3.y:=-4;
Alpha:=0; goc:=Pi/180;
SetWriteMode(XORPut);
VeHinh(P,PP,PPP);
Repeat
ch:=readkey;
if ord(ch)=0 then ch:=readkey;
case Upcase(ch) of
#75: Begin
Chng IV. Cc php bin i

.
45
VeHinh(P1,P2,P3);
Alpha:=Alpha-goc;
QuayHinh(P,PP,PPP,Alpha,P1,P2,P3);
VeHinh(P1,P2,P3);
End;
#77: Begin
VeHinh(P1,P2,P3);
Alpha:=Alpha+goc;
QuayHinh(P,PP,PPP,Alpha,P1,P2,P3);
VeHinh(P1,P2,P3);
End;
End;
Until ch=#27;
CloseGraph;
END.
4.2. CC PHP BIN I TRONG KHNG GIAN
4.2.1. Cc h trc ta
nh v mt im trong khng gian, ta c th chn nhiu h trc ta :
X
Y
Z
O
Y
Z

H trc tip H gin tip
Hnh 4.1
H ta trc tip : nu tay phi cm trc Z sao cho ngn ci hng theo
chiu dng ca trc Z th bn ngn cn li s quay t trc X sang trc Y (Qui tc
bn tay phi).
Chng IV. Cc php bin i

.
46
H ta gin tip : ngc li (Qui tc bn tay tri).
Thng thng, ta lun lun nh v mt im trong khng gian qua h trc tip.
Trong h ta trc tip, ta chia ra lm 2 loi sau:
O
X
Y
Z
P(x,y,z)
X
O
Y
P(R,,)
Z

R

H ta Descarter H cu
Hnh 4.2
Ta c cng thc chuyn i ta t h ny sang h khc:
x = R.Cos( ).Cos( )
y = R.Sin( ).Cos( )
z = R.Sin( )
R
2
= x
2
+ y
2
+ z
2

thun tin cho vic tnh ton, tt c cc im trong khng gian u c m t
di dng ma trn 1x4, tc l (x,y,z,1). V vy, tt c cc php bin i trong khng
gian u c biu din bi cc ma trn vung 4x4 (Ma trn Homogen).
4.2.2. Cc cng thc bin i
Php bin i Affine 3D c dng: X=X.M + tr
vi X=(x,y,z); X=(x,y,z); M - ma trn bin i; tr=(trx,try,trz) - vector
tnh tin
4.2.2.1. Php thay i t l
M =
A
B
C
0 0 0
0 0 0
0 0 0
0 0 0 1
|
\

|
|
|
|

x A x
y B y
z C z
' .
' .
' .
=
=
=


Chng IV. Cc php bin i

.
47
4.2.2.2. Php i xng
Mz =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

|
\

|
|
|
|
i xng qua mt (XY)
My=
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

|
\

|
|
|
|
i xng qua mt (XZ)
Mx =

|
\

|
|
|
|
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
i xng qua mt (YZ)
4.2.2.3. Php tnh tin
M =
1 0 0 0
0 1 0 0
0 0 1 0
1 M N P
|
\

|
|
|
|

x x M
y y N
z z P
'
'
'
= +
= +
= +


4.2.2.4. Php quay
Ta nhn thy rng, nu php quay quay quanh mt trc no th ta ca vt
th ti trc s khng thay i. Do , ta c ma trn ca cc php quay nh sau:
RZ =
|
|
|
|
|

\
|

1 0 0 0
0 1 0 0
0 0 ) ( ) (
0 0 ) ( ) (


Cos Sin
Sin Cos

RX =
|
|
|
|
|

\
|

1 0 0 0
0 ) ( ) ( 0
0 ) ( ) ( 0
0 0 0 1


Cos Sin
Sin Cos

Chng IV. Cc php bin i

.
48
RY =
|
|
|
|
|

\
|

1 0 0 0
0 ) ( 0 ) (
0 0 1 0
0 ) ( 0 ) (


Cos Sin
Sin Cos

Ch : Tch ca 2 ma trn ni chung khng giao hon nn kt qu ca 2 php quay lin
tip ty thuc vo th t thc hin tch s.
V d: R
X
.R
Y
R
Y
.R
X

4.2.3. Ma trn nghch o
nh ngha: Hai ma trn c gi l nghch o ca nhau nu tch s ca chng l
ma trn n v.
Ma trn nghch o ca ma trn M k hiu l M
-1

V d:

1 2 3
1 3 3
1 2 4
|
\

|
|
|
.
6 2 3
1 1 0
1 0 1

|
\

|
|
|
=
1 0 0
0 1 0
0 0 1
|
\

|
|
|

Ngi ta chng minh c rng: Tt c cc ma trn ca cc php bin i nu
trn u c ma trn nghch o.
Ma trn nghch o ca php tnh tin c c bng cch thay M, N, P bng -
M, -N, -P.
Ma trn nghch o ca php thay i t l c c bng cch thay A, B, C bng
1/A, 1/B, 1/C.
Ma trn nghch o ca php quay c c bng cch thay gc bng - .
4.3. CC PHP CHIU CA VT TH TRONG KHNG GIAN LN MT PHNG
4.3.1. Php chiu phi cnh (Perspective)
Php chiu ny cho hnh nh ging nh khi nhn vt th.
tm hnh chiu P(y,z) ca P(x,y,z), ta ni P vi mt (tm chiu). Giao im
ca ng ny vi mt quan st chnh l P (hnh 4.3).
Gi s P nm pha trc mt, tc l P.x < E.
Chng IV. Cc php bin i

.
49
Y
Z
X
(E,0,0)
Mat
y '
z '
P '
P(x,y,z)
Mat phang chieu

Hnh 4.3
Phng trnh ca tia i qua mt v P l: r(t) = (E,0,0).(1-t) + (x,y,z).t (*)
Giao im vi mt phng quan st c thnh phn x = 0.
Do thnh phn x ca tia r l E.(1-t) + x.t = 0 nn t =
1
1 x E /
. Thay t vo (*) ta
tnh c:
y =
y
x E 1 /
va z =
z
x E 1 /

NHN XT
i/ Php chiu phi cnh khng gi nguyn hnh dng ca vt th.
ii/ Ch c nhng ng thng song song vi mt phng chiu th mi song song
vi nhau.
iii/ Php chiu phi cnh c qui nh bi 5 bin:
Hng ca mt phng chiu so vi vt th.
cao ca tm chiu so vi vt th.
Khong cch t tm chiu n vt th (R).
Khong cch t mt phng chiu n tm chiu (D).
dch chuyn ngang ca tm chiu so vi vt th.
Ch : Vi ta cu, ta ch cn 4 tham s: R, , , D.
Chng IV. Cc php bin i

.
50
4.3.2. Php chiu song song (Parallel)
Php chiu ny c tm chiu v cc v y=y, z=z.(Hnh 4.4)
Tnh song song c bo ton.
Mat phang chieu
Tam chieu ()
A
B
A'
B'

Hnh 4.4
4.4. CNG THC CA CC PHP CHIU LN MN HNH
Khi quan st mt vt th trong khng gian di mt gc no , ta c 2 kh
nng chn la:
im nhn (mn hnh) ng yn v vt th di ng.
Vt th ng yn v im nhn s c b tr thch hp.
Ta thng chn gii php th hai v n st vi thc t hn.
X

Z0
Y0
Z
Y
O'
X0
Man hnh
YE XE

Hnh 4.5
Khi quan st mt vt th bt k trong khng gian, ta phi tun th cc nguyn tc
sau (hnh 4.5):
Vt th phi c chiu ln mt h trc tip (O,X,Y,Z).
Chng IV. Cc php bin i

.
51
Con mt phi nm gc ca mt h gin tip th hai (O,X
0
,Y
0
,Z
0
)
Mn hnh l mt phng vung gc vi ng thng OO.
Trc Z
0
ca h quan st ch n gc O.
Nu dng h ta cu nh v mt ca ngi quan st th ta d dng thay i
gc ngm bng cch thay i gc v .
By gi, ta kho st php bin i m vt th (X,Y,Z) phi chu cho n trng
vi h quan st (X
0
,Y
0
,Z
0
) cui cng to ra h ta mn hnh (Xe,Ye).
Bc 1: Tnh tin gc O thnh O (hnh 4.6).
X

O

Y
Z
Z1
X1
Y1
O'

Hnh 4.6
Ma trn ca php tnh tin (Ly nghch o):
A=
1 0 0 0
0 1 0 0
0 0 1 0
1
|
\

|
|
|
|
M N P
=
1 0 0 0
0 1 0 0
0 0 1 0
1
|
\

|
|
|
|
R Cos Cos R Sin Cos R Sin . ( ). ( ) . ( ). ( ) . ( )

v h (X,Y,Z) bin i thnh h (X1,Y1,Z1).
Bc 2: Quay h (X1,Y1,Z1) mt gc - ( =90
0
- ) quanh trc Z1 theo chiu kim
ng h. Php quay ny lm cho trc m ca Y1 ct trc Z (hnh 4.7).
Ta gi Rz l ma trn tng qut ca php quay quanh trc Z. V y l php quay h
trc nn phi dng ma trn nghch o R
-1
z
.
Chng IV. Cc php bin i

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

|
\

|
|
|
|
R
-1
z
=
Cos a Sin a
Sin a Cos a
( ) ( )
( ) ( )

|
\

|
|
|
|
0 0
0 0
0 0 1 0
0 0 0 1

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

Sin(- ') = -Sin( ') = -Sin(90
0
- ) = -Cos( )
Cos(- ') = Cos( ') = Cos(90
0
- ) = Sin( )

X2
O'

O
Y
Y2
Z2
Z
X
'

Hnh 4.7
Nn ma trn ca php quay tm c s c dng:
B =
Sin Cos
Cos Sin
( ) ( )
( ) ( )


0 0
0 0
0 0 1 0
0 0 0 1

|
\

|
|
|
|
v h (X1,Y1,Z1) bin i thnh h (X2,Y2,Z2).
Bc 3: Quay h (X2,Y2,Z2) mt gc 90
0
+ quanh trc X2. Php bin i ny s
lm cho trc Z2 hng n gc O (hnh 4.8).
Ta c:
Rx =
|
|
|
|
|

\
|

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

Chng IV. Cc php bin i

.
53
X3
Z3

X
O
Z
O'

'
Y
Y3

Hnh 4.8
R
-1
x
=
1 0 0 0
0 0
0 0
0 0 0 1
Cos a Sin a
Sin a Cos a
( ) ( )
( ) ( )

|
\

|
|
|
|

Thay gc a = 90
0
+ , ta c: Cos(90
0
+ ) = -Sin( ) v Sin(90
0
+ ) = Cos( )
nn ma trn tm c s c dng:
C =
1 0 0 0
0 0
0 0
0 0 0 1

|
\

|
|
|
|
Sin Cos
Cos Sin
( ) ( )
( ) ( )



Lc ny, h (X2,Y2,Z2) bin i thnh h (X3,Y2,Z3).
Bc 4: Bin i h trc tip (X3,Y3,Z3) thnh h gin tip (hnh 4.9).
Trong bc ny, ta phi i hng trc X3 bng cch i du cc phn t ca
ct X. Ta nhn c ma trn:
D =

|
\

|
|
|
|
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

v h (X3,Y3,Z3) bin i thnh h (X
0
,Y
0
,Z
0
).

Chng IV. Cc php bin i

.
54
O
X

Z0
O'

X0
'
Y0
Y
Z

Hnh 4.9
TM LI
Cc im trong khng gian s nhn trong h quan st mt ta c dng:
(x
0
,y
0
,z
0
,1) = (x y z 1).A.B.C.D
Gi T = A.B.C.D, ta tnh c:
T =

|
\

|
|
|
|
sin( ) ( ). ( ) ( ). ( )
( ) ( ). ( ) ( ). ( )
( ) ( )



Cos Sin Cos Cos
Cos Sin Sin Sin Cos
Cos Sin
R
0
0
0 0
0 0 1

Cui cng ta c:
(x
0
,y
0
,z
0
,1) = (x y z 1).T
hay:
x
0
= -x.Sin( ) + y.Cos( )
y
0
= -x.Cos( ).Sin( ) - y.Sin( ).Sin( ) + z.Cos( )
z
0
= -x.Cos( ).Cos( ) - y.Sin( ).Cos( ) - z.Sin( ) + R
* By gi ta chiu nh ca h quan st ln mn hnh.
1. Php chiu phi cnh
Cho im P(x,y,z) v hnh chiu P(x0,y0,z0) ca n trn mt phng.
Gi D l khong cnh t mt phng n mt (gc ta ). (Hnh 4.10)

Chng IV. Cc php bin i

.
55
O
X0
Z0
Y0
P(x0,y0,z0)
P'(xE,yE,zE)
Man hnh

Z0
Y0
Man hnh
O
O
P(x0,y0,z0)
P(x0,y0,z0)
D
yE
X0
xE

Hnh 4.10
Xt cc tam gic ng dng, ta c:
xE/D = x
0
/z
0
v yE/D = y
0
/z
0

x
E
= D.x
0
/z
0
v y
E
= D.y
0
/z
0

Ch : z
0
bao hm vic phng to hay thu nh vt th.
2. Php chiu song song
Ta quan st (x
0
,y
0
,z
0
) v ta mn hnh tha mn cng thc:
x
E
= x
0
v y
E
= y
0

Chng IV. Cc php bin i

.
56
Mat
Man hnh
Man hnh
Phong to Thu nho
Vat the

Hnh 4.11

KT LUN
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.
C th:
Tng gim s quay vt th trong mt phng (XY).
Tng gim s quay vt th ln xung.
Tng gim R quan st vt t xa hay gn.
Tng gim D phng to hay thu nh nh.
4.5. PH LC
To UNIT DOHOA3D (DOHOA3D.PAS).
UNIT DOHOA3D;
INTERFACE
USES graph,crt;
{ Cac hang de quay hinh }
Const IncAng = 5; {Tang goc}
Type ToaDo3D=Record
x,y,z:real;
End;
ToaDo2D=Record
x,y:integer;
End;
Chng IV. Cc php bin i

.
57
PhepChieu = (PhoiCanh,SongSong);
VAR R,d,theta,phi : real;
aux1,aux2,aux3,aux4 : real;
aux5,aux6,aux7,aux8 : real;
projection : PhepChieu;
xproj,yproj : real;
Obs,O : ToaDo3D;
PE,PC : ToaDo2D;
{ cac bien dung quay hinh }
ch : char;
PROCEDURE ThietLapDoHoa;
PROCEDURE KhoiTaoPhepChieu;
PROCEDURE Chieu(P :ToaDo3D);
PROCEDURE VeDen(P :ToaDo3D);
PROCEDURE DiDen(P :ToaDo3D);
PROCEDURE TrucToaDo;
PROCEDURE DieuKhienQuay; {dung de quay hinh}
IMPLEMENTATION
Procedure ThietLapDoHoa;
var gd,gm:integer;
Begin
Gd:=0;
InitGraph(gd,gm,'C:\BP\BGI');
End;
PROCEDURE KhoiTaoPhepChieu;
VAR th,ph :real;
BEGIN
th := pi*theta/180;
ph := pi*phi/180;
aux1 := sin(th);
aux2 := sin(ph);
aux3 := cos(th);
Chng IV. Cc php bin i

.
58
aux4 := cos(ph);
aux5 := aux3*aux2;
aux6 := aux1*aux2;
aux7 := aux3*aux4;
aux8 := aux1*aux4;
PC.x := getmaxx div 2;
PC.y := getmaxy div 2;
END;
PROCEDURE Chieu(P :ToaDo3D);
BEGIN
Obs.x := -P.x*aux1 + P.y*aux3 ;
Obs.y := -P.x*aux5 - P.y*aux6 + P.z*aux4 ;
IF projection = PhoiCanh THEN
BEGIN
obs.z:=-P.x*aux7 -P.y*aux8 -P.z*aux2 + R;
Xproj := d*obs.x/obs.z;
Yproj := d*obs.y/obs.z;
END
ELSE BEGIN
Xproj := d*obs.x;
Yproj := d*obs.y;
END;
END;
PROCEDURE VeDen(P :ToaDo3D);
BEGIN
Chieu(P);
PE.x := PC.x + round(xproj);
PE.y := PC.y - round(yproj);
lineto (PE.x,PE.y);
END;
PROCEDURE Diden(P :ToaDo3D);
BEGIN
Chng IV. Cc php bin i

.
59
Chieu(P);
PE.x := PC.x + round(xproj);
PE.y := PC.y - round(yproj);
moveto (PE.x,PE.y);
END;
PROCEDURE TrucToaDo; { Ve 3 truc }
var OO,XX,YY,ZZ:ToaDo3D;
Begin
OO.x:=0; OO.y:=0; OO.z:=0;
XX.x:=3; XX.y:=0; XX.z:=0;
YY.x:=0; YY.y:=3; YY.z:=0;
ZZ.x:=0; ZZ.y:=0; ZZ.z:=3;
DiDen(OO); VeDen(XX);
DiDen(OO); VeDen(YY);
DiDen(OO); VeDen(ZZ);
END;
PROCEDURE DieuKhienQuay; {Dieu khien Quay/Zoom hinh}
BEGIN
ch := readkey;
IF ch = #0 THEN ch := readkey;
cleardevice;
CASE UpCase(ch) OF
#72 : phi := phi + incang;
#80 : phi := phi - incang;
#75 : theta := theta + incang;
#77 : theta := theta - incang;
END; {of case ch}
END; {of Procedure}
END. {Of UNIT}
4.6. V D MINH HA
Vit chng trnh m t php quay ca mt hnh lp phng quanh cc trc (hnh
4.12).
Chng IV. Cc php bin i

.
60
Y
Z
X
P1
P8
P6 P7
P3
P2
P4
P5

Hnh 4.12
Uses crt,graph,Dohoa3D;
var P1,P2,P3,P4,P5,P6,P7,P8:ToaDo3D;
Procedure KhoiTaoBien;
Begin
D:=70; R:=5;
Theta:=40; Phi:=20;
P1.x:=0; P1.y:=0; P1.z:=0;
P2.x:=0; P2.y:=1; P2.z:=0;
P3.x:=1; P3.y:=1; P3.z:=0;
P4.x:=1; P4.y:=0; P4.z:=0;
P5.x:=1; P5.y:=0; P5.z:=1;
P6.x:=0; P6.y:=0; P6.z:=1;
P7.x:=0; P7.y:=1; P7.z:=1;
P8.x:=1; P8.y:=1; P8.z:=1;
End;
Procedure VeLapPhuong;
begin
Diden(P1); VeDen(P2);
VeDen(P3); VeDen(P4);
VeDen(P1); VeDen(P6);
Veden(P7); VeDen(P8);
VeDen(P5); VeDen(P6);
DiDen(P3); VeDen(P8);
Chng IV. Cc php bin i

.
61
DiDen(P2); VeDen(P7);
DiDen(P4); VeDen(P5);
end;
Procedure MinhHoa;
BEGIN
KhoiTaoBien;
KhoiTaoPhepChieu;
TrucToaDo;
VeLapPhuong;
Repeat
DieuKhienQuay;
KhoiTaoPhepChieu;
ClearDevice;
TrucToado;
VeLapPhuong;
until ch=#27;
END;
BEGIN { Chuong Trinh Chinh }
Projection:=SongSong{Phoicanh};
ThietLapDoHoa;
MinhHoa;
CloseGraph;
END.
BI TP
1. Cho 3 tam gic sau:
ABC vi A(1,1) B(3,1) C(1,4)
EFG vi E(4,1) F(6,1) G(4,4)
MNP vi M(10,1) N(10,3) P(7,1)
a. Tm ma trn bin i tam gic ABC thnh tam gic EFG.
b. Tm ma trn bin i tam gic ABC thnh tam gic MNP.
2. Ci t thut ton xn mt on thng vo mt hnh ch nht c cnh khng song
song vi trc ta .
Chng IV. Cc php bin i

.
62
3. Vit chng trnh v mt Ellipse c cc trc khng song song vi h trc ta .
4. Da vo bi tp 2, hy m phng qu trnh quay ca mt Ellipse xung quanh tm
ca n.
5. Vit chng trnh m phng qu trnh quay, i xng, tnh tin, phng to, thu nh,
bin dng ca mt hnh bt k trong mt phng.
6. M phng chuyn ng ca tri t xung quanh mt tri ng thi m t chuyn
ng ca mt trng xung quanh tri t.
M rng trong khng gian 3 chiu.
7. Vit chng trnh v ng h ang hot ng.
8. Vit chng trnh v cc khi a din u trong khng gian.
M rng: iu khin phng to, thu nh, quay cc khi a din quanh cc trc...



CHNG V
BIU DIN CC I TNG BA CHIU

5.1. M HNH WIREFRAME
M hnh WireFrame th hin hnh dng ca i tng 3D bng 2 danh sch :
Danh sch cc nh : lu ta ca cc nh.
Danh sch cc cnh : lu cc cp im u v cui ca tng cnh.
Cc dnh v cc cnh c nh s th t cho thch hp.
V d: Biu din 1 cn nh th s (hnh 5.1)
Danh sch cc nh
Vector x y z
1 0 0 0
2 0 1 0
3 0 1 1
4 0 0.5 1.5
5 0 0 1
6 1 0 0
7 1 1 0
8 1 1 1
9 1 0.5 1.5
10 1 0 1
C nhiu cch lu gi m hnh
WireFrame. y, chng ta dng cu trc record da trn 2 mng:
Const MaxDinh = 50; { S nh ti a}
MaxCanh = 100; {S cnh ti a}
Type ToaDo3D = record
x, y, z:real;
end;
WireFrame = Record
X
Z
P2
P3
P6
P7
P1
P10
P5
P8
Y
P4
P9

Hnh 5.1
Chng V. Biu din cc i tng ba chiu


64
Sodinh: 0..MaxDinh;
Dinh: array [1..MaxDinh] of ToaDo3D;
Socanh : 0..Maxcanh;
Canh :array[1..Maxcanh, 1..2] of 1..MaxDinh;
end;
Khi , ta dng mt bin m t cn nh :
Var House : WireFrame;
vi bin house trn, ta c th gn gi tr nh
sau:
With House Do
Begin
sodinh:=10;
socanh:=17;
dinh[1].x:=0;
dinh[1].y:=0;
dinh[1].z:=0;
...
canh[1, 1]:=1; {S nh th nht ca
cnh s 1}
canh[1, 2]:=2; {S nh th hai ca
cnh s 1}
...
end;
5.2. V M HNH WIREFRAME VI CC
PHP CHIU
v mt i tng WireFrame, ta v tng
cnh trong danh sch cc cnh ca m hnh. Vn l lm th no v 1 ng
thng trong khng gian 3 chiu vo mt phng?
lm iu ny, ta phi b bt i 1 chiu trong m hnh biu din, tc l ta phi
dng php chiu t 3D 2D .
Danh sch cc cnh
Cnh nh u nh cui
1 1 2
2 2 3
3 3 4
4 4 5
5 5 1
6 6 7
7 7 8
8 8 9
9 9 10
10 10 6
11 1 6
12 2 7
13 3 8
14 4 9
15 5 10
16 2 5
17 1 3
Chng V. Biu din cc i tng ba chiu


65
K thut chung v mt ng thng 3D l:
Chiu 2 im u mt thnh cc im 2D.
V ng thng i qua 2 im va c chiu.
Sau y l th tc xc nh hnh chiu ca mt im qua php chiu phi cnh:
Procedure Chieu(P3D:ToaDo3D; E:Real; Var P2D:ToaDo2D);
Var t:Real;
Begin
If (P3D.x >=E) OR (E=0) Then
Writeln(im nm sau mt hoc mt nm trn mt phng
nhn);
Esle
Begin
t := 1/(1 - P3D.x/E);
P2D.y := t*P3D.y;
P2D.z := t*P3D.z;
End;
End;
5.3. V CC MT TON HC
Ta s v cc mt cong da trn phng trnh tham s ca cc mt .
V d:

(a) (b) (c)
Hnh 5.2
Mt Ellipsoid: (hnh 5.2.a)
x=Rx.cos(u).cos(v)
y=Ry.sin(u).cos(v)
Chng V. Biu din cc i tng ba chiu


66
z=Rz.sin(v)
Trong : 0 u 2 -/2 v /2
Mt Hypeboloid: (hnh 5.2.b)
x=u
y=v
z=u
2
- v
2

Trong u,v [-1,1]
Hnh xuyn: (hnh 5.2.c)
x=(R + a.cos(v)).cos(u)
y=(R + a.cos(v)).sin(u)
z= a.sin(v)
Trong : 0 u 2 -/2 v /2
Hnh tr trn (Cylinder)
x = R.cos(u)
y = R.sin(u)
z = h
Hnh nn (Cone)
p(u,v) = (1-v).P
0
+ v.P
1
(u)
trong :
P
0
: nh nn
P
1
(u): ng trn

=
=
) sin( .
) cos( .
u R y
u R x
u,v [0,1]
Cho Parabol (Paraboloid)
x = a.v.cos(u)
y = b.v.sin(u) u[-,], v 0
z = v
2

Phng php chnh y cng l v cc ng vin theo u v v.
Chng V. Biu din cc i tng ba chiu


67
v mt ng vin u ti gi tr u khi v chy t VMin n VMax ta lm nh
sau:
To mt tp hp cc gi tr v[i] [VMin ,VMax], xc nh v tr P[i] =
(X(u,v[i]), Y(u,v[i]), Z(u,v[i])).
Chiu tng im P[i] ln mt phng.
V cc ng gp khc da trn cc im 2D P[i].
Sau y l th tc v h ng cong theo u:
Procedure HoDuongCongU;
Var P: ToaDo3D;
u,v,du,dv:Real;
Begin
u:=UMin; du:=0.05; dv:=0.05;
While u<=UMax do
Begin
v:=Vmin;
P.x:=fx(u,v);
P.y:=fy(u,v);
P.z:=fz(u,v);
DiDen(P); { i n im xut pht ban u }
While v<=VMax do
Begin
v:=v+dv;
P.x:=fx(u,v);
P.y:=fy(u,v);
P.z:=fz(u,v);
VeDen(P); { V n im mi }
End;
u:=u + du;
End;
End;
Tng t, ta c th v h ng cong theo v.
Chng V. Biu din cc i tng ba chiu


68
TM LI: Mun v mt mt cong, ta thc hin cc bc sau
Nhp cc h s ca phng trnh mt: a, b, c, d, Umin, Umax, Vmin, Vmax.
Tnh cc hm 2 bin: X(u,v), Y(u,v), Z(u,v).
Khi to php chiu: Song song/Phi cnh.
V h ng cong u.
V h ng cong v.
BI TP
1. Hy xy dng mt cu trc d liu lu tr m hnh WireFrame.
2. To file text lu cc nh v cnh ca mt vt th trong khng gian 3D theo m
hnh WireFrame vi cu trc nh sau:
Dng u tin cha hai s nguyn m, n dng lu s nh v s cnh ca m
hnh.
m dng tip theo, mi dng lu ta x, y, z ca tng nh trong m hnh.
n dng tip theo, mi dng lu hai s nguyn l nh u v nh cui ca tng
cnh trong m hnh.
3. Vit th tc c cc gi tr trong file text lu vo m hnh WireFrame.
4. Vit th tc v vt th t m hnh WireFrame.
5. Vit chng trnh biu din cc khi a din sau: T din u, Khi lp phng,
Bt din u, Thp nh din u, Nh thp din u.
6. Vit chng trnh m phng cc mt ton hc: yn nga, mt cu, hnh xuyn...

CHNG VI
THIT K NG V MT CONG
BEZIER V B-SPLINE


Khc vi nhng phng php biu din mt v ng bi cc cng thc ton hc
tng minh, y ta s bn n cc cng c cho php ch ra cc dng ng v mt
khc nhau da trn cc d liu.
iu ny c ngha l vi mt ng cong cho trc m ta cha xc nh c cng
thc ton hc ca n th lm th no c th nm bt c dng ca ng cong
mt cch tng i chnh xc qua vic s dng mt tp nh cc im P
0
, P
1
,... cng
vi mt phng php ni suy no t tp im ny to ra ng cong mong
mun vi mt chnh xc cho php.
C nhiu cch nm bt c ng cong cho trc, chng hn:
Ly mt mu ng cong chng vi chc im cch nhau tng i ngn ri
tm mt hm ton hc v chnh hm ny sao cho n i qua cc im ny v
khp vi ng cong ban u. Khi , ta c c cng thc ca ng v dng
n v li ng cong.
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 th ng
cong ban u v ng cong to ra khng khp nhau lm, khi ta c th di
chuyn mt vi im kim sot v lc ny thut ton li pht sinh mt ng
cong mi da trn tp im kim sot mi. Tin trnh ny lp li cho n khi
ng cong to ra khp vi ng cong ban u.
y, ta s tip cn vn theo phng php th hai, dng n cc ng cong
Bezier v B-Spline to cc ng v mt.
Gi s mt im trong khng gian c biu din di dng vector tham s p(t).
Vi cc ng cong 2D, p(t) = (x(t), y(t)) v cc ng 3D, p(t) = (x(t), y(t), z(t)).
6.1. NG CONG BEZIER V MT BEZIER
6.1.1. Thut ton Casteljau
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

70
xy dng ng cong p(t), ta da trn mt dy cc im cho trc ri to ra gi
tr p(t) ng vi mi gi tr t no . Vic thay i cc im ny s lm thay i dng
ca ng cong. Phng php ny to ra ng cong da trn mt dy cc bc ni
suy tuyn tnh hay ni suy khong gia (In-Betweening).
V d: Vi 3 im P
0
, P
1
, P
2
ta c th xy dng mt Parabol ni suy t 3 im ny
bng cch chn mt gi tr t [0, 1] no ri chia on P
0
P
1
theo t l t, ta c
im P
0
1
trn P
0
P
1
. Tng t, ta chia tip P
1
P
2
cng theo t l t, ta c P
1
1
. Ni P
0
1

v P
1
1
, li ly im trn P
0
1
P
1
1
chia theo t l t, ta c P
0
2
.
Vi cch lm ny, ta s ly nhng gi tr t khc [0, 1] th s c tp im P
0
2
.
chnh l ng cong p(t).
Ta biu din bng phng trnh:
P
0
1
(t) = (1-t).P
0
+ t.P
1
(1)
P
1
1
(t) = (1-t).P
1
+ t.P
2
(2)
P
0
2
(t) = (1-t).P
0
1
+ t.P
1
1
(3)
Thay (1), (2) vo (3) ta c:
P(t) = P
0
2
(t) = (1-t)
2
.P
0
+ 2t.(1-t).P
1
+ t
2
.P
2

y l mt ng cong bc 2 theo t nn n l mt Parabol.
Tng qut ha ta c thut ton Casteljau cho (L+1) im:
Gi s ta c tp im: P
0
, P
1
, P
2
, ..., P
L

Vi mi gi tr t cho trc, ta to ra im P
i
r
(t) th h th r, t th h th (r - 1)
trc , ta c:
P
i
r
(t) = (1-t).P
i
r-1
(t) + t.P
i+1
r-1
(t) (3)
r = 0,1,...,L v i = 0,...,L-r
Th h cui cng P
0
L
(t) c gi l ng cong Bezier ca cc im P
0
,P
1
,P
2
,...,P
L

Cc im P
i
, i=0,1,...,L c gi l cc im kim sot hay cc im Bezier.
a gic to bi cc im kim sot ny gi l a gic kim sot hay a gic Bezier.
6.1.2. Dng Bernstein ca cc ng cong Bezier
ng cong Bezier da trn (L+1) im kim sot P
0
,P
1
, ...,P
L
c cho bi cng
thc:
P(t) =
k
L
=

0
P
k
.B
k
L
(t)
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

71
Trong , P(t) l mt im trong mt phng hoc trong khng gian.
B
k
L
(t) c gi l a thc Bernstein, c cho bi cng thc:
B
k
L
(t) =
L
k L k
!
!( )!
(1-t)
L-k
.t
k
vi L k
Mi a thc Bernstein c bc l L. Thng thng ta cn gi cc B
k
L
(t) l cc hm
trn (blending function).
Tng t, i vi mt Bezier ta c phng trnh sau:
P(u,v) =
i
M
=

0 i
L
=

0
P
i,k
.B
i
M
(u).B
k
L
(v)
Trong trng hp ny, khi a din kim sot s c (M+1).(L+1) nh.


ng cong Bezier bc 2 ng cong Bezier bc 3
Hnh 6.1
6.1.3. Dng biu din ma trn ca ng Bezier
thch hp cho vic x l trn my tnh, ta biu din hai mng BL(t) v P nh
sau:
B
L
(t) = (B
0
L
(t), B
1
L
(t), ..., B
L
L
(t))
P = (P
0
,P
1
, ...,P
L
)
Do : P(t) = B
L
(t).P (tch v hng)
hay P(t) = B
L
(t).P
T
(P
T
l dng chuyn v ca P)
Di dng a thc, c th biu din B
k
L
(t) nh sau:
B
k
L
(t) = a
0
+ a
1
.t + a
2
.t
2
+ ... + a
L
.t
L
= (t
0
,t
1
,...,t
L
).(a
0
,a
1
,...,a
L
)
Do P(t) c th biu din li nh sau:
P(t) = Pow
L
(t).Bez
L
.P
T

Vi:
Pow
L
(t) = (t
0
,t
1
,...,t
L
)
P
1
1
P
1

P
0
1
P
1

P
0
2
P
2

Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

72
Bez
L
l ma trn biu din mng B
L
(t) trong mi hng i ca ma trn ng vi
cc h s tng ng (a
0
,a
1
,...,a
L
) ca a thc B
i
L
(t) v ti v tr (i,j) trong ma trn Bez
L

c gi tr Bez
L
(i,j) = (-1)
j-i
.C
n
i
.C
i
j

V d: Ma trn Bez
3
cho cc ng Bezier bc 3
Bez
3
=
1 0 0 0
3 3 0 0
3 6 3 0
1 3 3 1


|
\

|
|
|
|

6.1.4. To v v cc ng Bezier
to ra mt ng cong Bezier t mt dy cc im kim sot ta s p dng
phng php ly mu hm p(t) cc gi tr cch u nhau ca tham s t, v d c th
ly ti = i/N, i=0,1,...,N. Khi ta s c cc im P(t
i
) t cng thc Bezier.
Ni cc im ny bng cc on thng ta s c ng cong Bezier gn ng.
tnh P(t
i
) ta c th p dng ma trn ca P(t) trn trong ch c thnh phn Pow
L
(t
i
)
l thay i, cn tch Bez
L
.P
T
vi P = (P
0
,P
1
, ...,P
L
) l khng thay i.
Sau y l th tc minh ha vic v ng cong Bezier trong mt phng:
Type Mang = array[0..50] of PointType;
function tich(x,y:word):real;
var s:real;i:word;
begin
if y<=1 then tich:=1
else begin
s:=1;
for i:=x to y do s:=s*i;
tich:=s;
end;
end;
function CLK(l,k:word):real;
begin
CLk:=tich(k+1,l)/tich(1,l-k);
end;
function Xmu(x:real;mu:word):real;
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

73
var i:word;s:real;
begin
if mu=0 then s:=1
else begin
s:=1;
for i:=1 to mu do s:=s*x;
end;
Xmu:=s;
end;
function BKL(t:real;l,k:word):real;
begin
BKL:=CLK(l,k)*xmu(1-t,l-k)*xmu(t,k);
end;
procedure Pt(t:real;L:word;A:Mang;var diem:PointType);
var k:word;s,x,y:real;
begin
x:=0; y:=0;
for k:=0 to L do
begin
s:=BKL(t,l,k);
x:=x+A[k].x*s;
y:=y+A[k].y*s;
end;
diem.x:=round(x);
diem.y:=round(y);
end;
procedure Vebezier(A:Mang;L:integer);
var i,SoDiem:word; Diem:PointType;
dx,x:real;
begin
sodiem:=100;
dx:=1/sodiem;
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

74
x:=0;
if L>0 then
begin
for i:=1 to sodiem+1 do
begin
Pt(x,L,A,Diem);
if i=1 then moveto(round(diem.x),round(diem.y))
else lineto(round(diem.x),round(diem.y));
x:=x+dx;
end;
end
end;
6.1.5. Cc tnh cht ca ng cong Bezier
i/ Ni suy c cc im u v cui.
Chng minh:
Ta c: P(t) =
k
L
=

0
P
k
.B
k
L
(t)
Do P(0) =
k
L
=

0
P
k
.B
k
L
(0)
trong : B
k
L
(0) =
L
k L k
!
!( )!
(1-0)
L-k
.0
k
k 0 v k L
=
L
k L k
!
!( )!
.0 = 0
V vy, P(0) = P
0
.B
0
L
(0) + P
L
.B
L
L
(0)
= P
0
+ 0 = P
0

L lun tng t cho P(1). Ta c P(1) = P
L
.
ii/ Tnh bt bin Affine:
Khi bin i mt ng cong Bezier, ta khng cn bin i mi im trn ng
cong mt cch ring r m ch cn bin i cc im kim sot ca ng cong ri
s dng cng thc Bernstein ti to li ng cong Bezier c bin i.
Chng minh:
Gi s im P(t) bin i Affine thnh P(t)
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

75
P(t) = P(t).N + tr =
k
L
=

0
P
k
.B
k
L
(t).N + tr
Trong :
N: ma trn bin i.
tr: vector tnh tin.
Xt ng cong
k
L
=

0
(P
k
.N + tr).B
k
L
(t) (*)
c to ra bng cch bin i Affine cc vector P
k
. Ta s chng minh ng cong
ny chnh l P(t).
Khai trin (*) ta c:
k
L
=

0
P
k
.N.B
k
L
(t) +
k
L
=

0
tr.B
k
L
(t)
=
k
L
=

0
P
k
.N.B
k
L
(t) + tr.
k
L
=

0
B
k
L
(t) (**)
Nhng theo a thc Bernstein th
k
L
=

0
B
k
L
(t) = (1-t+t)
L
= 1 nn s hng th hai ca
(**) s l tr.
V vy, P(t) nm trn ng cong Bezier to ra bi cc im kim sot P
k
.
iii/ Tnh cht ca bao li: ng cong Bezier P(t) khng bao gi i ra ngoi bao li
ca n.
y, bao li ca cc im kim sot l tp nh nh nht cha tt c cc im
kim sot .
Chng minh:
Bao li ca cc im kim sot cng chnh l tp hp cc t hp li ca cc
im kim sot.
Ta biu din t hp tuyn tnh ca cc im Pk:
P(t) =
k
L
=

0
a
k
.P
k
, a
k
0
Do P(t) l t hp li ca cc im kim sot t [0,1] v
k
L
=

0
B
k
L
(t) = 1
Nn ng cong Bezier s nm trong bao li ca cc im kim sot.
iv/ 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
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

76
nn ng Bezier b kp vo bn trong bao li nn n cng tr thnh ng
thng.
v/ Bt k mt ng thng hay mt phng no cng lun lun ct ng cong
Bezier t ln hn so vi ct a gic kim sot.
vi/ o hm ca cc ng Bezier:
Ta c: (P(t)) = L.
k
L
=

0
1
P
k
.B
k
L-1
(t) , P
k
= P
k+1
- P
k

Do , o hm ca ng cong Bezier l mt ng cong Bezier khc c
to ra t cc vector kim sot P
k
( Ta ch cn ly cc im kim sot gc theo
tng cp to ra cc im kim sot cho (P(t)).
6.1.6. nh gi cc ng cong Bezier
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 lp i lp li cho n khi ton b ng cong tha yu
cu.
Tuy nhin, khi ta thay i bt k mt im kim sot no th ton b ng cong b
thay i theo. Nhng trong thc t, ta thng 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 biu hin qua cc a thc B
k
L
(t) u
khc 0 trn ton khong [0,1]. Mt khc ng cong p(t) li l mt t hp tuyn tnh
ca cc im kim sot c gia trng bi cc hm B
k
L
(t) nn ta kt lun rng mi
im kim sot c nh hng n ng cong tt c cc gi tr t [0,1]. Do , hiu
chnh bt k mt im kim sot no cng s nh hng n dng ca ton th ng
cong.
gii quyt bi ton ny, ta s dng mt tp hp cc hm trn khc nhau. Cc
hm trn ny c gi mang (support: khong m trn hm ly gi tr khc 0) ch l
mt phn ca khong [0,1]. Ngoi gi mang ny chng c gi tr l 0.
Thng ta chn cc hm trn l cc a thc trn cc gi mang , cc gi mang ny
k nhau. Nh vy, cc 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
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

77
ng cong kt qu c gi l a thc ring phn hay tng phn (piecewise
polynomial).
V d: ta nh ngha hm g(t) gm 3 a thc a(t), b(t), c(t) nh sau:
g(t) =

[2,3] mang gia co t) - (3


2
1
= c(t)
[1,2] mang gia co )
2
3
- (t -
4
3
= b(t)
[0,1] mang gia co t
2
1
= a(t)
2
2
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 (knut), chng hn
t=0,1,2,3 l bn nt ca g(t). Hn na, ti cc ch ni ca ng cong g(t) l trn,
khng b gp khc. Do , 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 cc hm trn to ra
ng cong p(t) da trn cc im kim sot P
0
,...,P
L
. Khi :
P(t) =
k
L
=

0
P
k
.g
k
(t)
Tng qut ha, ta xy dng mt hm p(t) vi L+1 im kim sot nh sau:
Vi mi im kim sot P
k
, ta c mt hm trn tng ng R
k
(t) v tp cc nt gi
l vector nt T=(t
0
,t
1
,...,t
n
) vi t
i
R, t
i
t
i+1
. Khi :
P(t) =
k
L
=

0
P
k
.R
k
(t)
6.2. NG CONG SPLINE V B-SPLINE
6.2.1. nh ngha
Theo trn ta c: P(t) =
k
L
=

0
P
k
.R
k
(t) (*)
trong P
k
vi k=1..L l cc im kim sot.
R
k
(t) l cc hm trn lin tc trong mi on con [t
i
, t
i+1
]v lin tc trn
mi nt. Mi R
k
(t) l mt a thc ring phn.
Do ng cong p(t) l tng ca cc a thc ny, ly trn cc im kim sot.
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

78
Cc on ng cong ring phn ny gp nhau cc im 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 th c nhiu h hm trn c dng to ra mt
ng cong Spline c th nh ngha trn vector nt . Mt h cc hm 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 v nh vy n em li kh nng kim sot cc b ln nht. l cc B-
Spline, vi B vit tt ca ch Basic (c s).
i vi cc hm B-Spline, mi a thc ring phn to ra n c mt cp m no .
Do , thay v dng k hiu Rk(t) cho cc hm ring phn ny ta s k hiu cc hm
trn ny l N
k,m
(t).
Do cc ng cong B-Spline c th biu din li: P(t) =
k
L
=

0
P
k
.N
k,m
(t)
TM LI
xy dng cc ng cong B-Spline ta cn c:
Mt vector nt T=(t
0
, t
1
, t
2
, ...,t
k+m-1
).
(L+1) im kim sot.
Cp m ca cc hm B-Spline v cng thc c bn cho hm B-Spline N
k,m
(t) l:
N
k,m
(t) =
t t
t t
k
k m k

|
\

|
+ 1
.N
k,m-1
(t) +
t t
t t
k m
k m k
+
+ +

|
\

|
1
.N
k+1,m-1
(t) vi k=0..L
y l mt cng thc quy vi N
k,L
(t) =

+
lai ngc 0
1 1 k k t t t

(Hm hng bng 1 trn on (t
k
, t
k+1
)
i vi cc mt B-Spline, ta c cng thc biu din tng t:
P(u,v) =
i
M
=

0 k
L
=

0
P
i,k
.N
i,m
(u).N
k,m
(v)
Nhn xt: Cc ng Bezier l cc ng B-Spline.
6.2.2. Cc tnh cht hu ch trong vic thit k cc ng cong B-Spline
i/ Cc ng B-Spline cp m l cc a thc ring phn cp m. Chng l cc
Spline do chng c m-2 cp o hm lin tc mi im trong gi mang ca
chng.
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

79
Cc hm B-Spline cp m to thnh mt c s cho bt k Spline no c cng
cp c nh ngha trn cng cc nt. Cc Spline c th c biu din nh
mt t hp tuyn tnh ca cc B-Spline.
ii/ Hm trn B-Spline N
k,m
(t) bt u tk v kt thc t
k+m
. Gi mang ca n l
[t
k
,t
k+m
]. Gi mang ca h cc hm N
k,m
(t) vi k=0,...L l khong [t
0
,t
m+L
].
iii/ Mt ng cong B-Spline ng da trn L+1 im kim sot c th c to ra
bng cch dng phng trnh ng B-Spline tun hon sau:
P(t) =
k
L
=

0
P
k
.N
0,m
((t-k) mod (L+1))
Vi gi thit cc nt cch u nhau trong nh ngha ca hm N
0,m
(...).
iv/ Nu dng vector chun th ng cong B-Spline s ni suy cc im kim sot
u tin v cui cng. Cc hng khi u v kt thc ca ng cong s
nm dc theo cc cnh u tin v cui cng ca a gic kim sot.
v/ Mi hm B-Spline N
k,m
(t) l khng m t, v tng cc h hm ny bng 1:

k
L
=

0
N
k,m
(t) = 1 t [t
0
, t
m+L
]
vi/ Cc ng cong da trn cc B-Spline l bt bin Affin. Do , bin i
mt ng cong B-Spline, ch cn bin i cc im kim sot, sau khi to
li ng cong t cc im kim sot c bin i ny.
vii/ Mt ng cong B-Spline s nm trong bao li ca cc im kim sot
Mnh hn: bt k t no, ch c m hm B-Spline l khc 0. V vy, mi t ng
cong phi nm trong bao li ca hu ht m im kim sot kch hot k nhau.
(Cc im kim sot kch hot l cc im m ti hm B-Spline khc 0)
viii/ chnh xc tuyn tnh ca ng cong B-Spline: Nu m im kim sot k
nhau l tuyn tnh cng nhau th bao li ca chng l mt ng thng. Do
ng cong cng s tr thnh ng thng.
ix/ Tnh cht gim bin thin: S giao im gia ng cong B-Spline vi bt
k mt mt phng no (nu c) lun lun nh hn s giao im (nu c) gia
a gic kim sot ca n vi mt phng .
6.2.3. Thit k cc mt Bezier v B-Spline
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

80
Ta c th dng cc hm trn Bezier v B-Spline m t v v cc mt cong. i
vi cc mt cong, ta biu din chng di dng tham s qua mt hm vector vi 2
tham s l u, v. Dng tng qut ca mt mt cong l:
p(u,v) = (X(u,v),Y(u,v),Z(u,v))
p(u,v) = X(u,v).i + Y(u,v).j + Z(u,v).k
Khi u, v bin thin trn mt khong no th cc hm X(u,v), Y(u,v) v Z(u,v)
thay i gi tr, do lm cho v tr ca p(u,v) thay i trong khng gian 3 chiu.
Chng ta s khng biu din cc mt qua cc hm ton hc tng minh m s biu
din chng qua cc im kim sot.
V d: p(u,v) = (1-v).((1-u).P
00
+ u.P
10
) + v.((1-u).P
01
+ u.P
11
) dng 4 im kim
sot 4 gc l Pij vi cc hm trn l tuyn tnh theo u, v.
6.2.4. Cc bng Bezier
ng cong Bezier trong khng gian 3 chiu c th c vit di dng l mt
hm ca tham s v vi L+1 im kim sot ty thuc vo tham s u theo mt kiu no
: Chng hn P(u,v) =
k
L
=

0
P
k
(u).B
k
L
(v) (*)
Ngha l mi ng vin u l mt ng cong Bezier chun, nhng nhng gi tr
u khc nhau th cc im kim sot cng nm nhng v tr khc nhau.
Khi u bin thin th mi im kim sot P
k
(u) s chy trn mt ng cong c th.
Do , mt cong c th xem nh l mt s dch chuyn ng Bezier trong khng
gian.
Ta tng tng mt a gic kim sot chuyn ng trong khng gian v thay i
dng khi chuyn ng. mi v tr, a gic ny to nn mt ng cong Bezier v
mt cong to thnh chnh l ci vt cn li bn di ca ng cong ny.
V d: Php chiu phi cch ca mt mt c to ra bi vic ni suy tuyn tnh
gia 2 ng cong Bezier da trn 2 a gic kim sot l P
0
v P
1
. Mi ng cong
kim sot p
k
(u) c ni suy tuyn tnh gia 2 im kim sot P
k
0
v P
k
1
khi u bin
thin gia 0 v 1:
p
k
(u) = (1-u).P
k
0
+ u.P
k
1
k=0,1,2,3
Gi s cc ng cong kim sot p
k
(u) chnh l cc ng cong Bezier, mi ng
cong ny da trn m +1 im kim sot ca chng.
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

81
V vy: P
k
(u) =
i
M
=

0
P
i,k
.B
i
M
(u)
Kt hp p
k
(u) ny vo phng trnh (*) ta c:
P(u,v) =
i
M
=

0 k
L
=

0
P
i,k
.B
i
M
(u).B
k
L
(v) (**)
Ta gi y l dng tch Tensor cho bng Bezier.
Cng ging nh cc a gic kim sot trong 2D, mt khi a din kim sot l mt
mng gm c (M+1).(L+1) nh.
Tm li, to ra mt bng ta ch cn ch ra cc v tr ca cc nh ny ri sau p
dng phng trnh (**) v cc ng vin hay nh ngha dng mt cong.
6.2.5. Dn cc bng Bezier vi nhau
Mc ch l to ra cc dng mt phc tp gm nhiu bng Bezier kt li vi nhau
mt cch trn tru cc bin chung.
Khi ni 2 bng Bezier li vi nhau, mi bng c mt khi a din kim sot ring
v u c to ra t phng trnh (*) vi u, v bin thin trong khong [0,1]. Vn
l lm sao cho 2 bng c th dn vo nhau mt cch trn tru.
Hai bng s gp nhau tt c cc im dc theo bin chung nu cc khi a din
kim sot ca chng khp nhau bin. Nh vy, ta ch cn chn cc a gic kim sot
bin cho 2 bng ng nht nhau bin. C th thy c iu ny khi thay u=0 vo
trong phng trnh (*) trn.
Mt iu kin na l mi cp cnh ca khi a din m n gp nhau bin
phi tuyn tnh cng nhau.
6.2.6. Cc bng B-Spline
Cc hm B-Spline c th c s dng trong dng tch Tensor thay cho cc a thc
Bernstein t c tnh kim sot cao hn khi thit k mt cong. iu c ngha
ta s thay phng trnh (**) thnh:
P(u,v) =
i
M
=

0 k
L
=

0
P
i,k
.N
i,m
(u).N
k,m
(v)
Khi a din kim sot gm c (L+1).(M+1) im kim sot; u,v bin thin t 0 ti
gi tr nt ln nht trong cc vector nt tng ng ca chng.
Chng VI. Thit k ng cong v mt cong Bezier v B-Spline

82
i vi cc bng B-Spline, ngi ta vn dng cc B-Spline bc 4. Do vic chn s
im kim sot l khng gii hn nn c th to ra nhiu dng mt cong rt phc tp.
Tt nhin khi thit k, ta phi chn khi a din nt to ra mt c dng mong
mun.
CHNG VII
KH NG V MT KHUT

7.1. CC KHI NIM
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 5, 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 7.1.
- Danh sch cc nh: 1,2,3,4,5,6
- Danh sch cc mt c xc nh theo bng sau:
Mt nh
1
2
3
4
5
6
Mt 3
Mt 1
Mt 4
Mt 5
Mt 2
Hnh 7.1
Chng VII. Kh ng v mt khut


84
1
2
3
4
5
1,2,3
4,5,6
1,3,6,4
3,2,5,6
1,2,5,4

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:
Type Point3D = Record {im 3 chiu}
x,y,z:real;
end;
Vector3D = Record {Vector 3 chiu. Mc d n ging vi
x,y,z:real; Point3D song ta vn khai cc thut ton
end; c tng minh}
RGBColor = Record {Cu trc mu sc ca mt mt}
B,G,R:Byte;
end;
KieuMat = Record
PhapVT:Vector3D; {Php vector ca mt}
Sodinh:cardinal; {S nh ca mt}
List:array of integer;{Danh sch th t cc nh to
nn mt. y ta dng mng ng}
Color:RGBColor; {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}
Chng VII. Kh ng v mt khut


85
Xworld,Yworld,Zworld,Zoom:Real; {To v kch
thc tht ca vt trong h to th gii}
end;
Khi ci t cho mt ng dng 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.
7.2. CC PHNG PHP KH MT KHUT
7.2.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 3D c ti ba 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. 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.
Chng VII. Kh ng v mt khut


86
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 (hnh 7.2):
Khi hai mt ct nhau th thut gii ny ch th hin nh chng chng ln nhau.
Hnh 7.2
Khi hai mt trong cng mt khong khng gian v su v hnh chiu ca
chng ln mt phng chiu chng ln nhau (hay chng mt phn ln nhau). Chng
hn nh:
Mat nhn
Mat A
Mat B

Hnh 7.3
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 khc phc
c vn ny khng? Cu tr li d nhin l c nhng cng ng 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
Hnh nh tht Khi v bng gii thut trn
Chng VII. Kh ng v mt khut


87
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. Cc nh ny u nm v
cng mt pha ca a gic A theo chiu trc Z khng? Nu ng th kt qu
trt t trn l ng. Ngc li, c th xy ra mt trong hai tnh hung nh
hnh (7.2) hoc hnh (7.3), 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
Chng VII. Kh ng v mt khut


88
ng, chng ta cn phi hon i li trt t. Ngc li th r rng hai a gic
ang ct nhau (nh hnh 7.2) hoc cho vo nhau (hnh 7.4), 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 7.4
7.2.2. Gii thut BackFace
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 90
o
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
90
o
. Vy thut ton xt mt mt b khut hay khng ch n gin l:
If V.N >= 0 then Mt thy
Else Mt khng thy (mt khut);





V <90
o
nn mt
quan st c

Mt nhn
Vector hng nhn
Hnh 7.5
Chng VII. Kh ng v mt khut


89

Hnh 7.6
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}
Chng VII. Kh ng v mt khut


90
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;
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.
7.2.3. Gii thut vng m su (Z-Buffer)
Bng cch tnh gi tr su (l gi tr 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.
Chng VII. Kh ng v mt khut


91
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 (2
32
) 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 vng mc:
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:
Chng VII. Kh ng v mt khut


92
Gi G l mt mt a gic c biu din bi tp cc im P
1
, P
2
, P
n

v G l hnh chiu ca G xung mt phng chiu vi tp cc nh
P
1
,P
2
, P
n
.
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 nu 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 (2.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 P
1
s cha thm gi tr
z(P
1
), P
2
s cha thm gi tr z(P
2
), hay mt cch tng qut P
i
s cha
thm gi tr z(P
i
) 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. C ngha l cho mt dng qut chy ngang qua
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 {x
m
} l tp cc giao im,
mt iu cn ch l ta cn tnh su cho cc giao im ny. Gi s x
i

l giao im ca ng qut vi cnh P
i
P
j
th th ta c th tnh ra
su ca x
i
thng qua cng thc (2.3.1) nh sau:
Chng VII. Kh ng v mt khut


93
Nu gi y
scan
l gi tr tung ca dng qut th th:
z(x
i
) = z(P
i
)+z(P
j
)*[(y
scan
y(P
i
))/(y(P
j
)-y(P
i
))] (2.3.2)
{trong y(P) l thnh phn to y ca im P}
R rng qua cng thc trn ta thy, nu x
i
l trung im ca P
i
P
j
th
z(x
i
) = z(P
i
)+z(P
j
)*1/2
Ci t minh ho cho gii thut 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}
Type 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 (2
32
) 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}
CanhCat_Z=record {Cu trc ca cc cnh a gic c xy dng
nhm phc v cho qu trnh tnh giao im}
y1,y2:Integer; {Tung bt u v kt thc ca mt cnh
(y1<=y2)}
Chng VII. Kh ng v mt khut


94
xGiao:real; {honh xut pht ca cnh. Song trong qu trnh
tnh ton n s l tung giao im ca cnh vi
ng qut ngang}
xStep:real; {Gi tr thay i ca x khi y thay i 1 n v, n cho
bit dc ca cnh}
zGiao:real; {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}
zStep:real; {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}

Procedure DrawObj(Obj:Obj3D; Zmin,ZMax:Real;
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
Chng VII. Kh ng v mt khut


95
gic sang on 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
+ 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}
For i:=0 to Obj.Mat[K].Sodinh -1 do
{Duyt qua tt c cc nh 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 mt
phng OXY ta c ta nh l (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;
Chng VII. Kh ng v mt khut


96
Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy;
Poly[i].Z:=((Obj.dinh[P].z-ZMin)/(ZMax-Zmin)
*4294967294); //MaxCardinal=4294967295
{Gi tr su ca nh Poly[i] l gi tr Obj.dinh[P].z song c
nh x vo on 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;
Procedure FillPolygon3D(Poly:Polygon_Z;Color:TColor;
Z_Buffer:Z_BufferType;Canvas: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
Chng VII. Kh ng v mt khut


97
{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}
D[dem].xGiao:=Poly[d1].x;
{Tung xut pht. Khi u th (D[dem].y1,D[dem].xGiao) chnh l to
ca im u ca cnh}
D[dem].zGiao:=Poly[d1].z;
{ su ca giao im ti im im u ca cnh}
Dy:=(Poly[d2].y-Poly[d1].y);
Chng VII. Kh ng v mt khut


98
{ chnh lch tung ca im 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
If (D[i].y1<=y)and(y<=D[i].y2) then
{C giao im vi ng qut y}
Begin
Chng VII. Kh ng v mt khut


99
{Lu li to giao im v su}
G[NG].x:=round(D[i].xGiao);
G[NG].y:=y;
G[NG].z:=D[i].zGiao;
G[NG].ChiSoCanh:=i;
{Ch s cnh to ra giao im. Nhm phc v cho qu trnh lc
b cc giao im khng cn thit}
{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}
Chng VII. Kh ng v mt khut


100
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 x
1
x
2
, x
3
x
4
,}
Var i,x,K:integer;Dz:real;
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
Chng VII. Kh ng v mt khut


101
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
L:=low(Poly);
H:=High(Poly);
{Xc nh gii hn trn v gii hn di ca Poly}
Z_BufferW:=high(Z_Buffer); {Xc nh cc chiu ca ma trn Z_Buffer}
Z_BufferH:=high(Z_Buffer[0]);
{Z_BufferW+1:Chiu rng (t 0..Z_BufferW)
Z_BufferH+1:Chiu cao (t 0..Z_BufferH)}
Chng VII. Kh ng v mt khut


102
{ 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;
Chng VII. Kh ng v mt khut


103
BI TP
1. Ci t cho thut gii Depth-Sorting
Ci t chng trnh cho php biu din v quan st vt th 3D 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 th 3D 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 th 3D 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.


CHNG VIII
TO BNG VT TH 3D

8.1. 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.
8.2. 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.

nh sng ti

nh sng phn
x
nh sng phn x
nh sng ti

Vector php tuyn ca mt
Hnh 8.1. S phn x ca nh sng
Chng VIII. To bng vt th 3D


105
8.3. 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 8.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 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.

Trong hnh 8.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 II.2 (a)), nu gc ny ln th cng phn x rt thp (hnh II.2 (b)). y
ta ch quan tm n thnh phn nh sng khuych tn v tm b qua hin tng phn
nh sng phn
x
nh sng ti
Vector php tuyn ca mt
Hnh 8.2. S phn x khng ton phn ca nh sng
nh sng phn x

nh sng ti
Vector php tuyn ca mt
(a) (b)
Chng VIII. To bng vt th 3D


106
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:

n a
n a
Cos
.
.
) ( = (8.1)
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 Cos() c gi tr t +1 n -1 nn ta c th suy ra cng thc tnh cng ca
nh sng phn x l:
Cng nh sng phn x = Cng ca nh sng nh hng * [(Cos()+1)/2] (8.2)
Trong [(Cos()+1)/2] c gi tr trong khong t 0 n 1. Vy qua cng thc (8.1) v
(8.2) 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.
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|}
Chng VIII. To bng vt th 3D


107
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)
+ V: Vector hng nhn. Nu Obj c chuyn sang h to quan st OUVN
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 cc ngun 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
Chng VIII. To bng vt th 3D


108
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
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}
CuongDoSang:=AnhSangNen + AnhSangDinhHuong *
Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang,Obj.Mat[K].PhapVT);
Chng VIII. To bng vt th 3D


109
{ 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,Ob
j.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;
8.4. 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 to 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 (x
0
, y
0
, z
0
) v ngun sng
im c ta l (plx, ply, plz) th nh sng s ri n im ang st theo vector (x
0
-
plx, y
0
-ply, z
0
-plz), hay tia ti:
a = (plx - x
0
, ply - y
0
,plz - z
0
).
Chng VIII. To bng vt th 3D


110
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 (8.1) vi tt c cc im trn mt. Nn nh rng trong tnh
hng ngun sng im th chng ta buc lng phi tnh Cos() thng qua cng thc
(8.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).
8.5. 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 x 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 xp x 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 8.3). 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.
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 khng c 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.
Chng VIII. To bng vt th 3D


111

200 mt 450 mt 16200 mt
Hnh 8.3
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.

T bng thng T bng theo Gouraud
Hnh 8.4
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 tnh c
cng sng ca im. Nh th, cc im trn cng mt mt ca a gic s c cng
sng khc nhau v cho ta cm gic mt a gic khng phi l mt phng m l mt
cong.
Chng VIII. To bng vt th 3D


112
Hnh 8.5
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.
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.
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, song 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 {1 nh ca a gic chiu (l nh ca mt
a gic xung mt phng OXY}
N:Vector3D; {Php vector ti 1 nh ca a gic}
x,y:Integer; {To ca nh}
end;
Vector trung bnh cng bng trung
bnh cng ca cc vector php
tuyn ln cn
Chng VIII. To bng vt th 3D


113
PolygonGourand =array of NutPolyGourand;
{mng ng dng cha cc nh ca a gic chiu}
CanhCat=record {Mt cnh ca a gic c to ra nhm phc v cho
qu trnh tnh giao im nhanh}
y1,y2:Integer;
xGiao:real;
XStep:real;
NGiao:Vector3D; {Php vector ti nh, song n s c cha php
vector tai giao im vi ng qut}
NStep:Vector3D; { 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:integer;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;
DinhLinkMat:array of Record {Cha Danh sch cc mt c lin kt
n mt inh}
SoMat:Integer;
Chng VIII. To bng vt th 3D


114
A:array of integer;
end;
CMLD:array of integer; {S mt c lin kt vi nh th i}
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}
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;
Chng VIII. To bng vt th 3D


115
Setlength(CMLD,0);
For k:=0 to Obj.SoMat-1 do
if Tich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0 then
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,CanVas,Obj.Mat[K].Color);
{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);
Chng VIII. To bng vt th 3D


116
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;
Chng VIII. To bng vt th 3D


117
end;
Dem:=0;
For i:=L to Cuoi do
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;
Chng VIII. To bng vt th 3D


118
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;
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
Chng VIII. To bng vt th 3D


119
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
Chng VIII. To bng vt th 3D


120
else
begin
Dx:=0;Dy:=0;Dz:=0;
end;
For x:=G[i].x to G[i+1].x do
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 ng 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
Chng VIII. To bng vt th 3D


121
begin
TaoDanhSachGiaoDiem;
SapXepVaLoc;
ToMauCacDoan;
end;
Setlength(D,0);
Setlength(G,0);
end;
BI TP
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.
Nng cao: Cho thp thay i cng ca cc ngun sng, cng nh thay i
hng chiu ca ngun sng nh hng.
2. Hy xy dng chng trnh vi cc chc nng nh Bi 1 song s dng phng php
t bng Gouraud.
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.
PH LC
MT S CHNG TRNH MINH HA


I. CC THUT TON T MU
1. Thut ton t mu theo lot
Type Toado=record
x,y:integer;
end;
mang=array[1..20] of Toado;

var minx,miny,maxx,maxy,n,mau1,mau2:integer;
a:mang;

Procedure NhapDuLieu(var a:Mang; var n:Byte);
var i:Byte;
Begin
write('nhap vao so dinh : ');readln(n);
for i:=1 to n do
begin
write('x',i,' = ');readln(a[i].x);
write('y',i,' = ');readln(a[i].y);
end;
write('mau vien da giac: '); readln(mau1);
write('mau to da giac: '); readln(mau2);
End;

Procedure vedagiac(P:mang;sodinh:byte);
var i,j:byte;
Begin
setcolor(mau1);
for i:=1 to sodinh do
begin
if i=n then j:=1 else j:=i+1;
line(P[i].x,P[i].y,P[j].x,p[j].y);
end;
End;

Function min(c,d:integer):integer;
begin
if c<d then min:=c else min:=d
end;

Function max(g,h:integer):integer;
begin
if g<h then max:=h else max:=g
end;

Procedure Tomau(P:mang; n:Byte);
Ph lc. Mt s chng trnh minh ha


123
var j,i,k,m,truoc,sau,tg:integer;
r:real;
z:array[1..15] of integer;
Begin
for i:=minx+1 to maxx-1 do
begin
m:=0;
for j:=1 to n do
begin
truoc:=j+1;
if j=n then truoc:=1;
sau:=j-1;
if j=1 then sau:=n;
if i=P[j].x then
begin
if (i>min(P[sau].x,P[truoc].x))and
(i<max(P[sau].x,P[truoc].x)) then
begin
inc(m);
z[m]:=P[j].y;
end
else
begin
inc(m);
z[m]:=P[j].y;
inc(m);
z[m]:=P[j].y;
end;
end;
if (i>min(P[j].x,P[truoc].x))and
(i<max(P[truoc].x,P[j].x)) then
begin
inc(m);
r:=(P[truoc].y-P[j].y)/(P[truoc].x-P[j].x);
z[m]:=P[j].y+trunc(r*(i-P[j].x));
end;
end;

for j:=1 to m-1 do
for k:=j+1 to m do
if z[j]>z[k] then
begin
tg:=z[j];z[j]:=z[k];z[k]:=tg;
end;

setcolor(mau2);
For k:=1 to m-1 do
if k mod 2<>0 then line(i,z[k],i,z[k+1]);
end;
Ph lc. Mt s chng trnh minh ha


124
End;

Procedure ThietLapDoHoa;
var Gd,Gm:Integer;
Begin
Gd:=0;
InitGraph(Gd,Gm,C:\BP\BGI);
End;

Begin
CLRSCR;
NhapDuLieu(a,n);
minx:=a[1].x;
maxx:=minx;
miny:=a[1].y;
maxy:=miny;
for i:=1 to n do
begin
if minx>a[i].x then minx:=a[i].x;
if miny>a[i].y then miny:=a[i].y;
if maxx<a[i].x then maxx:=a[i].x;
if maxy<a[i].x then maxy:=a[i].y;
end;
ThietLapDoHoa;
vedagiac(a,n);
Tomau(a,n);
readln;
closegraph;
end.
2. Thut ton t loang ( qui)

uses crt, graph;
Type ToaDo=record
x,y:integer;
End;
Mang=array[0..30] of ToaDo;
Var a:Mang;
x,y,n,Gd,Gm:Integer;

procedure NhapDaGiac(Var n:integer);
var i:integer;
begin
clrscr;
write('Nhap vao so dinh cua mot da giac n= ');
readln(n);
for i:=1 to n do
begin
writeln('Toa do dinh thu',i,'la:');
write('a[',i,'].x=');
readln(a[i].x);
Ph lc. Mt s chng trnh minh ha


125
write('a[',i,'].y=');
readln(a[i].y);
end;
Write('Nhap x= '); Readln(x);
Write('Nhap y= '); Readln(y);
end;

Procedure VeDaGiac(n,color:integer);
var i,j:byte;
begin
SetColor(Color);
for i:=1 to n do
begin
if i=n then j:=1 else j:=i+1;
line(a[i].x,a[i].y,a[j].x,a[j].y);
end;
end;

Function Max(a,b:integer):integer;
Begin
if a<b then Max:=b else Max:=a;
End;

Function Min(a,b:integer):integer;
Begin
if a<b then Min:=a else Min:=b;
End;

Function KiemTra(x,y:Integer;a:Mang):Boolean;
var dem,i,j,s:Integer;
Begin
dem:=0;
for i:=1 to n do { Tim so giao diem }
begin
if i=n then j:=1 else j:=i+1;
if i=1 then s:=n else s:=i-1;
if x=a[i].x then
begin
if y<a[i].y then
if (x<=Min(a[s].x ,a[j].x)) OR
(x>=Max(a[s].x,a[j].x)) then dem:=dem+2
else dem:=dem+1;
end
else
if (x>Min(a[i].x,a[j].x))and(x<Max(a[j].x,a[i].x))
then
if y<=Min(a[i].y,a[j].y) then dem:=dem+1
else if y <= (x-a[j].x)*(a[i].y-a[j].y)/(a[i].x-
a[j].x)+a[j].y then dem:=dem+1;
end;
if dem mod 2=1 then KiemTra:=True else KiemTra:=False;
Ph lc. Mt s chng trnh minh ha


126
End;

Procedure ToLoang(x,y:Integer;color:Byte);
Begin
if KiemTra(x,y,a) and (GetPixel(x,y)<>color) then
Begin
PutPixel(x,y,color);
ToLoang(x+1,y,color);
ToLoang(x-1,y,color);
ToLoang(x,y+1,color);
ToLoang(x,y-1,color);
End;
End;

BEGIN
Nhapdagiac(n);
Gd:=Detect;
InitGraph(Gd,Gm,'D:\TP\BGI');
Vedagiac(n,4);
Toloang(x,y,14);
readln;
closegraph;
END.
3. Thut ton t loang (Kh qui)
Uses crt, graph;
Type ToaDo=record
x,y:integer;
End;
DANHSACH=^DS;
DS=Record
Data:ToaDo;
Next:DANHSACH;
End;
Mang=array[0..30] of ToaDo;
Var Stack:DanhSach;
a:Mang;
x,y,n,Gd,Gm:Integer;

Procedure KhoiTaoStack;
Begin
Stack:=Nil;
End;

Procedure PUSHStack(a:ToaDo;Var Stack:DanhSach);
{ Nhap vao dau danh sach }
Var p:DanhSach;
Begin
new(p);
p^.Data:=a; p^.next:=nil;
p^.next:=Stack;
Ph lc. Mt s chng trnh minh ha


127
Stack:=p;
End;

Procedure POPStack(Var Stack:DanhSach;var x,y:Integer);
{ Lay ra o dau danh sach }
Var p:DanhSach;
Begin
If Stack<>nil then
Begin
p:=Stack;
Stack:=Stack^.next;
x:=p^.Data.x;
y:=p^.Data.y;
Dispose(p);
End;
End;

procedure NhapDaGiac(Var n:integer;var a:Mang);
var i:integer;
begin
clrscr;
write('Nhap vao so dinh cua mot da giac n= ');
readln(n);
for i:=1 to n do
begin
writeln('Toa do dinh thu',i,'la:');
write('a[',i,'].x=');
readln(a[i].x);
write('a[',i,'].y=');
readln(a[i].y);
end;
Write('Nhap x= '); Readln(x);
Write('Nhap y= '); Readln(y);
end;

Procedure VeDaGiac(n,color:integer);
var i,j:byte;
begin
SetColor(Color);
for i:=1 to n do
begin
if i=n then j:=1 else j:=i+1;
line(a[i].x,a[i].y,a[j].x,a[j].y);
end;
end;

Function Max(a,b:integer):integer;
Begin
if a<b then Max:=b else Max:=a;
End;

Ph lc. Mt s chng trnh minh ha


128
Function Min(a,b:integer):integer;
Begin
if a<b then Min:=a else Min:=b;
End;

Function KiemTra(x,y:Integer;a:Mang):Boolean;
var dem,i,j,s:Integer;
Begin
dem:=0;
for i:=1 to n do { Tim so giao diem }
begin
if i=n then j:=1 else j:=i+1;
if i=1 then s:=n else s:=i-1;
if x=a[i].x then
begin
if y<a[i].y then
if (x<=Min(a[s].x ,a[j].x))OR
(x>=Max(a[s].x,a[j].x)) then dem:=dem+2
else dem:=dem+1;
end
else
if (x>Min(a[i].x,a[j].x)) and
(x<Max(a[j].x,a[i].x)) then
if y<=Min(a[i].y,a[j].y) then dem:=dem+1
else if y <= (x-a[j].x)*(a[i].y-a[j].y)/
(a[i].x-a[j].x)+a[j].y then dem:=dem+1;
end;
KiemTra:=dem mod 2=1;
End;

Procedure ToLoang(x,y:Integer;color:Byte);
Var B,C:ToaDo;
Begin
if KiemTra(x,y,a) and (GetPixel(x,y)<>color) then
Begin
PutPixel(x,y,color);
B.x:=x+1; B.y:=y;
PUSHStack(B,Stack);
B.x:=x-1; B.y:=y;
PUSHStack(B,Stack);
B.x:=x; B.y:=y+1;
PUSHStack(B,Stack);
B.x:=x; B.y:=y-1;
PUSHStack(B,Stack);
End;

While Stack<>nil do
Begin
POPStack(Stack,B.x,B.y);
if KiemTra(B.x,B.y,a) and
Ph lc. Mt s chng trnh minh ha


129
GetPixel(B.x,B.y)<>color) then
Begin
PutPixel(B.x,B.y,color);
C.x:=B.x+1; C.y:=B.y;
if KiemTra(C.x,C.y,a) and
(GetPixel(C.x,C.y)<>color) then
PUSHStack(C,Stack);
C.x:=B.x-1; C.y:=B.y;
if KiemTra(C.x,C.y,a) and
(GetPixel(C.x,C.y)<>color) then
PUSHStack(C,Stack);
C.x:=B.x; C.y:=B.y+1;
if KiemTra(C.x,C.y,a) and
(GetPixel(C.x,C.y)<>color) then
PUSHStack(C,Stack);
C.x:=B.x; C.y:=B.y-1;
if KiemTra(C.x,C.y,a) and
(GetPixel(C.x,C.y)<>color) then
PUSHStack(C,Stack);
End;
End;
End;

BEGIN
KhoiTaoStack;
Nhapdagiac(n,a);
Gd:=Detect;
InitGraph(Gd,Gm,'D:\TP\BGI');
Vedagiac(n,4);
Toloang(x,y,14);
readln;
closegraph;
END.
II. CC THUT TON XN HNH
1. Thut ton Cohen Sutherland
Uses crt,graph;
Const LEFT=1;
RIGHT=2;
BELOW=4;
ABOVE=8;

Type ToaDo2D=record
x,y:integer;
end;

var Tren,Duoi,A,B:ToaDo2D;
gd,gm:Integer;
ch:char;
Ph lc. Mt s chng trnh minh ha


130

procedure NhapDinhHCN;
begin
Tren.x:=100;
Tren.y:=100;
Duoi.x:=450;
Duoi.y:=350;
randomize;
a.x:=random(GetMaxx);
a.y:=random(GetMaxY);
b.x:=random(GetMaxx);
b.y:=random(GetMaxY);
end;

PROCEDURE VeHCN;
begin
line(Tren.x,Tren.y,Duoi.x,Tren.y);
line(Duoi.x,Tren.y,Duoi.x,Duoi.y);
line(Duoi.x,Duoi.y,Tren.x,Duoi.y);
line(Tren.x,Duoi.y,Tren.x,Tren.y);
setwritemode(xorput);
line(a.x,a.y,b.x,b.y);
ch:=readkey;
line(a.x,a.y,b.x,b.y);
setwritemode(orput);
end;

FUNCTION MA(P:ToaDo2D):Byte;
var s:Byte;
BEGIN
s:=0;
if P.x<Tren.x then s:=s OR Left;
if P.x>Duoi.x then s:=s OR Right;
if P.y<Tren.y then s:=s OR Above;
if P.y>Duoi.y then s:=s OR Below;
Ma:=s;
end;

Procedure Swap(Var A,B:ToaDo2D);
var t:ToaDo2D;
Begin
t:=a; a:=b; b:=t;
End;

Procedure Clipping(A,B,Tren,Duoi:ToaDo2D);
Var stop,draw:Boolean;
m:Real;
Begin
stop:=False; draw:=False;
While not stop do
Begin
Ph lc. Mt s chng trnh minh ha


131
If (Ma(A)=0)and(Ma(B)=0) then
Begin
stop:=True; draw:=True;
End
else
If (Ma(A) and Ma(B)<>0) then stop:=True
else
Begin
If (Ma(A)and Ma(B)=0)and
(Ma(A)<>0)or(Ma(B)<>0)) then
Begin
if Ma(A)=0 then Swap(A,B); {A luon nam ngoai}
if A.x=B.x then
Begin
if Ma(A) and ABOVE<>0 then A.y:=Tren.y
else A.y:=Duoi.y;
if Ma(B)<>0 then
Begin
if Ma(B) and ABOVE<>0 then B.y:=Tren.y;
if Ma(B) and BELOW<>0 then B.y:=Duoi.y;
End;
stop:=True; draw:=True;
End
else {Ax<>Bx}
Begin
m:=(B.y-A.y)/(B.x-A.x);
If Ma(A) and LEFT<>0 then
Begin
A.y:=round((Tren.x - A.x)*m + A.y);
A.x:=Tren.x;
End
else
If Ma(A) and RIGHT<>0 then
Begin
A.y:=round((Duoi.x - A.x)*m + A.y);
A.x:=Duoi.x;
End
else
If Ma(A) and ABOVE<>0 then
Begin
A.x:=round((Tren.y - A.y)/m + A.x);
A.y:=Tren.y;
End
else
If Ma(A) and BELOW<>0 then
Begin
A.x:=round((Duoi.y - A.y)/m +A.x);
A.y:=Duoi.y;
Ph lc. Mt s chng trnh minh ha


132
End;
End;
End;
End;
End;
setcolor(14);
If draw then Line(A.x,A.y,B.x,B.y);
setcolor(15);
End;

BEGIN
gd:=detect; Initgraph(gd,gm,'D:\TP\BGI');
repeat
NhapDinhHCN;
VeHCN;
Clipping(A,B,Tren,Duoi);
until ch=#27;
closegraph;
END.
2. Thut ton chia nh phn
Uses crt,graph;

type ToaDo2D=record
x,y:integer;
end;

var Tren,Duoi,A,B:ToaDo2D;
gd,gm:Integer;

procedure NhapDinhHCN;
begin
Tren.x:=100;
Tren.y:=100;
Duoi.x:=300;
Duoi.y:=200;
a.x:=352;
a.y:=122;
b.x:=22;
b.y:=23;
end;

PROCEDURE VeHCN;
begin
line(Tren.x,Tren.y,Duoi.x,Tren.y);
line(Duoi.x,Tren.y,Duoi.x,Duoi.y);
line(Duoi.x,Duoi.y,Tren.x,Duoi.y);
line(Tren.x,Duoi.y,Tren.x,Tren.y);
setwritemode(xorput);
line(a.x,a.y,b.x,b.y);
readln;
Ph lc. Mt s chng trnh minh ha


133
line(a.x,a.y,b.x,b.y);
end;

FUNCTION MA(P:ToaDo2D):Byte;
var s:Byte;
BEGIN
s:=0;
if P.x<Tren.x then s:=s OR Left;
if P.x>Duoi.x then s:=s OR Right;
if P.y<Tren.y then s:=s OR Above;
if P.y>Duoi.y then s:=s OR Below;
Ma:=s;
end;

PROCEDURE XuLyATrongBNgoai(A,B:ToaDo2D);
Var C,D,M:ToaDo2D;
begin
c:=a;d:=b;
While abs(C.x-D.x)+abs(C.y-D.y)>2 do
begin
M.x:=round((C.x+D.x)/2);
M.y:=round((C.y+D.y)/2);
if ma(M)<>0 then D:=M else C:=M;
end;
line(A.x,A.y,C.x,C.y);
end;

PROCEDURE Clipping(A,B,Tren,Duoi:ToaDo2D);
Var C,D,M:ToaDo2D;
Begin
if (ma(a)=0) and (ma(b)=0) then line(a.x,a.y,b.x,b.y);
if (ma(a)=0) and (ma(b)<>0) then XulyATrongBNgoai(A,B);
if (ma(a)<>0) and (ma(b)=0) then XulyATrongBNgoai(B,A);
if (ma(A)<>0) and (ma(B)<>0) and ((ma(A) and ma(B))=0)
then
begin
C:=A; D:=B;
M.x:=(C.x+D.x)div 2;
M.y:=(C.y+D.y)div 2;
while (ma(M)<>0)and(abs(C.x-D.x)+abs(C.y-D.y)>2) do
begin
if (ma(C) and ma(M))<>0 then C:=M else D:=M;
M.x:=(C.x+D.x)div 2;
M.y:=(C.y+D.y)div 2;
end;
if ma(M)=0 then
begin
XulyATrongBNgoai(M,A);
XulyATrongBNgoai(M,B);
end;
Ph lc. Mt s chng trnh minh ha


134
end;
End;

BEGIN
NhapDinhHCN;
gd:=detect; Initgraph(gd,gm,'D:\TP\BGI');
VeHCN;
Clipping(A,B,Tren,Duoi);
readln;
closegraph;
END.
3. Thut ton Liang-Barsky
Uses crt,graph;
var PTop,PBottom,A,B:PointType;
gd,gm:Integer;

procedure NhapDinhHCN;
var i:integer;
begin
writeln('Nhap toa do dinh tren trai cua HCN:');
write('x1=');readln(PTop.x);
write('y1=');readln(PTop.y);
writeln('Nhap toa do dinh duoi phai cua HCN:');
write('x2=');readln(PBottom.x);
write('y2=');readln(PBottom.y);

writeln('Nhap toa do dinh thu nhat cua duong thang:');
write('a.x=');readln(a.x);
write('a.y=');readln(a.y);
writeln('Nhap toa do dinh thu hai cua duong thang:');
write('b.x='); readln(b.x);
write('b.y='); readln(b.y);
end;

PROCEDURE VeHCN;
begin
line(PTop.x,PTop.y,PBottom.x,PTop.y);
line(PBottom.x,PTop.y,PBottom.x,PBottom.y);
line(PBottom.x,PBottom.y,PTop.x,PBottom.y);
line(PTop.x,PBottom.y,PTop.x,PTop.y);
setwritemode(xorput);
line(a.x,a.y,b.x,b.y);
readln;
line(a.x,a.y,b.x,b.y);
end;

Function Clip(p,q:real; Var u1,u2:real):Boolean;
Var r:real;
Begin
Clip:=True;
Ph lc. Mt s chng trnh minh ha


135
If p<0 then
Begin
r:=q/p;
If r>u2 then Clip:=False else If r>u1 then u1:=r;
End
else If p>0 then
Begin
r:=q/p;
If r<u1 then Clip:=False
else If r<u2 then u2:=r;
End
else If q<0 then Clip:=False;
End;

Procedure LiangBaskyClip(p1,p2,PTop,PBottom:PointType);
Var u1,u2,dx,dy:real;
Begin
u1:=0; u2:=1;
dx:=p2.x - p1.x;
If Clip(-dx,p1.x - PTop.x,u1,u2) then
If Clip(dx,PBottom.x - p1.x,u1,u2) then
Begin
dy:=P2.y - P1.y;
If Clip(-dy,p1.y - PTop.y,u1,u2) then
If Clip(dy,PBottom.y - p1.y,u1,u2) then
Begin
If u2<1 then
Begin
p2.x:=p1.x + Round(u2*dx);
p2.y:=p1.y + Round(u2*dy);
End;
If u1>0 then
Begin
p1.x:=p1.x + Round(u1*dx);
p1.y:=p1.y + Round(u1*dy);
End;
Line(p1.x,p1.y,p2.x,p2.y);
End;
End;
End;

BEGIN
clrscr;
NhapDinhHCN;
gd:=detect; Initgraph(gd,gm,'D:\TP\BGI');
VeHCN;
LiangBaskyClip(a,b,PTop,PBottom);
readln;
closegraph;
Ph lc. Mt s chng trnh minh ha


136
END.
III. V CC I TNG 3D
1. V mt yn nga
USES crt, graph, DOHOA3d ; {Su dung Unit DoHoa3D}
VAR u,uMin, uMax,du : real;
v,vMin, vMax, dv : real;
a1,a2,b1,b2,c1,c2,d : integer;

PROCEDURE Nhap_tham_so;
BEGIN
projection := Phoicanh;
rho := 50; de := 2000;
theta := 40; phi := 20;
uMin := -1; uMax := 1 ;
vMin := -1 ; vMax:= 1 ;
du := 0.095; dv := 0.09;
a1:= 0; a2:=0;
b1:= 0; b2:=0;
c1:= 0; c2:=0;
d := 1;
END;

FUNCTION fx(u,v:real): real;
BEGIN
fx:=a1*cos(u) + b1*cos(v) + c1*cos(u)*cos(v) + d*u;
END;

FUNCTION fy(u,v:real): real;
BEGIN
fy:=a1*cos(u) + b1*sin(v) + c2*cos(u)*sin(v) + d*v ;
END ;

FUNCTION fz(u,v:real): real;
BEGIN
fz := a2*sin(u) +b2*sin(v) + d*u*u - d*v*v ;
END ;

PROCEDURE ho_duong_cong_u ;
VAR P :ToaDo3D;
BEGIN
u := uMin; {Mat cat U ban dau}
WHILE u<=uMax DO
BEGIN
v :=vMin; {Mat cat V ban dau}
P.x :=fx(u,v);
P.y :=fy(u,v);
P.z :=fz(u,v);
DiDen(P); {Move to point (x,y,z) ban dau}
WHILE v <= vMax DO {Thay doi mat cat V}
Ph lc. Mt s chng trnh minh ha


137
BEGIN
P.x :=fx(u,v);
P.y :=fy(u,v);
P.z := fz(u,v);
VeDen(P); {Ve den diem (x,y,z) moi}
v := v+dv; {tang gia tri mat cat V}
END;
u:=u+du; {tang gia tri mat cat U}
END;
END;

PROCEDURE ho_duong_cong_v ;
VAR P :ToaDo3D;
BEGIN
v := vMin; {Mat cat V ban dau}
WHILE v<=vMax DO
BEGIN
u :=vMin; {Mat cat U ban dau}
P.x :=fx(u,v);
P.y :=fy(u,v);
P.z :=fz(u,v);
DiDen(P);
WHILE u <= uMax DO
BEGIN
P.x :=fx(u,v);
P.y :=fy(u,v);
P.z := fz(u,v);
VeDen(P);
u := u+du; {tang gia tri mat cat U}
END;
v :=v+dv; {tang gia tri mat cat V}
END; {of while v}
END;

PROCEDURE DEMO;
BEGIN
nhap_tham_so;
REPEAT
XoaManHinh;
KhoiTaoPhepChieu;
ho_duong_cong_u ;
ho_duong_cong_v ;
DieuKhienQuay;
UNTIL upcase(ch) = char(27);
END;

BEGIN { Main program }
ThietLapDoHoa;
demo;
CloseGraph;
Ph lc. Mt s chng trnh minh ha


138
END.
2. V cc i tng WireFrame
uses crt,Graph,DoHoa3D;
Const MaxDinh=50;
MaxCanh=100;

Type WireFrame=Record
SoDinh:0..MaxDinh;
Dinh:Array[1..MaxDinh] of ToaDo3D;
SoCanh:0..MaxCanh;
Canh:Array[1..MaxCanh,1..2] of 1..MaxDinh;
End;

Var a:WireFrame;

Procedure KhoiTaoBien;
Begin
Rho:=5; Theta:=20;
Phi:=20; De:=3;
End;

Procedure DocFile(FileName:String; Var WF:WireFrame);
var f:Text;
x,i:Integer;
Begin
assign(f,FileName);
Reset(f);
With WF do
Begin
read(f,x); SoDinh:=x;
read(f,x); SoCanh:=x;
For i:=1 to SoDinh do {Doc so dinh}
Begin
read(f,x); Dinh[i].x:=x;
read(f,x); Dinh[i].y:=x;
read(f,x); Dinh[i].z:=x;
End;
For i:=1 to SoCanh do {Doc so Canh}
Begin
read(f,x); Canh[i,1]:=x;
read(f,x); Canh[i,2]:=x;
End;
End;
Close(f);
End;

Procedure VeWireFrame(WF:WireFrame);
Var i:Byte;
d1,d2:ToaDo3D;
Begin
Ph lc. Mt s chng trnh minh ha


139
With WF do
Begin
for i:=1 to SoCanh do
Begin
d1:=Dinh[Canh[i,1]];
d2:=Dinh[Canh[i,2]];
DiDen(d1);
VeDen(d2);
End;
End;
End;

Begin
DocFile('bacdien.txt',a);
Projection:=SongSong{PhoiCanh};
ThietLapDoHoa;
KhoiTaoBien;
repeat
KhoiTaoPhepChieu;
VeWireFrame(a);
DieuKhienQuay;
until ch=#27;
CloseGraph;
End.
3. Kh mt khut theo gii thut BackFace
Uses crt,graph,DoHoa3D;
Const MaxSoDinh=50;
MaxSoMat =30;
MaxDinh =10;
Type TapDinh=Array[1..MaxSoDinh] of ToaDo3D;
TapMat=Array[1..MaxSoMat,0..MaxDinh] of Integer;
FaceModel=Record
SoDinh:Integer;
Dinh:TapDinh;
SoMat:Integer;
Mat:TapMat;
End;
Var Hinh:FaceModel;
O:ToaDo3D;

Procedure KhoiTao;
Begin
Projection:=Phoicanh;
Rho:=1500; Theta:=20;
Phi:=15; DE:=3000;
End;

Procedure VectorNhin(Dinh1,Dinh2,Dinh3:Integer;
Var v:toaDo3D);
Ph lc. Mt s chng trnh minh ha


140
Begin
With hinh do
Begin
v.x:=O.x - Dinh[Dinh1].x;
v.y:=O.y - Dinh[Dinh1].y;
v.z:=O.z - Dinh[Dinh1].z;
end;
End;

Procedure VectorChuan(Dinh1,Dinh2,Dinh3:Integer; Var
N:ToaDo3D);
Var P,Q:ToaDo3D;
Begin
With hinh do
Begin
P.x:=Dinh[Dinh2].x - Dinh[Dinh1].x;
P.y:=Dinh[Dinh2].y - Dinh[Dinh1].y;
P.z:=Dinh[Dinh2].z - Dinh[Dinh1].z;
Q.x:=Dinh[Dinh3].x - Dinh[Dinh1].x;
Q.y:=Dinh[Dinh3].y - Dinh[Dinh1].y;
Q.z:=Dinh[Dinh3].z - Dinh[Dinh1].z;
N.x:=P.y*Q.z - Q.y*P.z;
N.y:=P.z*Q.x - Q.z*P.x;
N.z:=P.x*Q.y - Q.x*P.y;
End;
End;

Function TichVoHuong(v,n:ToaDo3D):Real;
Begin
TichVoHuong:=v.x*N.x + v.y*N.y + v.z*N.z;
End;

Procedure ToaDoQuanSat;
Begin
KhoiTaoPhepChieu;
O.x:= Rho*Aux7;
O.y:= Rho*Aux8;
O.z:= Rho*Aux2;
End;

Procedure DocFile(FileName:String; Var WF:FaceModel);
var f:Text;
x,i,j:Integer;
Begin
assign(f,FileName);
Reset(f);
With WF do
Begin
read(f,x); SoDinh:=x;
read(f,x); SoMat:=x;
For i:=1 to SoDinh do {Doc so dinh}
Ph lc. Mt s chng trnh minh ha


141
Begin
read(f,x); Dinh[i].x:=x;
read(f,x); Dinh[i].y:=x;
read(f,x); Dinh[i].z:=x;
End;
For i:=1 to SoMat do {Doc so Mat}
Begin
read(f,x); read(f,x); Mat[i,0]:=x;
For j:=1 to Mat[i,0] do
Begin
read(f,x); Mat[i,j]:=x;
End;
End;
End;
Close(f);
End;

Procedure VeMat(f:Integer);
Var SoCanh,i,j:Integer;
P,P0:ToaDo3D;
Begin
With hinh do
Begin
SoCanh:=Mat[f,0];
For i:=1 to SoCanh do
Begin
j:=Mat[f,i];
P.x:=Dinh[j].x; P.y:=Dinh[j].y; P.z:=Dinh[j].z;
If i=1 Then
Begin
DiDen(P);
P0.x:=P.x; P0.y:=P.y; P0.z:=P.z;
End
Else VeDen(P);
End;
VeDen(P0);
End;
End;

Procedure VeVatThe(Hinh:FaceModel);
Var f,Dinh1,Dinh2,Dinh3:Integer;
v,n:ToaDo3D;
Begin
With hinh do
Begin
For f:=1 to SoMat do
Begin
Dinh1:=Mat[f,1]; Dinh2:=Mat[f,2]; Dinh3:=Mat[f,3];
VectorNhin(Dinh1,Dinh2,Dinh3,v);
Ph lc. Mt s chng trnh minh ha


142
VectorChuan(Dinh1,Dinh2,Dinh3,N);
If TichVoHuong(v,n)>0 Then
Begin
SetLineStyle(SolidLN,0,NormWidth);
VeMat(f);
End
Else Begin
SetLineStyle(DottedLN,0,NormWidth);
VeMat(f);
End;
End;
End;
End;

PROCEDURE DieuKhien;
BEGIN
ToaDoQuanSat;
VeVatThe(Hinh);
Repeat
DieuKhienQuay;
ToaDoQuanSat;
VeVatThe(Hinh);
Until ch=#27;
END;

BEGIN { Chuong Trinh Chinh }
DocFile('Batdien.txt',Hinh);
ThietLapDoHoa;
KhoiTao;
DieuKhien;
CloseGraph;
END.

You might also like