M CL C
Chương 1: CÁC Y U T CƠ S C A ð H A
1.1. T ng quan v ñ h a máy tính ............................................................................... 1
1.1.1. Gi i thi u v ñ h a máy tính ................................................................................ 1
1.1.2. Các k thu t ñ h a ................................................................................................ 1
1.1.2.1. K thu t ñ h a ñi m........................................................................................ 1
1.1.2.2. K thu t ñ h a vector...................................................................................... 2
1.1.3. ng d ng c a ñ h a máy tính............................................................................... 2
1.1.4. Các lĩnh v c c a ñ h a máy tính .......................................................................... 3
1.1.5. T ng quan v m t h ñ h a .................................................................................. 4
1.2. Màn hình ñ h a ...................................................................................................... 6
1.3. Các khái ni m........................................................................................................... 6
1.3.1. ði m..................................................................................................................... 6
1.3.2. Các bi u di n t a ñ ............................................................................................ 8
1.3.3. ðo n th ng........................................................................................................... 8
1.4. Các thu t toán v ño n th ng................................................................................. 8
1.4.1. Bài toán ................................................................................................................ 8
1.4.2. Thu t toán DDA................................................................................................... 9
1.4.3. Thu t toán Bresenham ....................................................................................... 10
1.4.4. Thu t toán MidPoint .......................................................................................... 12
1.5. Thu t toán v ñư ng tròn ..................................................................................... 14
1.5.1. Thu t toán Bresenham ....................................................................................... 14
1.5.2. Thu t toán MidPoint .......................................................................................... 16
1.6. Thu t toán v Ellipse............................................................................................. 17
1.6.1. Thu t toán Bresenham ....................................................................................... 17
1.6.2. Thu t toán MidPoint .......................................................................................... 20
1.7. Phương pháp v ñ th hàm s ............................................................................. 21
Bài t p ............................................................................................................................ 23
Chương 2: TÔ MÀU
2.1. Gi i thi u các h màu............................................................................................ 25
2.2. Các thu t toán tô màu .......................................................................................... 28
2.2.1. Bài toán .............................................................................................................. 28
2.2.2. Thu t toán xác ñ nh P ∈ S ................................................................................. 28
2.2.3. Thu t toán tô màu theo dòng quét ..................................................................... 30
2.2.4. Thu t toán tô màu theo v t d u loang................................................................ 30
Bài t p ............................................................................................................................ 31
Chương 3: XÉN HÌNH
3.1. ð t v n ñ ............................................................................................................... 32
3.2. Xén ño n th ng vào vùng hình ch nh t............................................................. 32
3.2.1. C nh c a hình ch nh t song song v i các tr c t a ñ ..................................... 32
3.2.1.1. Thu t toán Cohen – Sutherland ...................................................................... 33
3.2.1.2. Thu t toán chia nh phân................................................................................. 34
3.2.1.3. Thu t toán Liang – Barsky ............................................................................. 35
3.2.2. Khi c nh c a hình ch nh t t o v i tr c hoành m t góc α................................ 36
3.3. Xén ño n th ng vào hình tròn .............................................................................. 37
3.4. Xén ñư ng tròn vào hình ch nh t...................................................................... 38
3.5. Xén ña giác vào hình ch nh t ............................................................................. 39
Bài t p ............................................................................................................................ 40
Chương 4: CÁC PHÉP BI N ð I
4.1. Các phép bi n ñ i trong m t ph ng..................................................................... 41
4.1.1. Cơ s toán h c ................................................................................................... 41
4.1.2. Ví d minh h a .................................................................................................. 43
4.2. Các phép bi n ñ i trong không gian .................................................................... 45
4.2.1. Các h tr c t a ñ .............................................................................................. 45
4.2.2. Các công th c bi n ñ i ...................................................................................... 46
4.2.3. Ma tr n ngh ch ñ o ............................................................................................ 48
4.3. Các phép chi u c a v t th trong không gian lên m t ph ng ........................... 48
4.3.1. Phép chi u ph i c nh ......................................................................................... 48
4.3.2. Phép chi u song song......................................................................................... 50
4.4. Công th c c a các phép chi u lên màn hình....................................................... 50
4.5. Ph l c .................................................................................................................... 56
4.6. Ví d minh h a....................................................................................................... 59
Bài t p ............................................................................................................................ 61
Chương 5: BI U DI N CÁC ð I TƯ NG BA CHI U
5.1. Mô hình WireFrame.............................................................................................. 63
5.2. V mô hình WireFrame v i các phép chi u........................................................ 64
5.3. V các m t toán h c............................................................................................... 65
Bài t p ............................................................................................................................ 68
Chương 6: THI T K ðƯ NG VÀ M T CONG BEZIER VÀ B-SPLINE
6.1. ðư ng cong Bezier và m t Bezier ........................................................................ 69
6.1.1. Thu t toán Casteljau .......................................................................................... 70
6.1.2. D ng Bernstein c a ñư ng cong Bezier ............................................................ 70
6.1.3. D ng bi u di n ma tr n c a ñư ng Bezier ........................................................ 71
6.1.4. T o và v ñư ng cong Bezier ............................................................................ 72
6.1.5. Các tính ch t c a ñư ng Bezier ......................................................................... 74
6.1.6. ðánh giá các ñư ng cong Bezier ....................................................................... 76
6.2. ðư ng cong Spline và B-Spline ............................................................................ 77
6.2.1. ð nh nghĩa.......................................................................................................... 77
6.2.2. Các tính ch t h u ích trong vi c thi t k các ñư ng cong B-Spline ................. 78
6.2.3. Thi t k các m t Bezier và B-Spline ................................................................. 79
6.2.4. Các băng Bezier ................................................................................................. 80
6.2.5. Dán các băng Bezier v i nhau ........................................................................... 81
6.2.6. Các băng B-Spline ............................................................................................. 81
Chương 7: KH ðƯ NG VÀ M T KHU T
7.1. Các khái ni m......................................................................................................... 83
7.2. Các phương pháp kh m t khu t ........................................................................ 85
7.2.1. Gi i thu t s p x p theo chi u sâu ...................................................................... 85
7.2.2. Gi i thu t BackFace........................................................................................... 88
7.2.3. Gi i thu t vùng ñ m ñ sâu ............................................................................... 90
Bài t p .......................................................................................................................... 103
Chương 8: T O BÓNG V T TH 3D
8.1. Khái ni m ............................................................................................................. 104
8.2. Ngu n sáng xung quanh...................................................................................... 104
8.3. Ngu n sáng ñ nh hư ng ...................................................................................... 105
8.4. Ngu n sáng ñi m.................................................................................................. 109
8.5. Mô hình bóng Gouraud....................................................................................... 110
Bài t p .......................................................................................................................... 121
Ph l c: M T S CHƯƠNG TRÌNH MINH H A
I. Các thu t toán tô màu ............................................................................................ 122
II. Các thu t toán xén hình ........................................................................................ 129
III. V các ñ i tư ng 3D............................................................................................. 136
Tài li u tham kh o...................................................................................................... 143
L IM

ð U

ð h a là m t trong nh ng lĩnh v c phát tri n r t nhanh c a ngành Công ngh
thông tin. Nó ñư c ng d ng r ng rãi trong nhi u lĩnh v c khoa h c và công ngh .
Ch ng h n như y h c, ki n trúc, gi i trí... ð h a máy tính ñã giúp chúng ta thay ñ i
cách c m nh n và s d ng máy tính, nó ñã tr thành nh ng công c tr c quan quan
tr ng không th thi u trong ñ i s ng h ng ngày. Vì v y môn “ð h a” ñã tr thành
m t trong nh ng môn h c chính trong các chuyên ngành Công ngh thông tin các
trư ng ñ i h c.
Cu n sách “Giáo trình lý thuy t ñ h a” ñư c biên so n theo sát n i dung
chương trình ñào t o c nhân Công ngh thông tin. N i dung c a giáo trình này
cung c p m t s ki n th c cơ b n v lý thuy t và thu t toán xây d ng các công c
ñ h a 2D và 3D. T ñó giúp sinh viên có th ñ c l p xây d ng nh ng thư vi n ñ
h a cho riêng mình và phát tri n các ph n m m ng d ng ñ h a cao hơn.
Giáo trình ñư c chia làm 8 chương và ph n ph l c, sau m i chương ñ u có
ph n bài t p ñ ki m tra ki n th c và rèn luy n kh năng l p trình cho b n ñ c. ð
thu n ti n cho vi c trình bày thu t toán m t cách d hi u, các gi i thu t trong giáo
trình ñư c vi t trên ngôn ng “t a Pascal” và các mã ngu n ñư c cài ñ t trên Turbo
Pascal 7.0. Nh m giúp b n ñ c b t lúng túng trong quá trình cài ñ t các gi i thu t,
ph n ph l c li t kê m t s mã ngu n cài ñ t các thu t toán trong các chương. Tuy
nhiên, b n ñ c nên t cài ñ t các thu t toán ph n lý thuy t, n u c m th y khó
khăn l m m i nên tham kh o ph n ph l c này.
Chương 1, 2 và 3 trình bày v các y u t cơ s c a ñ h a như: màn hình ñ
h a, ñi m, ño n th ng, ñư ng tròn, các h màu và các thu t toán tô màu, xén hình ...
Chương 4 trang b các ki n th c toán h c v các phép bi n ñ i trong không gian 2D
và 3D. Chương 5, 6 và 7 gi i thi u các mô hình ñ h a 3D, các gi i thu t kh m t
khu t và t o bóng cho v t th ... Chương 8 trình bày v phương pháp thi t k các
ñư ng cong Bezier và B-Spline.
M c dù ñã r t c g ng trong quá trình biên so n nhưng ch c ch n giáo trình
này v n không th tránh kh i nh ng thi u sót. Chúng tôi r t mong nh n ñư c nh ng
ý ki n ñóng góp c a b n ñ c cũng như các b n ñ ng nghi p trong lĩnh v c ð h a
ñ giáo trình ngày càng ñư c hoàn thi n hơn trong l n tái b n sau. ð a ch liên l c:
Khoa Công ngh Thông tin, trư ng ð i h c Khoa h c Hu .
ði n tho i: 054.826767. Email: paphuong@hueuni.edu.vn
nhtai@hueuni.edu.vn

Hu , tháng 08 năn 2003
Các tác gi
Updatesofts.com

Ebooks Team

CHƯƠNG I

CÁC Y U T
1.1. T NG QUAN V ð

CƠ S

C Að

H A

H A MÁY TÍNH

ð h a máy tính là m t lãnh v c phát tri n nhanh nh t trong Tin h c. Nó ñư c áp
d ng r ng rãi trong nhi u lãnh v c khác nhau thu c v khoa h c, k ngh , y khoa,
ki n trúc và gi i trí.
Thu t ng ñ h a máy tính (Computer Graphics) ñư c ñ xu t b i nhà khoa h c
ngư i M tên là William Fetter vào năm 1960 khi ông ñang nghiên c u xây d ng mô
hình bu ng lái máy bay cho hãng Boeing.
Các chương trình ñ h a ng d ng cho phép chúng ta làm vi c v i máy tính m t
cách tho i mái, t nhiên.
1.1.1 Gi i thi u v ñ h a máy tính
ð h a máy tính là m t ngành khoa h c Tin h c chuyên nghiên c u v các
phương pháp và k thu t ñ có th mô t và thao tác trên các ñ i tư ng c a th gi i
th c b ng máy tính.
V b n ch t: ñó là m t quá trình xây d ng và phát tri n các công c trên c hai
lĩnh v c ph n c ng và ph n m m h tr cho các l p trình viên thi t k các chương
trình có kh năng ñ h a cao.
V i vi c mô t d li u thông qua các hình nh và màu s c ña d ng c a nó, các
chương trình ñ h a thư ng thu hút ngư i s d ng b i tính thân thi n, d dùng,... kích
thích kh năng sáng t o và nâng cao năng su t làm vi c.
1.1.2. CÁC K THU T ð

H A

D a vào các phương pháp x lý d li u trong h th ng, ta phân ra làm hai k thu t
ñ h a:
1.1.2.1. K thu t ñ h a ñi m
Chương I. Các y u t cơ s c a ñ h a
Nguyên lý c a k thu t này như sau: các hình nh ñư c hi n th thông qua t ng
pixel (t ng m u r i r c). V i k thu t này, chúng ta có th t o ra, xóa ho c thay ñ i
thu c tính c a t ng pixel c a các ñ i tư ng. Các hình nh ñư c hi n th như m t lư i
ñi m r i r c (grid), t ng ñi m ñ u có v trí xác ñ nh ñư c hi n th v i m t giá tr
nguyên bi u th màu s c ho c d sáng c a ñi m ñó. T p h p t t c các pixel c a grid
t o nên hình nh c a ñ i tư ng mà ta mu n bi u di n.
1.1.2.2. K thu t ñ h a vector
Nguyên lý c a k thu t này là xây d ng mô hình hình h c (geometrical model) cho
hình nh ñ i tư ng, xác ñ nh các thu c tính c a mô hình hình h c, sau ñó d a trên mô
hình này ñ th c hi n quá trình tô trát (rendering) ñ hi n th t ng ñi m c a mô hình,
hình nh c a ñ i tư ng.
k thu t này, chúng ta ch lưu tr mô hình toán h c c a các thành ph n trong mô
hình hình h c cùng v i các thu c tính tương ng mà không c n lưu l i toàn b t t c
các pixel c a hình nh ñ i tư ng.
1.1.3.

ng d ng c a ñ h a máy tính hi n nay
Ngày nay, ñ h a máy tính ñư c s d ng r ng rãi trong nhi u lĩnh v c khác

nhau như: Công nghi p, thương m i, qu n lý, giáo d c, gi i trí,... Sau ñây là m t s
ng d ng tiêu bi u:
1.1.3.1. T o giao di n (User Interfaces): như các chương trình ng d ng WINDOWS,
WINWORD, EXCEL ... ñang ñư c ña s ngư i s d ng ưa chu ng nh tính thân
thi n, d s d ng.
1.1.3.2. T o ra các bi u ñ dùng trong thương m i, khoa h c và k thu t: Các bi u
ñ ñư c t o ra r t ña d ng, phong phú bao g m c hai chi u l n ba chi u góp ph n
thúc ñ y xu hư ng phát tri n các mô hình d li u h tr ñ c l c cho vi c phân tích
thông tin và tr giúp ra quy t ñ nh.
1.1.3.3. T ñ ng hóa văn phòng và ch b n ñi n t : dùng nh ng ng d ng c a ñ
h a ñ in n các tài li u v i nhi u lo i d li u khác nhau như: văn b n, bi u ñ , ñ th
và nhi u lo i hình nh khác ...
1.1.3.4. Thi t k v i s tr giúp c a máy tính (Computer aided design): M t trong
nh ng l i ích l n nh t c a máy tính là tr giúp con ngư i trong vi c thi t k . Các ng
2
Chương I. Các y u t cơ s c a ñ h a
d ng ñ h a cho phép chúng ta thi t k các thi t b cơ khí, ñi n, ñi n t , ô tô, máy bay,
... như ph n m m AUTOCAD ...
1.1.3.5. Lĩnh v c gi i trí, ngh thu t: cho phép các h a sĩ t o ra các hình nh ngay
trên màn hình c a máy tính. Ngư i h a sĩ có th t pha màu, tr n màu, th c hi n m t
s thao tác: c t, dán, t y, xóa, phóng to, thu nh ... như các ph n m m PAINTBRUSH,
CORELDRAW,...
1.1.3.6. Lĩnh v c b n ñ : xây d ng và in n các b n ñ ñ a lý. M t trong nh ng ng
d ng hi n nay c a ñ h a là h th ng thông tin ñ a lý (GIS - Geographical Information
System).
1.1.4. Các lĩnh v c c a ñ h a máy tính
1.1.4.1. Các h CAD/CAM (CAD – Computer Aided Design, CAM – Computer
Aided Manufacture)
Các h này xây d ng t p h p các công c ñ h a tr giúp cho vi c thi t k các chi
ti t và các h th ng khác nhau: các thi t b cơ khí, ñi n t ... Ch ng h n như ph n m m
Auto Cad c a h ng AutoDesk...
1.1.4.2. X lý nh (Image Processing)
ðây là lĩnh v c x lý các d li u nh trong cu c s ng. Sau quá trình x lý nh, d
li u ñ u ra là nh c a ñ i tư ng. Trong quá trình x lý nh, chúng ta s s d ng r t
nhi u các k thu t ph c t p: khôi ph c nh, xác ñ nh biên...
Ví d : ph n m m PhotoShop, Corel Draw, ...
1.1.4.3. Khoa h c nh n d ng (Pattern Recognition)
Nh n d ng là m t lĩnh v c trong k thu t x lý nh. T nh ng m u nh có s n, ta
phân lo i theo c u trúc ho c theo các phương pháp xác ñ nh nào ñó và b ng các thu t
toán ch n l c ñ có th phân tích hay t ng h p nh ñã cho thành m t t p h p các nh
g c, các nh g c này ñư c lưu trong m t thư vi n và căn c vào thư vi n này ñ nh n
d ng các nh khác.
Ví d : Ph n m m nh n d ng ch vi t (VnDOCR) c a vi n Công ngh Thông tin
Hà N i, nh n d ng vân tay, nh n d ng m t ngư i trong khoa h c hình s ...
1.1.4.4. ð h a minh h a (Presentation Graphics)
3
Chương I. Các y u t cơ s c a ñ h a
ðây là lĩnh v c ñ h a bao g m các công c tr giúp cho vi c hi n th các s li u
th ng kê m t cách tr c quan thông qua các m u ñ th ho c bi u ñ có s n. Ch ng h n
như các bi u ñ (Chart) trong các ph n m m Word, Excel...
1.1.4.5. Ho t hình và ngh thu t
Lĩnh v c ñ h a này bao g m các công c giúp cho các h a sĩ, các nhà thi t k
phim nh chuyên nghi p th c hi n các công vi c c a mình thông qua các k x o v
tranh, ho t hình ho c các k x o ñi n nh khác...
Ví d : Ph n m m x

lý các k x o ho t hình như: 3D Animation, 3D Studio

Max..., ph n m m x lý các k x o ñi n nh: Adobe Primiere, Cool 3D,...
1.1.5. T ng quan v m t h ñ h a (Graphics System)
1.1.5.1. H th ng ñ h a
Ph n m m ñ h a: Là t p h p các câu l nh ñ h a c a h th ng. Các câu l nh l p
trình dùng cho các thao tác ñ h a không ñư c các ngôn ng l p trình thông d ng như
PASCAL, C, ... h tr . Thông thư ng, nó ch cung c p như là m t t p công c thêm
vào trong ngôn ng . T p các công c này dùng ñ t o ra các thành ph n cơ s c a m t
hình nh ñ h a như: ði m, ño n th ng, ñư ng tròn, màu s c,... Qua ñó, các nhà l p
trình ph i t o ra các chương trình ñ h a có kh năng ng d ng cao hơn.
Ph n c ng ñ h a: Là các thi t b ñi n t : CPU, Card, màn hình, chu t, phím...
giúp cho vi c th c hi n và phát tri n các ph n m m ñ h a.
1.1.5.2. Các thành ph n c a m t h th ng ñ h a
T p h p các công c này ñư c phân lo i d a trên nh ng công vi c trong t ng hoàn
c nh c th : xu t, nh p, bi n ñ i nh, ... bao g m:
• T p công c t o ra nh g c (output primitives): cung c p các công c cơ b n
nh t cho vi c xây d ng các hình nh. Các nh g c bao g m các chu i ký t , các th c
th hình h c như ñi m, ñư ng th ng, ña giác, ñư ng tròn,...
• T p các công c thay ñ i thu c tính (attributes): dùng ñ thay ñ i thu c tính c a
các nh g c. Các thu c tính c a nh g c bao g m màu s c (color), ki u ñư ng th ng
(line style), ki u văn b n (text style), m u tô vùng (area filling pattern),...

4
Chương I. Các y u t cơ s c a ñ h a
• T p các công c thay ñ i h quan sát (viewing transformation): M t khi mà các
nh g c và các thu c tính c a nó ñư c xác ñ nh trong h t a ñ th c, ta c n ph i chi u
ph n quan sát c a nh sang m t thi t b xu t c th . Các công c này cho phép ñ nh
nghĩa các vùng quan sát trên h t a ñ th c ñ hi n th hình nh ñó.
• T p các công c ph c v cho các thao tác nh p d li u (input operations): Các
ng d ng ñ h a có th s d ng nhi u lo i thi t b nh p khác nhau như bút v , b ng,
chu t, ... Chính vì v y, c n xây d ng thêm các công c này ñ ñi u khi n và x lý các
d li u nh p sao cho có hi u qu .
M t yêu c u v ph n c ng không th thi u ñ t ra cho các ph n m m ñ h a là:
tính d mang chuy n (portability), có nghĩa là chương trình có th chuy n ñ i m t
cách d dàng gi a các ki u ph n c ng khác nhau. N u không có s chu n hóa, các
chương trình thi t k thư ng không th chuy n ñ i ñ n các h th ng ph n c ng khác
mà không vi t l i g n như toàn b chương trình.
Sau nh ng n l c c a các t ch c chu n hóa qu c t , m t chu n cho vi c phát tri n
các ph n m m ñ h a ñã ra ñ i: ñó là GKS (Graphics Kernel System - H ñ h a cơ
s ). H th ng này ban ñ u ñư c thi t k như là m t t p các công c ñ h a hai chi u,
sau ñó ñư c phát tri n ñ m r ng trong ñ h a ba chi u.
Ngoài ra, còn có m t s chu n ñ h a ph bi n như:
•

CGI (Computer Graphics Interface System): h chu n cho các phương pháp
giao ti p v i các thi t b ngo i vi.

•

OPENGL: thư vi n ñ h a c a h ng Silicon Graphics.

•

DIRECTX: thư vi n ñ h a c a h ng Microsoft.

1.2. MÀN HÌNH ð

H A

M i máy tính ñ u có m t CARD dùng ñ qu n lý màn hình, g i là Video Adapter
hay Graphics Adapter. Có nhi u lo i adapter như: CGA, MCGA, EGA, VGA,
Hercules... Các adapter có th làm vi c

hai ch ñ : văn b n (Text Mode) và ñ h a

(Graphics Mode).
Có nhi u cách ñ kh i t o các mode ñ h a. Ta có th s d ng hàm $00 ng t $10
c a BIOS v i các Mode sau:
5
Chương I. Các y u t cơ s c a ñ h a
•

Mode $12: ch ñ phân gi i 640x480x16

•

Mode $13: ch ñ phân gi i 320x200x256

Ta có th vi t m t th t c ñ kh i t o ch ñ ñ h a như sau:
Procedure InitGraph(Mode:Word);
var Reg:Registers;
Begin
reg.ah := 0;
reg.al := mode;
intr($10,reg);
End;
Các b n có th tham kh o thêm

các tài li u v l p trình h th ng.

1.3. CÁC KHÁI NI M
1.3.1. ði m (Pixel)
Trong các h th ng ñ h a, m t ñi m ñư c bi u th b i các t a ñ b ng s .
Ví du: Trong m t ph ng, m t ñi m là m t c p (x,y)
Trong không gian ba chi u, m t ñi m là b ba (x,y,z)
Trên màn hình c a máy tính, m t ñi m là m t v trí trong vùng nh màn hình dùng
ñ lưu tr các thông tin v ñ sáng c a ñi m tương ng trên màn hình.
S ñi m v trên màn hình ñư c g i là ñ phân gi i c a màn hình (320x200,
480x640, 1024x1024,...)
Cách hi n th thông tin lên màn hình ñ h a:
Vùng ñ m màn hình hay còn g i là b nh

hi n th ñư c b t ñ u t

ñ a ch

A000h:$0000h. Vì v y, ñ hi n th thông tin ra màn hình thì ta ch c n ñưa thông tin
vào vùng ñ m màn hình b t ñ u t ñ a ch trên là ñư c.
Có nhi u cách ñ v m t ñi m ra màn hình: có th dùng các ph c v c a BIOS ho c
cũng có th truy xu t tr c ti p vào vùng nh màn hình.
• N u dùng ph c v c a BIOS, ta dùng hàm $0C ng t $10:
Procedure PutPixel(Col,Row:Word; Color:Byte);
Var reg:Registers;
Begin
reg.ah:=$0C;
reg.al:=Color;
6
Chương I. Các y u t cơ s c a ñ h a
reg.bh:=0;
reg.cx:=Col;
reg.dx:=Row;
Intr($10,reg);
End;
• N u mu n truy xu t tr c ti p vào vùng ñ m màn hình: Gi s m t ñi m (x,y)
ñư c v trên màn hình v i ñ phân gi i 320x200x256 (mode 13h), ñi m ñó s ñư c
ñ nh v trong vùng ñ m b t ñ u t ñ a ch segment A000h và ñ a ch offset ñư c tính
theo công th c: Offset = y*320 + x.
Ta có th vi t th t c 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. Các bi u di n t a ñ
H u h t các chương trình ñ h a ñ u dùng h t a ñ Decartes (Hình 1.1).
Ta bi n ñ i:
O
Y

O

MaxX
Y

X

X

MaxY

T a ñ th gi i th c

T a ñ thi t b màn hình.
Hình 1.1

1.3.3. ðo n th ng
Trong các h th ng ñ h a, các ño n th ng ñư c bi u th b i vi c “tô” ño n th ng
b t ñ u t ñi m ñ u mút này kéo dài cho ñ n khi g p ñi m ñ u mút kia.
1.4. CÁC THU T TOÁN V ðO N TH NG
7
Chương I. Các y u t cơ s c a ñ h a
1.4.1. Bài toán: V ño n th ng ñi qua 2 ñi m A(x1,y1) và B(x2,y2)
* Trư ng h p x1=x2 ho c y1=y2: r t ñơn gi n.
* Trư ng h p ñư ng th ng có h s góc m:
Ý tư ng:
Vì các Pixel ñư c v

các v trí nguyên nên ñư ng th ng ñư c v gi ng như hình

b c thang (do làm tròn).
V n ñ ñ t ra là ch n các t a ñ nguyên g n v i ñư ng th ng nh t.
1.4.2. Thu t toán DDA (Digital differential analyzer)
Xét ñư ng th ng có h s góc 0<m≤1(gi s ñi m ñ u A n m bên trái và ñi m cu i
B n m bên ph i). N u ta ch n ∆x=1và tính giá tr y k ti p như sau:
yk+1

= yk + ∆y = yk + m.∆x
= yk + m

V i h s góc m>1: ta hoán ñ i vai trò c a x,y cho nhau. N u ch n ∆y=1 thì:
xk+1

= xk + 1/m

Tương t , n u ñi m B n m bên trái và A n m bên ph i thì:
yk+1

= yk - m

(0<m≤1, ∆x= -1)

xk+1

= xk - 1/m

(m>1, ∆y= -1)

Tóm l i: Ta có thu t toán v ñư ng th ng DDA như sau:
Nh p A(x1,y1) B(x2,y2)
Tính ∆x = x2 - x1

∆y = y2 - y1

Step = Max(|∆x| , |∆y|)

Kh i t o các giá tr :
IncX = ∆x/Step;
x = x1;

IncY = ∆y/Step; {bư c tăng khi v }
{Ch n ñi m v ñ u tiên}

y = y1;

V ñi m (x,y);
Cho i ch y t 1 ñ n Step:
x = x + IncX;

y = y + IncY;

V ñi m (Round(x),Round(y))
T ñó ta có th t c v ño n th ng theo thu t toán DDA như sau:
Procedure DDALine(x1,y1,x2,y2:Integer);
var dx,dy,step,i:integer;
8
Chương I. Các y u t cơ s c a ñ h a
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. Thu t toán Bresenham
Phương trình ñư ng th ng có th phát
bi u dư i d ng: y = m.x + b

(1)

Phương trình ñư ng th ng qua 2 ñi m:
x − x1
y − y1
=
x 2 − x1
y 2 − y1

ð t

yi+
1
y

(*)

yi

∆x = x2 - x1
∆y = y2 - y1

(*) ⇔ y = x.

xi

∆y
∆y
+ y1 - x1.
∆x
∆x

∆y
∆x

xi+1

Hình 1.2

∆y = m. ∆x

(2)

b = y1 - m.x1

Suy ra m =

(3)

nên

Ta ch xét trư ng h p h s góc 0<m<1.
Gi s ñi m (xi,yi) ñã ñư c v . Ta ph i ch n ñi m k ti p là:
9
Chương I. Các y u t cơ s c a ñ h a
(xi + 1,yi) ho c (xi +1,yi +1)

(Xem hình 1.2)

Xét kho ng cách gi a 2 ñi m ch n v i ñi m n m trên ñư ng th c. N u kho ng
cách nào bé hơn thì ta l y ñi m ñó.
ð t:
d1 = y - yi = m.(xi +1) + b - yi
d2 = (yi +1) - y = yi + 1 - m.(xi + 1) - b
Suy ra:
d1 - d2 = 2m.(xi + 1) - 2yi + 2b - 1
= 2.

∆y
.(xi + 1) - 2yi + 2b - 1
∆x

⇔ ∆x(d1 - d2) = 2∆y.xi - 2∆x.yi + 2∆y + ∆x.(2b - 1)
ð t

pi = ∆x(d1 - d2) và C = 2∆y + ∆x.(2b - 1)

thì pi = 2∆y.xi - 2∆x.yi + C

(4)

pi+1 = 2∆y.xi+1 - 2∆x.yi+1 + C
Suy ra:
pi+1 - pi = 2∆y(xi+1 - xi) - 2∆x(yi - yi+1)
= 2∆y - 2∆x(yi+1 - yi)

(5)

( vì xi+1 - xi = 1 )
* Nh n xét:
. N u pi < 0: Ch n yi+1 = yi T (5) ⇒ pi+1 = pi + 2∆y.
. N u pi ≥ 0: Ch n yi+1 = yi + 1

(d1<d2)

T (5) ⇒ pi+1 = pi + 2∆y - 2∆x.

(d1>d2)

V i ñi m mút ñ u tiên, theo (4) ta có:
p1 = 2∆y.x1 - 2∆x.y1 + 2∆y + ∆x[2.(y1 - m.x1) - 1] = 2∆y - ∆x
T ñó, ta có th tóm t t thu t toán v ñư ng th ng theo Bresenham cho trư ng h p h
s góc 0<m<1 như sau:
• Bư c 1: Nh p các ñi m ñ u mút. ði m ñ u mút bên trái ch a t a ñ (x1,y1), ñi m
ñ u mút bên ph i ch a t a ñ (x2,y2).
• Bư c 2: ði m ñư c ch n ñ v ñ u tiên là (x1,y1).
• Bư c 3: Tính ∆x = |x2 - x1| , ∆y = |y2 - y1| và P1 = 2∆y - ∆x
N u pi < 0 thì ñi m k ti p là (xi + 1,yi)
Ngư c l i: ñi m k ti p là (xi + 1,yi + 1)
10
Chương I. Các y u t cơ s c a ñ h a
• Bư c 4: Ti p t c tăng x lên 1 Pixel.
pi+1 = pi + 2∆y

v trí xi +1, ta tính:

n u pi < 0

pi+1 = pi + 2.( ∆y - ∆x) n u pi ≥ 0
N u pi+1 < 0 thì ta ch n to ñ y k ti p là yi+1
Ngư c l i thì ta ch n yi+1 +1
• Bư c 5: L p l i bư c 4 cho ñ n khi x = x2.
Sau ñây là th t c cài ñ t thu t toán:
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;
11
Chương I. Các y u t cơ s c a ñ h a
putpixel(x,y,red);
end;
end;
1.4.4. Thu t toán MidPoint
Ta ch xét trư ng h p h s góc 0<m<1.
Thu t toán này ñưa ra cách ch n ñi m S(xi+1,yi) hay P(xi+1,yi+1) b ng cách so
sánh ñi m th c Q(xi+1,y) v i ñi m M (trung ñi m c a S và P).
N u ñi m Q n m dư i ñi m M thì ch n ñi m S
Ngư c l i, ch n ñi m P. (Xem hình 1.3)
Ta có d ng t ng quát c a phương trình ñư ng th ng:
Ax + By + C = 0
v i A = y2 – y1 , B = –(x2 – x1) ,
C = x2.y1 – x1.y2
ð t F(x,y) = Ax + By + C, ta có nh n xét:
< 0 n u (x,y) n m phía trên ñư ng th ng
F(x,y)

= 0 n u (x,y) thu c v ñư ng th ng
> 0 n u (x,y) n m phía dư i ñư ng th ng

Lúc này, vi c ch n các ñi m S hay P ñư c ñưa v vi c xét d u c a:
pi = F(M) = F(xi + 1,yi +

1
)
2

N u pi < 0 ⇒ M n m trên ño n
th ng ⇒ Q n m dư i M ⇒ Ch n S
N u pi ≥ 0 ⇒ M n m dư i ño n

P
yi+
1

Q
M

th ng ⇒ Q n m trên M ⇒ Ch n P
M t khác:
pi

pi+1 = F(xi+1 + 1,yi+1 +

S

yi

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

xi
xi+1

1
)
2

Hình 1.3

nên
pi+1 - pi = F(xi+1 + 1,yi+1 +

1
1
) - F(xi + 1,yi + )
2
2

12
Chương I. Các y u t cơ s c a ñ h a
= A(xi+1+1) + B(yi+1 +

1
1
) + C - A(xi+1) - B(yi + ) - C
2
2

= A(xi+1 - xi) + B(yi+1 - yi)
= A + B(yi+1 - yi) (vì xi+1 - xi =1)
Suy ra:
pi+1 = pi + A + B(yi+1 - yi)

(*)

*Nh n xét:
. N u pi < 0: Ch n ñi m S: yi+1 = yi

T (*) suy ra pi+1 = pi + A

. N u pi ≥ 0: Ch n ñi m P: yi+1 = yi + 1 T (*) suy ra pi+1 = pi + A + B
V i ñi m mút ñ u tiên, ta có:
p1 = F(x1 + 1,y1 +

1
1
) = A(x1+1) + B(y1 + ) + C
2
2

= Ax1 + Bx1 + C + A +

B
B
=A+
(vì Ax1 + Bx1 + C = 0)
2
2

Thu t toán MidPoint cho k t qu tương t như thu t toán Bresenham.
1.5. THU T TOÁN V ðƯ NG TRÒN
Xét ñư ng tròn (C) tâm O(xc,yc) bán kính R.

(y,x)

(y,x
)
(x,y
)

(-x,y)
(-y,x)

(x,y)

Phương trình t ng quát c a ñư ng tròn có d ng:
(x - xc)2 + (y - yc)2 = R2
⇔ y = yc ±

R2 − ( x − xC ) 2

(*)
(1)

ð ñơn gi n thu t toán, ñ u tiên ta xét ñư ng
tròn có tâm

(x,y)

g c t a ñ (xc=0 và yc=0).

* Ý tư ng:
Do tính ñ i x ng c a ñư ng tròn nên n u ñi m

(
y,-

Hình
1.4

(x,y)∈(C) thì các ñi m (y,x), (-y,x), (-x,y), (-x,-y), (-y,-x), (y,-x), (x,-y) cũng ∈ (C) (Hình 1.4)

Vì v y, ta ch c n v m t ph n tám cung tròn r i l y ñ i x ng qua g c O và 2 tr c to
ñ thì ta có ñư c toàn b ñư ng tròn.
1.5.1. Thu t toán Bresenham
Gi s (xi,yi) ñã v ñư c. C n ch n ñi m k ti p là (xi +1,yi) ho c (xi +1,yi -1)
(Hình 1.5)
T phương trình: x2 + y2 = R2
ta tính ñư c giá tr y th c ng v i xi +1 là:
13
Chương I. Các y u t cơ s c a ñ h a
y2 = R2 - (xi +1)2
d1 = yi2 - y2 = yi2 - R2 + (xi + 1)2

ð t:

d2 = y2 - (yi - 1)2 = R2 - (xi + 1)2 - (yi - 1)2
Suy ra:
pi = d1 - d2 = 2.(xi + 1)2 + yi2 + (yi - 1)2 - 2R2
⇒ pi+1 = 2.(xi+1 + 1)2 + y2i+1 + (yi+1 - 1)2 - 2R2

(2)

yi
y
yi1

(3)

T (2) và (3) ta có:
pi+1 - pi = 4xi + 6 + 2.(y2i+1 - yi2) - 2.(yi+1 - yi)
⇒ pi+1 = pi + 4xi + 6 + 2.(y2i+1 - yi2) - 2.(yi+1 - yi)

xi
xi+1
Hình
1.5

(4)
* Nh n xét:
N u pi < 0: ch n yi+1 = yi

(4) ⇒ pi+1 = pi + 4xi + 6

N u pi ≥ 0: ch n yi+1 = yi - 1

(4) ⇒ pi+1 = pi + 4.(xi - yi) + 10

Ta ch n ñi m ñ u tiên c n v (0,R), theo (2) ta có: p1 = 3 - 2R
Tóm l i: Ta có thu t toán v ñư ng tròn:
• Bư c 1: Ch n ñi m ñ u c n v (x1,y1) = (0,R)
• Bư c 2: Tính P ñ u tiên: p1 = 3 - 2R
N u p < 0: ch n ñi m k ti p là (xi +1,yi). Ngư c l i ch n ñi m (xi + 1,yi - 1)
• Bư c 3: x:=x + 1, tính l i p:
N u pi < 0: pi+1 = pi + 4xi + 6. Ngư c l i: pi+1 = pi + 4.(xi - yi) + 10
Khi ñó:
N u pi+1 < 0: ch n ñi m k ti p là (xi +1,yi+1). Ngư c l i ch n ñi m (xi+1,yi+1-1)
• Bư c 4: L p l i bư c 3 cho ñ n khi x = y.
Sau ñây là th t c ñ cài ñ t thu t toán:
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);
14
Chương I. Các y u t cơ s c a ñ h a
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. Thu t toán MidPoint
T phương trình ñư ng tròn: x2 + y2 = R2
2

2

2

ð t F(x,y) = x + y - R ,ta có:
< 0 n u (x,y)
= 0 n u (x,y)

trên ñư ng tròn

M
Q
P

trong ñư ng tròn

> 0 n u (x,y)

F(x,y)

S
yi

ngoàiñư ng tròn

Lúc này, vi c ch n các ñi m S(xi+1,yi) hay
P(xi+1,yi-1) ñư c ñưa v vi c xét d u c a:
pi = F(M) = F(xi + 1,yi -

yi1
xi

xi+1
Hình
1.6

1
) (Hình 1.6)
2

N u pi < 0 ⇒ M n m trong ñư ng tròn ⇒ Q g n S hơn ⇒ Ch n S
N u pi ≥ 0 ⇒ M n m ngoài ñư ng tròn ⇒ Q g n P hơn ⇒ Ch n P
15
Chương I. Các y u t cơ s c a ñ h a
M t khác:
pi

= F(xi + 1,yi -

1
)
2

pi+1 = F(xi+1 + 1,yi+1 -

1
)
2

nên
pi+1 - pi = F(xi+1 + 1,yi+1 -

1
1
) - F(xi + 1,yi - )
2
2

= [(xi+1+1)2 + (yi+1 = [(xi+2)2 + (yi+1 -

1 2
1
) - R2] - [(xi+1)2 + (yi - )2 - R2]
2
2

1 2
1
) - R2] - [(xi+1)2 + (yi - )2 - R2]
2
2

= 2xi + 3 + (yi+12 - yi2) - (yi+1 - yi)
Suy ra:
pi+1 = pi + 2xi + 3 + (yi+12 - yi2) - (yi+1 - yi)

(*)

*Nh n xét:
. N u pi < 0: Ch n ñi m S : yi+1 = yi

T (*) ⇒ pi+1 = pi + 2xi + 3

. N u pi ≥ 0: Ch n ñi m P: yi+1 = yi - 1 T (*) ⇒ pi+1 = pi + 2(xi - yi) + 5
V i ñi m ñ u tiên (0,R), ta có:
p1 = F(x1 + 1,y1 -

1
1
1
5
) = F(1,R - ) = 1 + (R - )2 - R2 = - R
4
2
2
2

1.6. THU T TOÁN V ELLIPSE
ð ñơn gi n, ta ch n Ellipse có tâm

g ct a

ñ . Phương trình c a nó có d ng:
y2
x2
+ 2 =1
a2
b

Ta có th vi t l i:

y2 = -

b2 2
.x + b2
2
a

(*)

*Ý tư ng: Gi ng như thu t toán v ñư ng tròn.
Ch có s khác bi t

Hình
1.7

ñây là ta ph i v 2 nhánh: M t nhánh t trên xu ng và m t

nhánh t dư i lên và 2 nhánh này s g p nhau t i ñi m mà

ñó h s góc c a ti p

tuy n v i Ellipse = -1 (Hình 1.7).
Phương trình ti p tuy n v i Ellipse t i ñi m (x0,y0) ∈ (E) :
16
Chương I. Các y u t cơ s c a ñ h a
x0 .

y
x
+ y0. 2 = 1
2
a
b

Suy ra, h s góc c a ti p tuy n t i ñi m ñó là: -

x 0 .b 2
.
y0 a 2

1.6.1. Thu t toán Bresenham
ñây, ta ch xét nhánh v t trên xu ng.
Gi s

ñi m (xi,yi) ñã ñư c v . ði m ti p theo c n ch n s là (xi+1,yi) ho c

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

Thay (xi +1) vào (*):

b2
.(xi +1)2 + b2
2
a

ð t:
d1= yi2 - y2 = yi2 +
d2= y2 - (yi -1)2 = -

b2
.(xi +1)2 -b2
2
a
b2
.(xi +1)2 + b2 - (yi -1)2
2
a

b2
⇒ pi = d1 - d2 = 2.[ 2 .(xi +1)2 - b2] + 2.(yi2 + yi) -1
a

pi+1

= 2.[

b2
.(xi+1 +1)2 - b2] + 2.(yi+12 + yi+1) -1
2
a

Suy ra:
pi+1 - pi = 2.

b2
.[(xi+1 +1)2 - (xi +1)2] + 2.( yi+12 - yi2 + yi+1 - yi)
2
a

(**)

*Nh n xét:
• pi < 0: Ch n yi+1 = yi
(**) ⇒ pi+1 = pi + 2.

b2
.(2x + 3)
a2

• pi ≥ 0: Ch n yi+1 = yi -1
(**) ⇒ pi+1 = pi + 2.

b2
.(2x + 3) - 4yi
a2

V i ñi m ñ u tiên (0,b), ta có:
p1 = 2

b2
- 2b + 1
a2

T ñó, ta có th t c v Ellipse như sau:
17
Chương I. Các y u t cơ s c a ñ h a
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
18
Chương I. Các y u t cơ s c a ñ h a
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. Thu t toán MidPoint
G i ý:
Phương trình Ellipse:

y2
x2
+ 2 =1
a2
b

Nhánh 1:
p1 = b2 - a 2 b +

1 2
.a
4

If pi < 0 Then pi+1 = pi + b2 + 2b2xi+1
else pi+1 = pi + b2 + 2b2xi+1 - 2a2yi+1
Nhánh 2:
p1 = b2(xi +

1 2
) + a2(yi - 1)2 - a2b2
2

If pi > 0 Then pi+1 = pi + a2 - 2a2yi+1
else pi+1 = pi + a2 + 2b2xi+1 - 2a2yi+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);
19
Chương I. Các y u t cơ s c a ñ h a
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;
20
Chương I. Các y u t cơ s c a ñ h a
End;
1.7. PHƯƠNG PHÁP V ð

TH HÀM S

1.7.1. Bài toán: V ñ th c a hàm s y = f(x) trên ño n [Min,Max].
*Ý tư ng: Cho x ch y t ñ u ñ n cu i ñ l y các t a ñ (x,f(x)) sau ñó làm tròn
thành s nguyên r i n i các ñi m ñó l i v i nhau.
1.7.2. Gi i thu t:
• Bư c 1: Xác ñ nh ño n c n v [Min,Max].
• Bư c 2: - ð t g c t a ñ lên màn hình (x0,y0).
- Chia t l v trên màn hình theo h s k.
- Ch n bư c tăng dx c a m i ñi m trên ño n c n v .
• Bư c 3: Ch n ñi m ñ u c n v : x = Min, tính f(x)
ð i qua t a ñ màn hình và làm tròn:
x1:=x0 + Round(x.k);
y1:=y0 - Round(y.k);
Di chuy n ñ n (x1,y1): MOVETO(x1,y1);
• Bư c 4:
Tăng x lên v i s gia dx: x:=x + dx;
ð i qua t a ñ màn hình và làm tròn:
x2:=x0 + Round(x.k);
y2:=y0 - Round(y.k);
V ñ n (x2,y2): LINETO(x2,y2);
• Bư c 5: L p l i bư c 4 cho ñ n khi x > Max thì d ng.
Ví d : V ñ th hàm 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);
21
Chương I. Các y u t cơ s c a ñ h a
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:BPBGI’);
Dau:=-4*Pi; cuoi:=4*Pi;
VeHinhSin(Dau,cuoi);
repeat

until KeyPressed;

CloseGraph;
END.
BÀI T P
1. Cho hai ñi m A(20,10) và B(25,13). Hãy tính các giá tr Pi, xi, yi

m i bư c khi v

ño n th ng AB theo thu t toán Bresenham/MidPoint và k t q a ñi n vào b ng sau:
i

1

2

3

4

5

6
22
Chương I. Các y u t cơ s c a ñ h a
Pi

?

?

?

?

?

?

xi

?

?

?

?

?

?

yi

?

?

?

?

?

?

2. Cài ñ t th t c v ño n th ng theo thu t toán Bresenham và MidPoint cho các
trư ng h p h s góc m>1, m<-1, -1<m<0.
3. Vi t th t c LineTo(x,y:Integer); ñ v ño n th ng t v trí hi n th i ñ n ñi m có
t a ñ (x,y).
4. Vi t th t c LineRel(dx,dy:Integer); ñ v ño n th ng t v trí hi n th i ñ n ñi m
m i cách ñi m hi n th i m t kho ng theo tr c x là dx và theo tr c y là dy.
5. Cài ñ t th t c v ñư ng tròn theo thu t toán MidPoint.
6. Vi t th t c Arc(x0,y0,g1,g2:Integer; R:Word); ñ v cung tròn có tâm (x0,y0)
bán kính R v i góc b t ñ u là g1 và góc k t thúc là g2.
7. Vi t th t c Sector(x0,y0,g1,g2:Integer; Rx,Ry:Word); ñ v cung Ellipse có tâm
(x0,y0) bán kính theo tr c X là Rx, bán kính theo tr c Y là Ry v i góc b t ñ u là g1
và góc k t thúc là g2.
8. Vi t th t c DrawPoly(P:Array; n:Byte; xc,yc,R:Word); ñ v m t ña giác ñ u
có n ñ nh lưu trong m ng P n i ti p trong ñư ng tròn tâm (xc,yc) bán kính R.
9. Vi t th t c Circle3P(A,B,C:ToaDo2D); ñ v ñư ng tròn ñi qua 3 ñi m A,B,C.
10. Vi t th t c Arc3P(A,B,C:ToaDo2D); ñ v cung tròn ñi qua 3 ñi m A,B,C.
11. V ñ th các hàm s sau:
y = ax2 + bx + c, y = ax3 + bx2 + cx + d, y = ax4 + bx3 + cx2 + dx + e
y=

ax + b
,
cx + d

y=

ax 2 + bx + c
.
dx + e

12. V các ñư ng cong sau:
2

y = 2px

y2
x2
+ 2 =1
a2
b

y2
x2
- 2 = ±1
a2
b

Bài t p l n: Vi t chương trình kh o sát và v ñ th các hàm s sơ c p

bài t p s 11.

23
CHƯƠNG 2

TÔ MÀU
2.1. GI I THI U V CÁC H MÀU
Giác quan c a con ngư i c m nh n ñư c các v t th xung quanh thông qua các tia
sáng màu t t hơn r t nhi u so v i 2 màu tr ng ñen. Vì v y, vi c xây d ng nên các
chu n màu là m t trong nh ng lý thuy t cơ b n c a lý thuy t ñ h a.
Vi c nghiên c u v màu s c ngoài các y u t v m t v t lý như bư c sóng, cư ng
ñ , còn có 3 y u t khác liên quan ñ n c m nh n sinh lý c a m t ngư i dư i tác ñ ng
c a chùm sáng màu ñi ñ n t v t th là: Hue (s c màu), Saturation (ñ b o hòa),
Lightness (ñ sáng). M t trong nh ng h màu ñư c s d ng r ng rãi ñ u tiên do
A.H.Munsell ñưa ra vào năm 1976, bao g m 3 y u t : Hue, Lightness và Saturation.
Ba mô hình màu ñư c s d ng và phát tri n nhi u trong các ph n c ng là: RGB dùng v i các màn hình CRT (Cathode ray bube), YIQ – dùng trong các h th ng ti vi
màu băng t n r ng và CMY - s d ng trong m t s thi t b in màu.
Ngoài ra, còn có nhi u h màu khác như: HSV, HSL, YIQ, HVC, ...
2.1.1.H RGB (Red, Green, Blue)
M t c a chúng ta c m nh n ba màu rõ nh t là Red (ñ ), Green (l c), Blue (xanh).
Vì v y, ngư i ta ñã xây d ng mô hình màu RGB (Red,Green, Blue) là t p t t c các
màu ñư c xác ñ nh thông qua ba màu v a nêu. Chu n này ñ u tiên ñư c xây d ng cho
các h vô tuy n truy n hình và trong các máy vi tính. T t nhiên, không ph i là t t c
các màu ñ u có th bi u di n qua ba màu nói trên nhưng h u h t các màu ñ u có th
chuy n v ñư c.
H này ñư c xem như m t kh i ba chi u v i màu Red là tr c X, màu Green là tr c
Y và màu Blue là tr c Z. M i màu trong h này ñư c xác ñ nh theo ba thành ph n
RGB (Hình 2.1).
Chương II. Tô màu
Z

Cyan

Blue
Magenta

White
Y

Black
Green
Red

Yellow

X

Hình 2.1. H màu RGB
Ví d :
Màu Red là (1, 0, 0)
Màu Blue là (0, 0, 1)
Red + Green = Yellow
Red + Green + Blue = White
2.1.2. H CMY (Cyan, Magenta, Yellow)
H này cũng ñư c xem như m t kh i ba chi u như h RGB. Nhưng h CMY trái
ngư c v i h RGB, ch ng h n:
White có thành ph n (0, 0, 0)
Cyan có thành ph n (1, 0, 0)
Green có thành ph n (1, 0, 1) ...
Sau ñây là công th c chuy n ñ i t h RGB → CMY :
 C  1  R 
 M  = 1 − G 
    
 Y  1  B 
    

2.1.3. H YIQ
H màu này ñư c ng d ng trong truy n hình màu băng t n r ng t i M , do ñó nó
có m i quan h ch t ch v i màn hình raster. YIQ là s thay ñ i c a RGB cho kh
năng truy n phát và tính tương thích v i ti vi ñen tr ng th h trư c. Tín hi u truy n s
d ng trong h th ng NTSC (National Television System Committee).
Sau ñây là công th c bi n ñ i t h RGB thành h YIQ:
26
Chương II. Tô màu
0.114   R 
Y  0.299 0.587
 I  = 0.596 − 0.275 − 0.321 * G 
  
  
Q  0.212 − 0.523 0.311   B 
  
  

Ma tr n ngh ch ñ o c a ma tr n bi n ñ i RGB thành h YIQ ñư c s d ng cho phép
bi n ñ i t h YIQ thành RGB.
2.1.4. H HSV (Hue, Saturation, Value)
Mô hình màu này còn ñư c g i là h HSB v i B là Brightness (ñ sáng) d a trên cơ
s n n t ng tr c giác v tông màu, s c ñ và s c thái m thu t (Hình 2.2).
Hue có giá tr t 00 → 3600
S, V có giá tr t

0 →1
V
Yellow

Green
1.0

Cyan

White

Blue

Red
White

H

S

0.0
Black

Hình 2.2. H màu HSV
Ví d :
Red ñư c bi u di n (00, 1, 1)
Green ñư c bi u di n (1200,1,1)
2.1.5. H HSL (Hue, Saturation, Lightness)
H này ñư c xác ñ nh b i t p h p hình chóp sáu c nh ñôi c a không gian hình tr
(hình 2.3).
1.0

L
White

Yellow

Green
0.5

Cyan
Blue

Red
White

H

S

0.0
Black

Hình 2.3. H màu HSL
27
Chương II. Tô màu
2.2. CÁC THU T TOÁN TÔ MÀU
2.2.1. Bài toán
P2
Cho ña giác S xác ñ nh b i n ñ nh : P1, P2,
W
P1

..., Pn. Hãy tô màu mi n S.
* Phương pháp t ng quát :

P3
S

- Tìm hình ch nh t W nh nh t ch a S

P5

(hình 2.4).
- Duy t qua t t c các ñi m P(x, y) ∈ W.
N u P ∈ S thì tô màu ñi m P.

P4
Hình 2.4

2.2.2. Thu t toán xác ñ nh P ∈ S
2.2.2.1. S là ña giác l i
- L y P ∈ W, n i P v i các ñ nh c a S thì ta ñư c n tam giác : Si= PPiPi+1, v i
Pn+1=P1.
n

-N u

∑ dt(S )
i =1

i

= dt(S) thì P ∈ S.

Ta có công th c tính di n tích c a S:

1 n
(
S= | ∑xi yi+1 −xi+1yi) |
2 i=1
2.2.2.2. Trư ng h p t ng quát (Thu t toán Jordan)
L y P(x, y) ∈ W, k n a ñư ng th ng ∆P xu t phát t P và không ñi qua các ñ nh
c a ña giác S.
G i S(P) là s giao ñi m c a ∆P v i các biên c a S.
N u S(P) l thì P ∈ S.
* V n ñ còn l i là tìm S(P):
Bư c 1: K n a ñư ng th ng ∆P // 0y và hư ng v phía y>0.
Bư c 2: V i m i c nh Ci= PiPi+1 c a S:
+ N u x=xi thì xét 2 c nh có 1 ñ u là Pi:
N u y<yi thì
28
Chương II. Tô màu
• N u c 2 ñ u kia

cùng m t phía c a ∆P thì ta tính ∆P c t c 2 c nh.

• Ngư c l i : ∆P c t 1 c nh.
+ Ngư c l i:
• N u x>Max(xi,xi+1) ho c x<Min(xi,xi+1) thì ∆P không c t Ci
• Ngư c l i:
-N u y<= Min(yi, yi+1) thì ∆P c t Ci
-Ngư c l i :
Xét t a ñ giao ñi m (x0, y0) c a ∆P v i Ci
N u y >= y0 thì ∆P không c t Ci. Ngư c l i ∆P c t Ci.
Thu t toán này có th ñư c cài ñ t b ng ño n chương trình 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;

29
Chương II. Tô màu
2.2.3. Thu t toán tô màu theo dòng quét (Scanline)
ð t x0 = Min(xi), i∈ [1,n].

y

Bư c 1: K Dy//0y ñi qua x0 (hình 2.5).
Dy
Bư c 2: Xác ñ nh các giao ñi m Mi(x,y) c a Dy v i các c nh Ci.
N u có c nh Ci = PiPi+1 song song và
trùng v i Dy thì xem như Dy c t Ci t i
2 ñi m Pi và Pi+1.
Bư c 3: S p x p l i các ñi m Mi theo
th

t tăng d n ñ i v i yi (ñi m ñ u

x0
x

xi
Hình 2.5

tiên có th t là 1).
Bư c 4: Nh ng ñi m n m trên Dy

gi a giao ñi m l và giao ñi m ch n liên ti p là

nh ng ñi m n m trong ña giác và nh ng ñi m này s ñư c tô.
Bư c 5: Tăng x0 lên m t Pixel. N u x0 ≤ Max(xi) thì quay l i bư c 1.
2.2.4. Thu t toán tô màu theo v t d u loang
L y P(x,y) ∈ S, tô màu P.
Xét các ñi m lân c n c a P (Hình 2.6).

X
X

O
N u các ñi m lân c n ñó v n còn thu c S và chưa

O

X

X

ñư c tô màu thì tô màu các ñi m lân c n ñó...
Thu t toán trên có th ñư c minh h a b ng th t c

Hình 2.6

ñ qui:
Procedure TOLOANG(x,y:Integer; Color:Word);
Begin
If (P(x,y)∈S)and(P(x,y)chưa tô) Then
Begin
PutPixel(x,y,Color);
TOLOANG(x+1,y,Color);
TOLOANG(x-1,y,Color);
30
Chương II. Tô màu
TOLOANG(x,y+1,Color);
TOLOANG(x,y-1,Color);
End;
End;
BÀI T P
1. Vi t hàm DienTich(P:Array; n:Byte); ñ tính di n tích c a ña giác l i có n ñ nh
lưu trong m ng P.
2. Vi t hàm KiemTra(x,y:Integer; P:Array; n:Byte):Boolean; ñ ki m tra ñi m
(x,y) n m trong hay ngoài ña giác có n ñ nh ñư c lưu trong m ng P theo hai cách:
-

Dùng công th c tính di n tích ña giác (ñ i v i ña giác l i).

-

Dùng thu t toán Jordan (ñ i v i ña giác b t kỳ).

2. Vi t chương trình cài ñ t thu t toán tô màu m t ña giác theo thu t toán Scanline.
3. Vi t chương trình cài ñ t thu t toán tô màu m t ña giác theo v t d u loang theo hai
phương án:
a. ð qui.
b. Kh ñ qui.
4. Vi t th t c FillRec(x1,y1,x2,y2:Integer; color:Byte); ñ tô màu hình ch nh t xác
ñ nh b i 2 ñ nh (x1,y1) và (x2,y2).
5. Vi t th t c FillEllipse(x,y,Rx,Ry:Integer; color:Byte); ñ tô màu Ellipse có tâm
(x,y) và bán kính theo hai tr c là Rx và Ry.
6. Vi t th t c FillSector(x,y,Rx,Ry,g1,g2:Integer; color:Byte); ñ tô màu hình qu t
Ellipse có tâm (x,y), bán kính theo hai tr c là Rx và Ry, góc b t ñ u là g1 và góc k t
thúc là g2.
7. Vi t th t c Donut(x,y,Rmin,Rmax:Integer; color:Byte); ñ tô màu hình vành
khăn có tâm (x,y) và bán kính hai ñư ng tròn tương ng là Rmin và Rmax.
Bài t p l n: Xây d ng m t thư vi n ñ h a MYGRAPH tương t như thư vi n
GRAPH.TPU c a Turbo Pascal.

31
CHƯƠNG III

XÉN HÌNH
3.1. ð T V N ð
Cho m t mi n D ⊂ Rn và F là m t hình trong Rn (F ⊂ Rn). Ta g i F ∩ D là hình có
ñư c t F b ng cách xén vào trong D và ký hi u là ClipD(F).
Bài toán ñ t ra là xác ñ nh ClipD(F).
3.2. XÉN ðO N TH NG VÀO VÙNG HÌNH CH

NH T C A R2

3.2.1. C nh c a hình ch nh t song song v i các tr c t a ñ
Lúc này:


D = ( x, y ) ∈ R 2 |


X min ≤ x ≤ X max 

Y min ≤ y ≤ Y max 

và F là ño n th ng n i 2 ñi m (x1,y1), (x2,y2) nên phương trình c a F là:
 x = x1 + ( x 2 − x1). t

 y = y1 + ( y 2 − y1). t

t ∈ [0,1]

Do ñó, F có th ñư c vi t dư i d ng:
F = {(x,y) ∈ R2 | x = x1 + (x2 -x1).t; y = y1 + (y2 -y1).t; 0 ≤ t ≤ 1}
Khi ñó, giao ñi m c a F và D chính là
nghi m c a h b t phương trình (theo t):
Xmin ≤ x1+ (x2 - x1). t ≤ Xmax

 Ymin ≤ y1+ (y2 - y1). t ≤ Ymax

0≤ t ≤1


G i N là t p nghi m c a h phương trình

A
y
yMax

P
Q

yMin

B
xMin

trên.
Hình 3.1

N u N = ∅ thì ClipD(F) = ∅
N u N ≠ ∅ thì N = [t1, t2]

(t1 ≤ t2)

G i P, Q là 2 giao ñi m xác ñ nh b i:

xMax X
Chương III. Xén hình
 Px = x1 + ( x 2 − x1). t 1

 Py = y1 + ( y 2 − y1). t 1

thì:

ClipD(F) = PQ

 Qx = x1 + ( x 2 − x1). t 2

Qy = y1 + ( y 2 − y1). t 2

(Hình 3.1)

3.2.1.1. Thu t toán Cohen - Sutherland
• Chia m t ph ng ra làm 9 vùng, m i vùng ñánh m t mã nh phân 4 bit (hình 3.2).
Bit 1: Qui ñ nh vùng n m bên trái c a s

100
1

100
0

101
0

Bit 3: Qui ñ nh vùng n m bên dư i c a s

000
1

000
0

001
0

Bit 4: Qui ñ nh vùng n m bên trên c a s

010
1

010
0

011
0

Bit 2: Qui ñ nh vùng n m bên ph i c a s

• Xét ñi m P ∈ R2 :

Hình 3.2

1
0

nãúuPx < X min
Ngæåüc
laûi

1
0

nãúuP > X max
x
Ngæåüc
laûi

1
0

nãúuPy < Y min
Ngæåüc
laûi

1

0

nãúuPy > Y max
Ngæåüc
laûi

Pleft

= 

PRight

= 

PBelow = 

PAbove =

• Xét ño n th ng AB, ta có các trư ng h p sau:
i/ N u Mã(A) = Mã(B) = 0000 thì AB ∈ D ⇒ ClipD(F) = AB
ii/ N u Mã(A) AND Mã(B) ≠ 0000 thì ño n AB n m hoàn toàn bên ngoài hình
ch nh t ⇒ ClipD(F) = ∅
Chú ý: Phép toán AND là phép toán Logic gi a các bit.
iii/ N u (Mã(A) AND Mã(B) = 0000) và (Mã(A) ≠ 0000 ho c Mã(B) ≠ 0000) thì:
Gi s Mã(A) ≠ 0000 ⇔ A n m ngoài hình ch nh t.
♦ N u Aleft = 1 : thay A b i ñi m n m trên ño n AB và c t c nh trái (n i dài)
c a hình ch nh t.
33
Chương III. Xén hình
♦ N u Aright = 1: thay A b i ñi m n m trên ño n AB c t c nh ph i (n i dài) c a
hình ch nh t.
♦ N u ABelow = 1: thay A b i ñi m n m trên ño n AB và c t c nh dư i (n i
dài) c a hình ch nh t.
♦ N u AAbove = 1: thay A b i ñi m n m trên ño n AB và c t c nh trên (n i
dài) c a hình ch nh t.
Chú ý: Quá trình này ñư c l p l i: Sau m i l n l p, ta ph i tính l i mã c a A.
N u c n, ph i ñ i vai trò c a A và B ñ ñ m b o A luôn luôn n m bên ngoài hình ch
nh t. Quá trình s d ng khi x y ra m t trong 2 trư ng h p: i/ ho c ii/
3.2.1.2. Thu t toán chia nh phân

• Ý tư ng c a thu t toán này tương t như thu t toán tìm nghi m b ng phương pháp
chia nh phân.

• M nh ñ : Cho M: trung ñi m c a ño n AB, Mã(A) ≠ 0000, Mã(B) ≠ 0000, Mã(M)
≠ 0000 thì ta có:
[Mã(A) AND Mã(M)] ≠ 0000
ho c [Mã(M) AND Mã(B)] ≠ 0000.
Ý nghĩa hình h c c a m nh ñ : N u c ba ñi m A, B, M ñ u

ngoài hình ch

nh t thì có ít nh t m t ño n hoàn toàn n m ngoài hình ch nh t.

• Ta phát th o thu t toán như sau:
i/ N u Mã(A) = 0000 và Mã(B) = 0000 thì ClipD(F) = AB
ii/ N u Mã(A) AND Mã(B) ≠ 0000 thì ClipD(F) = ∅
iii/ N u Mã(A) = 0000 và Mã(B) ≠ 0000 thì:
P:=A; Q:=B;
Trong khi |xP -xQ| + |yP - yQ| ≥ 2 thì:
♦ L y trung ñi m M c a PQ;
♦ N u Mã(M) ≠ 0000 thì Q:= M.
34
Chương III. Xén hình
Ngư c l i: P:= M.
⇒ ClipD(F) = AP
iv/ N u Mã(A) ≠ 0000 và Mã(B) = 0000 thì: ð i vai trò c a A, B và áp d ng ii/
v/ N u Mã(A) ≠ 0000 ≠ Mã(B) và [Mã(A) AND Mã(B)]= 0000 thì:
P:=A; Q:=B;
L y M: trung ñi m PQ;
Trong khi Mã(M) ≠ 0000 và |xP - xQ| + |yP - yQ| ≥ 2 thì:
♦ N u Mã(M) AND Mã(Q) ≠ 0000 thì Q:=M. Ngư c l i P:=M.
♦ L y M: trung ñi m PQ.
N u Mã(M) ≠ 0000 thì ClipD(F) = ∅ . Ngư c l i, áp d ng ii/ ta có:
ClipD(MA) = MA1
ClipD(MB) = MB1
Suy ra:

ClipD(F) = A1B1

3.2.1.3. Thu t toán Liang - Barsky
∆x = x2 - x1

∆y = y2 - y1

p1 = - ∆x

q1 = x1 - xMin

p2 = ∆x

q2 = xMax - x1

p3 = - ∆y

q3 = y1 - yMin

p4 = ∆y

ð t

q4 = yMax - y1

thì h b t phương trình giao ñi m c a F và D có th vi t l i:
Pk .t ≤ Q k , k = 1..4

 0 ≤ t ≤1

Xét các trư ng h p sau:
i/ ∃k: Pk = 0 và Qk < 0: ( ðư ng th ng song song v i các biên và n m ngoài vùng
hình ch nh t )

35
Chương III. Xén hình
⇒ ClipD(F) = ∅
ii/ ∀k ∈ {1,2,3,4}: Pk ≠ 0 ho c Qk ≥ 0:
ð t

K1 = {k | Pk > 0 }
K2 = {k | Pk < 0 }
u1 = Max({

Qk
| k ∈ K2} ∪ {0})
Pk

u2 = Min({

Qk
| k ∈ K1} ∪ {1})
Pk

N u u1 > u2 thì ClipD(F) = ∅
Ngư c l i: G i P, Q là 2 ñi m th a
 Px = x1 + ∆x.u1
Qx = x1 + ∆x.u2
và 

Py = y1 + ∆y.u1
Qy = y1 + ∆y.u2

thì ClipD(F) = PQ
3.2.2. Khi c nh c a vùng hình ch nh t t o v i tr c hoành m t góc α∈(0,Π/2)
Π
Ta dùng phép quay tr c t a ñ ñ ñưa bài toán v trư ng h p các c nh c a hình
ch nh t song song v i các tr c t a ñ (hình 3.3).
y

G i R là ma tr n quay c a phép ñ i tr c, ta có:
 X min
 X min

 = R. 

 Y min 
 Y min 
α

 X max
 X max

 = R. 

 Y max 
 Y max 

x

O

v i

 cos(α ) sin(α ) 

 − sin(α ) cos(α )

R= 

Hình 3.3

36
Chương III. Xén hình
3.3. XÉN ðO N TH NG VÀO HÌNH TRÒN
Gi s ta có ñư ng tròn tâm O(xc,yc) bán kính R và ño n th ng c n xén là AB v i
A(x1,y1), B(x2,y2) (Hình 3.4).

A

* Thu t toán:
B

• Tính d(O,AB)
• Xét các trư ng h p:
i/ N u d > R thì ClipD(F) = ∅
Hình 3.4

ii/ N u d = R thì ClipD(F) = A0 v i A0 là
chân ñư ng vuông góc h t O xu ng AB.
iii/ N u d < R thì xét các trư ng h p sau:
♦ (OA < R) AND (OB < R) thì ClipD(F) = AB

♦ N u m t ñi m n m trong và ñi m kia n m ngoài hình tròn, ch ng h n
OA<R và OB>R thì ClipD(F) = AI v i I là giao ñi m duy nh t gi a AB
và ñư ng tròn.
♦ (OA > R) AND (OB > R) thì ClipD(F) = IJ v i I, J là hai giao ñi m c a
AB v i ñư ng tròn.
Sau ñây là phương pháp tìm giao ñi m gi a ño n th ng và ñư ng tròn:
◊ Phương trình ñư ng tròn: (x - xc)2 + (y - yc)2 = R2

(1)

 x = x1 + ( x 2 − x1).λ

◊ Phương trình ño n AB:  y = y1 + ( y 2 − y1).λ

0 ≤ λ ≤1


(2)

◊ Thay (2) vào (1) ta suy ra: λ =

− a ± a 2 − bc
b

Trong ñó:
a = ∆x.(x1 - xc) + ∆y.(y1 - yc)
b = (∆x)2 + (∆y)2
c = (x1 - xc)2 + (y1 - yc)2 - R2
37
Chương III. Xén hình
∆x = x2 - x1
∆y = y2 - y1
◊ D a vào ñi u ki n 0 ≤ λ ≤ 1 ñ ch n giao ñi m.
3.4. XÉN ðƯ NG TRÒN VÀO HÌNH CH

NH T CÓ CÁC C NH SONG

SONG V I TR C T A ð
Lúc này:
D = {(x,y)| xMin ≤ x ≤ xMax ; yMin ≤ y ≤ yMax }
F = { (x,y)| (x - xC)2 + (y - yC)2 = R2}
*Trư c h t, ta ki m tra các trư ng h p ñ c bi t sau:
i/

Hình
3.5

N u xMin ≤ xC -R; xC +R ≤ xMax;
yMin ≤ yC -R; yC +R ≤ yMax;

thì ClipD(F) = F (Hình 3.5)
ii/

N u xC +R < xMin
ho c xC -R > xMax
ho c yC +R < yMin
ho c yC - R > yMax

thì ClipD(F) = ∅ (Hình 3.6)

Hình
3.6

*Xét trư ng h p còn l i: Tìm các giao ñi m c a F và D. S p x p các giao ñi m ñó
theo chi u ngư c kim ñ ng h .
• Các cung tròn ñư c t o b i 2 giao ñi m liên ti p s hoàn toàn n m trong D
ho c hoàn toàn n m bên ngoài D.
• ð xác ñ nh các cung này n m trong hay ngoài D, ta ch c n l y trung ñi m
M c a cung ñó. N u M ∈ D thì cung ñó n m trong D, ngư c l i thì nó n m
ngoài D.

38
Chương III. Xén hình
3.5. XÉN ðA GIÁC VÀO HÌNH CH

NH T

Hình 3.7. Xén ña giác vào hình ch nh t
Thu t toán SutherLand - Hodgman
N u t t c các ñ nh c a ña giác ñ u n m trong hình ch nh t thì hình c n xén

i/

chính là ña giác và bài toán coi như ñã ñư c gi i quy t.
Ai+

Ai

Ai

Ai+

Ai+

Ai+
Ai+
Ai

Ai

Ai

Hình 3.8. Các trư ng h p c n xét
ii/

Trư ng h p ngư c l i:

- Xu t phát t m t ñ nh n m ngoài hình ch nh t, ta ch y theo d c biên c a ña
giác. V i m i c nh c a ña giác, ta có các trư ng h p sau:
N u c hai ñ nh ñ u n m ngoài hình ch nh t thì:
N u Ma(Ai) and Ma(Ai+1) ≠ 0000 thì không lưu ñ nh
Ngư c l i thì lưu hai giao ñi m.
Ai ngoài, Ai+1 trong: lưu giao ñi m P và Ai+1.
C hai ñ nh ñ u n m trong hình ch nh t: lưu Ai và Ai+1.
Ai trong, Ai+1 ngoài: lưu Ai và giao ñi m P.

39
Chương III. Xén hình
- Sau khi duy t qua t t c các c nh c a ña giác thì ta có ñư c m t dãy các ñ nh m i
phát sinh: B1, B2, ..., Bn
N u trong dãy các ñ nh m i này có hai ñ nh liên ti p không n m trên cùng m t
c nh c a hình ch nh t , gi s hai ñ nh ñó là Bi và Bi+1 thì ta ñi d c các c nh c a hình
ch nh t t Bi ñ n Bi+1 ñ tìm t t c các ñ nh c a hình ch nh t n m trong ña giác r i
b sung chúng vào gi a Bi và Bj.
T p ñ nh m i tìm ñư c chính là ña giác xén ñư c.
- N u t p ñ nh m i này là r ng: N u có m t ñ nh c a hình ch nh t n m trong ña
giác thì hình xén ñư c chính là toàn b hình ch nh t. Ngư c l i, hình xén ñư c là
r ng.
BÀI T P
1. Vi t hàm MA(P:ToaDo):Byte; ñ ñánh mã cho ñi m P.
2. Cài ñ t thu t toán xén m t ño n th ng vào m t hình ch nh t theo các thu t toán:
Liang-Barsky, Cohen-Sutherland, chia nh phân.
3. Cài ñ t thu t toán xén m t ño n th ng vào m t hình tròn.
4.Cài ñ t thu t toán xén m t ña giác vào m t vùng hình ch nh t.

40
CHƯƠNG IV

CÁC PHÉP BI N ð I
4.1. CÁC PHÉP BI N ð I TRONG M T PH NG
4.1.1. Cơ s toán h c
Phép bi n ñ i Affine 2D s bi n ñi m P(x,y) thành ñi m Q(x’,y’) theo h phương
trình sau:
x’ = Ax + Cy + trx
y’ = Bx + Dy + try
Dư i d ng ma tr n, h này có d ng:
A B
 + (trx try)

C D

(x’ y’) = (x y). 

Hay vi t g n hơn:

X’ = X.M + tr

v i X’=(x’,y’); X=(x,y); tr=(trx,try) - vector t nh ti n;
A B
 - ma tr n bi n ñ i.

C D

M= 


4.1.1.1. Phép ñ ng d ng
Ma tr n c a phép ñ ng d ng là:
 A 0

 0 D

M= 

 x ' = Ax
 y ' = Dy

⇔

Cho phép ta phóng to hay thu nh hình theo m t hay hai chi u.
4.1.1.2. Phép ñ i x ng
ðây là trư ng h p ñ c bi t c a phép ñ ng d ng v i A và D ñ i nhau.
 −1 0


 0 1

ñ i x ng qua Oy
Chương IV. Các phép bi n ñ i
1 0 


 0 −1

ñ i x ng qua Ox

 −1 0 


 0 −1

ñ i x ng qua g c t a ñ

4.1.1.3. Phép quay
Ma tr n t ng quát c a phép quay là

 Cos (α ) Sin(α ) 


 − Sin(α ) Cos (α ) 

R= 


Chú ý:
• Tâm c a phép quay ñư c xét

ñây là g c t a ñ .

• ð nh th c c a ma tr n phép quay luôn luôn b ng 1.
4.1.1.4. Phép t nh ti n
Bi n ñ i (x,y) thành (x’,y’) theo công th c sau
x’ = x + M
y’ = y + N
ð thu n ti n bi u di n dư i d ng ma tr n, ta có th bi u di n các t a ñ dư i d ng
t a ñ thu n nh t (Homogen):
1

(x y 1).  0

M

0
1
N

0

0 = (x + M

1

y+N

1)

4.1.1.5. Phép bi n d ng
Ma tr n t ng quát là: M =  1 g 
Trong ñó:


h



1


g = 0: bi n d ng theo tr c x.
h = 0: bi n d ng theo tr c y.
4.1.1.6. H p c a các phép bi n ñ i
Có ma tr n bi n ñ i là tích c a các ma tr n c a các phép bi n ñ i.

.42
Chương IV. Các phép bi n ñ i
Ví d : Phép quay quanh m t ñi m b t kỳ trong m t ph ng có th th c hi n b i tích
c a các phép bi n ñ i sau:

° Phép t nh ti n tâm quay ñ n g c t a ñ .
° Phép quay v i góc ñã cho.
° Phép t nh ti n k t qu v tâm quay ban ñ u.
Như v y, ma tr n c a phép quay quanh m t ñi m b t kỳ ñư c th c hi n b i tích
c a ba phép bi n ñ i sau:
 1

 0

−M

0
1
−N

0  Cos(α ) Sin (α ) 0  1
 
 
0 .  − Sin (α ) Cos(α ) 0 .  0
 
 
1 
0
0
1  M

0
1
N

0

0

1

4.2. Ví d minh h a
Vi t chương trình mô ph ng phép quay m t tam giác quanh g c t a ñ .
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),
.43
Chương IV. Các phép bi n ñ i
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
.44
Chương IV. Các phép bi n ñ i
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. CÁC PHÉP BI N ð I TRONG KHÔNG GIAN
4.2.1. Các h tr c t a ñ
ð ñ nh v m t ñi m trong không gian, ta có th ch n nhi u h tr c t a ñ :
Z

Z

Y

Y
O

X

H tr c ti p

H gián ti p
Hình 4.1

•

H

t a ñ tr c ti p : n u tay ph i c m tr c Z sao cho ngón cái hư ng theo

chi u dương c a tr c Z thì b n ngón còn l i s quay t tr c X sang tr c Y (Qui t c
bàn tay ph i).
.45
Chương IV. Các phép bi n ñ i
•

H

t a ñ gián ti p : ngư c l i (Qui t c bàn tay trái).

Thông thư ng, ta luôn luôn ñ nh v m t ñi m trong không gian qua h tr c ti p.
Trong h t a ñ tr c ti p, ta chia ra làm 2 lo i sau:
Z

Z

P(R,θ,φ)

P(x,y,z)
R
Y

φ

O

O

Y

θ

X

X

H t a ñ Descarter

H c u
Hình 4.2

Ta có công th c chuy n ñ i t a ñ t h này sang h khác:
x = R.Cos(θ).Cos(Φ)
θ
Φ
y = R.Sin(θ).Cos(Φ)
θ
Φ
z = R.Sin(Φ)
Φ
R 2 = x2 + y 2 + z 2
ð thu n ti n cho vi c tính toán, t t c các ñi m trong không gian ñ u ñư c mô t
dư i d ng ma tr n 1x4, t c là (x,y,z,1). Vì v y, t t c các phép bi n ñ i trong không
gian ñ u ñư c bi u di n b i các ma tr n vuông 4x4 (Ma tr n Homogen).
4.2.2. Các công th c bi n ñ i
Phép bi n ñ i Affine 3D có d ng: X’=X.M + tr
v i X’=(x’,y’,z’);

X=(x,y,z);

M - ma tr n bi n ñ i;

tr=(trx,try,trz) - vector

t nh ti n
4.2.2.1. Phép thay ñ i t l
 A 0 0 0


 0 B 0 0
M=
 0 0 C 0


 0 0 0 1

⇔

 x ' = A. x

 y ' = B. y
 z ' = C. z


.46
Chương IV. Các phép bi n ñ i
4.2.2.2. Phép ñ i x ng
1

0
Mz = 
0

0

0

0
0 −1 0

0 0 1
0
1

0
0

1 0

0 −1
My= 
0 0

0 0
 −1

0
Mx = 
0

0

ñ i x ng qua m t (XY)

0 0

0 0
1 0

0 1

ñ i x ng qua m t (XZ)

0 0 0

1 0 0
0 1 0

0 0 1

ñ i x ng qua m t (YZ)

4.2.2.3. Phép t nh ti n
1

0
M= 
0

M

0
1
0
N

0

0
1 0

P 1
0
0

⇔

x ' = x + M

 y' = y + N
 z' = z + P


4.2.2.4. Phép quay
Ta nh n th y r ng, n u phép quay quay quanh m t tr c nào ñó thì t a ñ c a v t
th t i tr c ñó s không thay ñ i. Do ñó, ta có ma tr n c a các phép quay như sau:
 Cos (θ ) Sin(θ )

 − Sin(θ ) Cos (θ )
RZ = 
0
0


0
0


0 0

0 0
1 0

0 1


0
0
1

 0 Cos (θ ) Sin(θ )
RX = 
0 − Sin(θ ) Cos (θ )

0
0
0


0

0
0

1


.47
Chương IV. Các phép bi n ñ i
 Cos (θ )

0

RY = 
− Sin(θ )


0


Sin(θ )

0

1
0
0
0 Cos (θ ) 0 

0
0
1

0

Chú ý: Tích c a 2 ma tr n nói chung không giao hoán nên k t qu c a 2 phép quay liên
ti p tùy thu c vào th t th c hi n tích s .
Ví d : RX.RY ≠ RY.RX
4.2.3. Ma tr n ngh ch ñ o
ð nh nghĩa: Hai ma tr n ñư c g i là ngh ch ñ o c a nhau n u tích s c a chúng là
ma tr n ñơn v .
Ma tr n ngh ch ñ o c a ma tr n M ký hi u là M-1
Ví d :
 1 2 3  6 −2 −3  1 0 0

 
 

 1 3 3 .  −1 1 0  =  0 1 0

 
 

 1 2 4  −1 0 1   0 0 1

Ngư i ta ch ng minh ñư c r ng: T t c các ma tr n c a các phép bi n ñ i ñã nêu
trên ñ u có ma tr n ngh ch ñ o.
• Ma tr n ngh ch ñ o c a phép t nh ti n có ñư c b ng cách thay M, N, P b ng M, -N, -P.
• Ma tr n ngh ch ñ o c a phép thay ñ i t l có ñư c b ng cách thay A, B, C b ng
1/A, 1/B, 1/C.
• Ma tr n ngh ch ñ o c a phép quay có ñư c b ng cách thay góc θ b ng -θ .
θ
4.3. CÁC PHÉP CHI U C A V T TH TRONG KHÔNG GIAN LÊN M T PH NG
4.3.1. Phép chi u ph i c nh (Perspective)

Phép chi u này cho hình nh gi ng như khi nhìn v t th .
ð tìm hình chi u P’(y’,z’) c a P(x,y,z), ta n i P v i m t (tâm chi u). Giao ñi m
c a ñư ng này v i m t quan sát chính là P’ (hình 4.3).
Gi s P n m phía trư c m t, t c là P.x < E.
.48
Chương IV. Các phép bi n ñ i
Z

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

y'
(E,0,0)
X

Maét
Y

Maët phaún g chieáu

Hình 4.3

Phương trình c a tia ñi qua m t và P là: r(t) = (E,0,0).(1-t) + (x,y,z).t

(*)

Giao ñi m v i m t ph ng quan sát có thành ph n x’ = 0.
Do thành ph n x’ c a tia r là E.(1-t) + x.t = 0 nên t =

1
. Thay t vào (*) ta
1− x / E

tính ñư c:
y’ =

y
z
va z’ =
1− x / E
1− x / E

NH N XÉT
i/ Phép chi u ph i c nh không gi nguyên hình d ng c a v t th .
ii/ Ch có nh ng ñư ng th ng song song v i m t ph ng chi u thì m i song song
v i nhau.
iii/ Phép chi u ph i c nh ñư c qui ñ nh b i 5 bi n:
• Hư ng c a m t ph ng chi u so v i v t th .
• ð cao c a tâm chi u so v i v t th .
• Kho ng cách t tâm chi u ñ n v t th (R).
• Kho ng cách t m t ph ng chi u ñ n tâm chi u (D).
• ð d ch chuy n ngang c a tâm chi u so v i v t th .
Chú ý: V i t a ñ c u, ta ch c n 4 tham s : R, Φ, θ, D.
.49
Chương IV. Các phép bi n ñ i
4.3.2. Phép chi u song song (Parallel)

Phép chi u này có tâm chi u

vô c c và y’=y, z’=z.(Hình 4.4)

Tính song song ñư c b o toàn.
A

A'
Taâm chieáu (∝)
B'

B

Maët phaúng chieáu

Hình 4.4
4.4. CÔNG TH C C A CÁC PHÉP CHI U LÊN MÀN HÌNH

Khi quan sát m t v t th trong không gian dư i m t góc ñ nào ñó, ta có 2 kh
năng ch n l a:
• ði m nhìn (màn hình) ñ ng yên và v t th di ñ ng.
• V t th ñ ng yên và ñi m nhìn s ñư c b trí thích h p.
Ta thư ng ch n gi i pháp th hai vì nó sát v i th c t hơn.
Y0

Z
Z0
YE

O'

XE

Y

φ

O

X0

θ

X

Maøn hình

Hình 4.5
Khi quan sát m t v t th b t kỳ trong không gian, ta ph i tuân th các nguyên t c
sau (hình 4.5):
• V t th ph i ñư c chi u lên m t h tr c ti p (O,X,Y,Z).
.50
Chương IV. Các phép bi n ñ i
•

Con m t ph i n m

g c c a m t h gián ti p th hai (O’,X0,Y0,Z0)

• Màn hình là m t ph ng vuông góc v i ñư ng th ng OO’.
• Tr c Z0 c a h quan sát ch ñ n g c O.
N u dùng h t a ñ c u ñ ñ nh v m t c a ngư i quan sát thì ta d dàng thay ñ i
góc ng m b ng cách thay ñ i góc θ và Φ.
Bây gi , ta kh o sát phép bi n ñ i mà v t th (X,Y,Z) ph i ch u ñ cho nó trùng
v i h quan sát (X0,Y0,Z0) ñ cu i cùng t o ra h t a ñ màn hình (Xe,Ye).
Bư c

1: T nh ti n g c O thành O’ (hình 4.6).
Z1
Z

Y1
O'
φ

O
θ

Y

X1

X

Hình 4.6
Ma tr n c a phép t nh ti n (L y ngh ch ñ o):
 1

0
A= 
 0

−M

0
1
0
−N

0
1
0
0



0
0
1
0
=

1 0
0
0
1


− P 1
 − R. Cos(θ ). Cos(φ ) − R. Sin (θ ). Cos(φ ) − R. Sin (φ )
0
0

0

0
0

1

và h (X,Y,Z) bi n ñ i thành h (X1,Y1,Z1).
Bư c

2: Quay h (X1,Y1,Z1) m t góc -θ‘ (θ‘=900 - θ) quanh tr c Z1 theo chi u kim
θ θ

ñ ng h . Phép quay này làm cho tr c âm c a Y1 c t tr c Z (hình 4.7).
Ta g i Rz là ma tr n t ng quát c a phép quay quanh tr c Z. Vì ñây là phép quay h
tr c nên ph i dùng ma tr n ngh ch ñ o R-1z.

.51
Chương IV. Các phép bi n ñ i
 Cos( a ) Sin ( a )

− Sin ( a ) Cos( a )
Rz = 
 0
0

0
 0

 Cos( a ) − Sin ( a )

-1
 Sin ( a ) Cos( a )
R z=
 0
0

0
 0

0 0

0 0
1 0

0 1

0 0

0 0
1 0

0 1

ta thay góc a = -θ‘ . Theo các phép toán lư ng giác:
θ
Sin(-θ') = -Sin(θ') = -Sin(900 - θ) = -Cos(θ)
θ
θ
θ
Cos(-θ') = Cos(θ') = Cos(900-θ) = Sin(θ)
θ
θ
θ
θ
Z

Z2

O'
Y2
Y

φ

O
θ

θ'
X2

X

Hình 4.7
Nên ma tr n c a phép quay tìm ñư c s có d ng:
 Sin (θ ) Cos(θ )

− Cos(θ ) Sin (θ )
B= 

0
0

0
0

Bư c

0 0

0 0
và h (X1,Y1,Z1) bi n ñ i thành h (X2,Y2,Z2).
1 0

0 1

3: Quay h (X2,Y2,Z2) m t góc 900 + Φ quanh tr c X2. Phép bi n ñ i này s

làm cho tr c Z2 hư ng ñ n g c O (hình 4.8).
Ta có:
0
0
1

 0 Cos (a ) Sin(a )
Rx = 
0 − Sin(a ) Cos (a )

0
0
0


0

0
0

1


.52
Chương IV. Các phép bi n ñ i
Z

Y3

O'
Z3
φ

O
θ

X3

Y

θ'

X

Hình 4.8
0
0
1

0 Cos( a ) − Sin ( a )
R-1x = 
 0 Sin ( a ) Cos( a )

0
0
0

0

0
0

1

Thay góc a = 900 + Φ , ta có: Cos(900 + Φ) = -Sin(Φ) và Sin(900 + Φ) = Cos(Φ)
Φ
Φ
nên ma tr n tìm ñư c s có d ng:
0
0
1

0 − Sin (φ ) − Cos(φ )
C= 
 0 Cos(φ ) − Sin (φ )

0
0
0

0

0
0

1

Lúc này, h (X2,Y2,Z2) bi n ñ i thành h (X3,Y2,Z3).
Bư c

4: Bi n ñ i h tr c ti p (X3,Y3,Z3) thành h gián ti p (hình 4.9).

Trong bư c này, ta ph i ñ i hư ng tr c X3 b ng cách ñ i d u các ph n t c a
c t X. Ta nh n ñư c ma tr n:
 −1

0
D= 
0

0

0 0 0

1 0 0
0 1 0

0 0 1

và h (X3,Y3,Z3) bi n ñ i thành h (X0,Y0,Z0).

.53
Chương IV. Các phép bi n ñ i
Z

Y0

X0

O'

Z0

Y

φ

O

θ'

θ

X

Hình 4.9
TÓM L I
Các ñi m trong không gian s nh n trong h quan sát m t t a ñ có d ng:
(x0 ,y0 ,z0 ,1) = (x y z 1).A.B.C.D
G i T = A.B.C.D, ta tính ñư c:
 − sin(θ ) − Cos(θ ). Sin (φ ) − Cos(θ ). Cos(φ )

Cos(θ ) − Sin (θ ). Sin (φ ) − Sin (θ ). Cos(φ )
T= 
 0
Cos(φ )
− Sin (φ )

0
R
 0

0

0
0

1

Cu i cùng ta có:
(x0 ,y0 ,z0 ,1) = (x y z 1).T
hay:
x0 = -x.Sin(θ) + y.Cos(θ)
θ
θ
y0 = -x.Cos(θ).Sin(Φ) - y.Sin(θ).Sin(Φ) + z.Cos(Φ)
θ
Φ
θ
Φ
Φ
z0 = -x.Cos(θ).Cos(Φ) - y.Sin(θ).Cos(Φ) - z.Sin(Φ) + R
θ
Φ
θ
Φ
Φ
* Bây gi ta chi u nh c a h quan sát lên màn hình.
1. Phép chi u ph i c nh
Cho ñi m P(x,y,z) và hình chi u P’(x0,y0,z0) c a nó trên m t ph ng.
G i D là kho ng cánh t m t ph ng ñ n m t (g c t a ñ ). (Hình 4.10)

.54
Chương IV. Các phép bi n ñ i
Y0

P(x0,y0,z0)
P'(xE,yE,zE)
Z0

O

Maøn hình

X0
Y0

P(x0,y0,z0)
yE
O

D
Maøn hình

Z0

O
xE
P(x0,y0,z0)

X0

Hình 4.10
Xét các tam giác ñ ng d ng, ta có:
xE/D = x0/z0

và

yE/D = y0/z0

⇒ xE = D.x0/z0 và yE = D.y0/z0
Chú ý: z0 bao hàm vi c phóng to hay thu nh v t th .
2. Phép chi u song song
T a ñ quan sát (x0,y0,z0) và t a ñ màn hình th a mãn công th c:
xE = x0 và

yE = y0

.55
Chương IV. Các phép bi n ñ i
Phoùng to

Thu nhoû

Maét
Vaät theå

Maøn hình

Maøn hình

Hình 4.11

K T LU N
Có 4 giá tr nh hư ng ñ n phép chi u v t th 3D là: các góc θ , Φ , kho ng cách R
t O ñ n O’ và kho ng cách D t O’ ñ n m t ph ng quan sát.
C th :
• Tăng gi m θ s quay v t th trong m t ph ng (XY).
• Tăng gi m Φ s quay v t th lên xu ng.
• Tăng gi m R ñ quan sát v t t xa hay g n.
• Tăng gi m D ñ phóng to hay thu nh

nh.

4.5. PH L C
T o 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;
.56
Chương IV. Các phép bi n ñ i
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:BPBGI');
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);
.57
Chương IV. Các phép bi n ñ i
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
.58
Chương IV. Các phép bi n ñ i
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 H A
Vi t chương trình mô t phép quay c a m t hình l p phương quanh các tr c (hình
4.12).
.59
Chương IV. Các phép bi n ñ i
Z

P7

P6
P5

P8
Y

P1
P2
P3

P4
X

Hình 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);
.60
Chương IV. Các phép bi n ñ i
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.
BÀI T P
1. Cho 3 tam giác sau:
ABC v i A(1,1)

B(3,1)

C(1,4)

EFG v i E(4,1)

F(6,1)

G(4,4)

MNP v i M(10,1)

N(10,3)

P(7,1)

a. Tìm ma tr n bi n ñ i tam giác ABC thành tam giác EFG.
b. Tìm ma tr n bi n ñ i tam giác ABC thành tam giác MNP.
2. Cài ñ t thu t toán xén m t ño n th ng vào m t hình ch nh t có c nh không song
song v i tr c t a ñ .
.61
Chương IV. Các phép bi n ñ i
3. Vi t chương trình v m t Ellipse có các tr c không song song v i h tr c t a ñ .
4. D a vào bài t p 2, hãy mô ph ng quá trình quay c a m t Ellipse xung quanh tâm
c a nó.
5. Vi t chương trình mô ph ng quá trình quay, ñ i x ng, t nh ti n, phóng to, thu nh ,
bi n d ng c a m t hình b t kỳ trong m t ph ng.
6. Mô ph ng chuy n ñ ng c a trái ñ t xung quanh m t tr i ñ ng th i mô t chuy n
ñ ng c a m t trăng xung quanh trái ñ t.
M r ng trong không gian 3 chi u.
7. Vi t chương trình v ñ ng h ñang ho t ñ ng.
8. Vi t chương trình v các kh i ña di n ñ u trong không gian.
M r ng: ñi u khi n phóng to, thu nh , quay các kh i ña di n quanh các tr c...

.62
CHƯƠNG V

BI U DI N CÁC ð I TƯ NG BA CHI U

5.1. MÔ HÌNH WIREFRAME
Mô hình WireFrame th hi n hình dáng c a ñ i tư ng 3D b ng 2 danh sách :
• Danh sách các ñ nh : lưu t a ñ c a các ñ nh.
• Danh sách các c nh : lưu các c p ñi m ñ u và cu i c a t ng c nh.
Các d nh và các c nh ñư c ñánh s th t cho thích h p.
Ví d : Bi u di n 1 căn nhà thô sơ (hình 5.1)
Danh sách các ñ nh
Vector

Z

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

P4

P10

Const

P8
Y
P2

P6
P7
X

Hình 5.1

ñây, chúng ta dùng c u trúc record d a trên 2 m ng:
MaxDinh = 50; { S

ñ nh t i ña}

MaxCanh = 100; {S
Type

P3

P1

Có nhi u cách ñ lưu gi mô hình
WireFrame.

P9

P5

c nh t i ña}

ToaDo3D = record
x, y, z:real;
end;
WireFrame = Record
Chương V. Bi u di n các ñ i tư ng ba chi u
Sodinh: 0..MaxDinh;
Dinh: array [1..MaxDinh] of ToaDo3D;
Socanh : 0..Maxcanh;
Canh :array[1..Maxcanh, 1..2] of 1..MaxDinh;
end;
Khi ñó, ta dùng m t bi n ñ mô t căn nhà :
Var

House : WireFrame;

v i bi n house

trên, ta có th gán giá tr như

sau:

Danh sách các c nh
C nh

ð nh ñ u

ð nh cu i

With House Do

1

1

2

Begin

2

2

3

sodinh:=10;

3

3

4

socanh:=17;

4

4

5

dinh[1].x:=0;

5

5

1

dinh[1].y:=0;

6

6

7

dinh[1].z:=0;

7

7

8

8

8

9

{S ñ nh th nh t c a

9

9

10

c nh s 1}

10

10

6

11

1

6

12

2

7

...

13

3

8

end;

14

4

9

15

5

10

16

2

5

17

1

3

...
canh[1, 1]:=1;

canh[1, 2]:=2; {S ñ nh th hai c a
c nh s 1}

5.2. V

MÔ HÌNH WIREFRAME V I CÁC

PHÉP CHI U
ð v m t ñ i tư ng WireFrame, ta v t ng

c nh trong danh sách các c nh c a mô hình. V n ñ là làm th nào ñ v 1 ñư ng
th ng trong không gian 3 chi u vào m t ph ng?
ð làm ñi u này, ta ph i b b t ñi 1 chi u trong mô hình bi u di n, t c là ta ph i
dùng phép chi u t 3D → 2D .
64
Chương V. Bi u di n các ñ i tư ng ba chi u
K thu t chung ñ v m t ñư ng th ng 3D là:
Chi u 2 ñi m ñ u mút thành các ñi m 2D.
V ñư ng th ng ñi qua 2 ñi m v a ñư c chi u.
Sau ñây là th t c xác ñ nh hình chi u c a m t ñi m qua phép chi u ph i c nh:
Procedure Chieu(P3D:ToaDo3D; E:Real; Var P2D:ToaDo2D);
Var t:Real;
Begin
If (P3D.x >=E) OR (E=0) Then
Writeln(‘ði m n m sau m t ho c m t n m trên m t ph ng
nhìn’);
Esle
Begin
t := 1/(1 - P3D.x/E);
P2D.y := t*P3D.y;
P2D.z := t*P3D.z;
End;
End;
5.3. V CÁC M T TOÁN H C
Ta s v các m t cong d a trên phương trình tham s c a các m t ñó.
Ví d :

(a)

(b)
Hình 5.2

(c)

• M t Ellipsoid: (hình 5.2.a)
x=Rx.cos(u).cos(v)
y=Ry.sin(u).cos(v)
65
Chương V. Bi u di n các ñ i tư ng ba chi u
z=Rz.sin(v)
Trong ñó: 0≤ u ≤ 2π
•

M t

-π/2 ≤ v ≤ π/2

Hypeboloid: (hình 5.2.b)

x=u
y=v
z=u2 - v2
Trong ñó u,v ∈[-1,1]
• Hình xuy n: (hình 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

• Hình tr tròn (Cylinder)
x = R.cos(u)
y = R.sin(u)
z=h
• Hình nón (Cone)
p(u,v) = (1-v).P0 + v.P1(u)
trong ñó:
P0: ñ nh nón
u
 x = R. cos( )
u,v ∈ [0,1]
 y = R. sin(u)

P1(u): ñư ng tròn 

• Ch o Parabol (Paraboloid)
x = a.v.cos(u)
y = b.v.sin(u)

u∈[-π,π], v ≥ 0

z = v2
Phương pháp chính

ñây cũng là v các ñư ng vi n theo u và v.

66
Chương V. Bi u di n các ñ i tư ng ba chi u
ð v m t ñư ng vi n u t i giá tr u’ khi v ch y t VMin ñ n VMax ta làm như
sau:
• T o m t t p h p các giá tr v[i] ∈ [VMin ,VMax], xác ñ nh v trí P[i] =
(X(u’,v[i]), Y(u’,v[i]), Z(u’,v[i])).
• Chi u t ng ñi m P[i] lên m t ph ng.
• V các ñư ng g p khúc d a trên các ñi m 2D P’[i].
Sau ñây là th t c 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 ñi m xu t phát 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 ñi m m i }

End;
u:=u + du;
End;
End;
Tương t , ta có th v h ñư ng cong theo v.
67
Chương V. Bi u di n các ñ i tư ng ba chi u
TÓM L I: Mu n v m t m t cong, ta th c hi n các bư c sau
• Nh p các h s c a phương trình m t: a, b, c, d, Umin, Umax, Vmin, Vmax.
• Tính các hàm 2 bi n: X(u,v), Y(u,v), Z(u,v).
• Kh i t o phép chi u: Song song/Ph i c nh.
• V h ñư ng cong u.
V h ñư ng cong v.
BÀI T P
1. Hãy xây d ng m t c u trúc d li u ñ lưu tr mô hình WireFrame.
2. T o file text ñ lưu các ñ nh và c nh c a m t v t th trong không gian 3D theo mô
hình WireFrame v i c u trúc như sau:
Dòng ñ u tiên ch a hai s nguyên m, n dùng ñ lưu s ñ nh và s c nh c a mô
hình.
m dòng ti p theo, m i dòng lưu t a ñ x, y, z c a t ng ñ nh trong mô hình.
n dòng ti p theo, m i dòng lưu hai s nguyên là ñ nh ñ u và ñ nh cu i c a t ng
c nh trong mô hình.
3. Vi t th t c ñ ñ c các giá tr trong file text lưu vào mô hình WireFrame.
4. Vi t th t c ñ v v t th t mô hình WireFrame.
5. Vi t chương trình bi u di n các kh i ña di n sau: T di n ñ u, Kh i l p phương,
Bát di n ñ u, Th p nh di n ñ u, Nh th p di n ñ u.
6. Vi t chương trình ñ mô ph ng các m t toán h c: yên ng a, m t c u, hình xuy n...

68
CHƯƠNG VI

THI T K ðƯ NG VÀ M T CONG
BEZIER VÀ B-SPLINE

Khác v i nh ng phương pháp bi u di n m t và ñư ng b i các công th c toán h c
tư ng minh,

ñây ta s bàn ñ n các công c cho phép ch ra các d ng ñư ng và m t

khác nhau d a trên các d li u.
ði u này có nghĩa là v i m t ñư ng cong cho trư c mà ta chưa xác ñ nh ñư c công
th c toán h c c a nó thì làm th nào ñ có th n m b t ñư c d ng c a ñư ng cong ñó
m t cách tương ñ i chính xác qua vi c s d ng m t t p nh các ñi m P0 , P1 ,... cùng
v i m t phương pháp n i suy nào ñó t t p ñi m này ñ t o ra ñư ng cong mong
mu n v i m t ñ chính xác cho phép.
Có nhi u cách ñ n m b t ñư c ñư ng cong cho trư c, ch ng h n:
•

L y m t m u ñư ng cong ch ng vài ch c ñi m cách nhau tương ñ i ng n r i
tìm m t hàm toán h c và ch nh hàm này sao cho nó ñi qua các ñi m này và
kh p v i ñư ng cong ban ñ u. Khi ñó, ta có ñư c công th c c a ñư ng và dùng
nó ñ v l i ñư ng cong.

•

Cách khác là dùng m t t p các ñi m ki m soát và dùng m t thu t toán ñ xây
d ng nên m t ñư ng cong c a riêng nó d a trên các ñi m này. Có th ñư ng
cong ban ñ u và ñư ng cong t o ra không kh p nhau l m, khi ñó ta có th di
chuy n m t vài ñi m ki m soát và lúc này thu t toán l i phát sinh m t ñư ng
cong m i d a trên t p ñi m ki m soát m i. Ti n trình này l p l i cho ñ n khi
ñư ng cong t o ra kh p v i ñư ng cong ban ñ u.
ñây, ta s ti p c n v n ñ theo phương pháp th hai, dùng ñ n các ñư ng cong

Bezier và B-Spline ñ t o các ñư ng và m t.
Gi s m t ñi m trong không gian ñư c bi u di n dư i d ng vector tham s p(t).
V i các ñư ng cong 2D, p(t) = (x(t), y(t)) và các ñư ng 3D, p(t) = (x(t), y(t), z(t)).
6.1. ðƯ NG CONG BEZIER VÀ M T BEZIER
6.1.1. Thu t toán Casteljau
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
ð xây d ng ñư ng cong p(t), ta d a trên m t dãy các ñi m cho trư c r i t o ra giá
tr p(t) ng v i m i giá tr t nào ñó. Vi c thay ñ i các ñi m này s làm thay ñ i d ng
c a ñư ng cong. Phương pháp này t o ra ñư ng cong d a trên m t dãy các bư c n i
suy tuy n tính hay n i suy kho ng gi a (In-Betweening).
Ví d : V i 3 ñi m P0 , P1 , P2 ta có th xây d ng m t Parabol n i suy t 3 ñi m này
b ng cách ch n m t giá tr t ∈ [0, 1] nào ñó r i chia ño n P0P1 theo t l t, ta ñư c
ñi m P01 trên P0P1 . Tương t , ta chia ti p P1P2 cũng theo t l t, ta ñư c P11 . N i P01
và P11 , l i l y ñi m trên P01P11 chia theo t l t, ta ñư c P02.
V i cách làm này, ta s l y nh ng giá tr t khác ∈ [0, 1] thì s ñư c t p ñi m P02.
ðó chính là ñư ng cong p(t).
Ta bi u di n b ng phương trình:
P01(t) = (1-t).P0 + t.P1

(1)

P11(t) = (1-t).P1 + t.P2

(2)

P02(t) = (1-t).P01 + t.P11

(3)

Thay (1), (2) vào (3) ta ñư c:
P(t) = P02(t) = (1-t)2.P0 + 2t.(1-t).P1 + t2.P2
ðây là m t ñư ng cong b c 2 theo t nên nó là m t Parabol.
T ng quát hóa ta có thu t toán Casteljau cho (L+1) ñi m:
Gi s ta có t p ñi m: P0, P1, P2, ..., PL
V i m i giá tr t cho trư c, ta t o ra ñi m Pir(t)

th h th r, t th h th (r - 1)

trư c ñó, ta có:
Pir(t) = (1-t).Pir-1(t) + t.Pi+1r-1(t)
r = 0,1,...,L

(3’)

và i = 0,...,L-r

Th h cu i cùng P0L (t) ñư c g i là ñư ng cong Bezier c a các ñi m P0,P1 ,P2,...,PL
Các ñi m Pi , i=0,1,...,L ñư c g i là các ñi m ki m soát hay các ñi m Bezier.
ða giác t o b i các ñi m ki m soát này g i là ña giác ki m soát hay ña giác Bezier.
6.1.2. D ng Bernstein c a các ñư ng cong Bezier
ðư ng cong Bezier d a trên (L+1) ñi m ki m soát P0 ,P1 , ...,PL ñư c cho b i công
th c:
L

P(t) =

∑ Pk.BkL(t)
k=0

70
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
Trong ñó, P(t) là m t ñi m trong m t ph ng ho c trong không gian.
BkL(t) ñư c g i là ña th c Bernstein, ñư c cho b i công th c:
BkL(t) =

L!
(1-t)L-k.tk
k !( L − k )!

v iL≥k

M i ña th c Bernstein có b c là L. Thông thư ng ta còn g i các BkL(t) là các hàm
tr n (blending function).
Tương t , ñ i v i m t Bezier ta có phương trình sau:
M

L

i =0

P(u,v) =

i =0

∑ ∑ Pi,k.BiM(u).BkL(v)

Trong trư ng h p này, kh i ña di n ki m soát s có (M+1).(L+1) ñ nh.
P1

P 01

P 11
P 02

P1
P2

ðư ng cong Bezier b c 2

ðư ng cong Bezier b c 3
Hình 6.1

6.1.3. D ng bi u di n ma tr n c a ñư ng Bezier
ð thích h p cho vi c x lý trên máy tính, ta bi u di n hai m ng BL(t) và P như
sau:
BL(t) = (B0L(t), B1L(t), ..., BLL(t))
P = (P0 ,P1 , ...,PL )
Do ñó: P(t) = BL(t).P
P(t) = BL(t).PT

hay

(tích vô hư ng)
(PT là d ng chuy n v c a P)

Dư i d ng ña th c, có th bi u di n BkL(t) như sau:
BkL(t) = a0 + a1.t + a2.t2 + ... + aL.tL = (t0,t1,...,tL).(a0 ,a1 ,...,aL)
Do ñó P(t) có th bi u di n l i như sau:
P(t) = PowL(t).BezL.PT
V i:
• PowL(t) = (t0,t1,...,tL)

71
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
• BezL là ma tr n bi u di n m ng BL(t) trong ñó m i hàng i c a ma tr n ng v i
các h s tương ng (a0 ,a1 ,...,aL) c a ña th c BiL(t) và t i v trí (i,j) trong ma tr n BezL
có giá tr BezL(i,j) = (-1)j-i.Cni.Cij
Ví d : Ma tr n Bez3 cho các ñư ng Bezier b c 3
1 0 0

−3 3 0
3
Bez = 
 3 −6 3

 −1 3 −3

0

0
0

1

6.1.4. T o và v các ñư ng Bezier
ð t o ra m t ñư ng cong Bezier t m t dãy các ñi m ki m soát ta s áp d ng
phương pháp l y m u hàm p(t)

các giá tr cách ñ u nhau c a tham s t, ví d có th

l y ti = i/N, i=0,1,...,N. Khi ñó ta s ñư c các ñi m P(ti) t công th c Bezier.
N i các ñi m này b ng các ño n th ng ta s ñư c ñư ng cong Bezier g n ñúng. ð
tính P(ti) ta có th áp d ng ma tr n c a P(t)

trên trong ñó ch có thành ph n PowL(ti)

là thay ñ i, còn tích BezL.PT v i P = (P0 ,P1 , ...,PL ) là không thay ñ i.
Sau ñây là th t c minh h a vi c v ñư ng cong Bezier trong m t ph ng:
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;
72
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
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;
73
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
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. Các tính ch t c a ñư ng cong Bezier
i/ N i suy ñư c các ñi m ñ u và cu i.
Ch ng minh:
L

Ta có:

P(t) =

∑ Pk.BkL(t)
k=0
L

Do ñó

P(0) =

∑ Pk.BkL(0)
k=0

trong ñó: BkL(0) =
=

L!
(1-0)L-k.0k
k !( L − k )!
L!
.0 = 0
k !( L − k )!

P(0)

= P0.B0L(0)

+ PL.BLL(0)

= P0

Vì v y,

∀k ≠ 0 và k ≠ L

+ 0

= P0

Lý lu n tương t cho P(1). Ta có P(1) = PL.
ii/ Tính b t bi n Affine:
Khi bi n ñ i m t ñư ng cong Bezier, ta không c n bi n ñ i m i ñi m trên ñư ng
cong m t cách riêng r mà ch c n bi n ñ i các ñi m ki m soát c a ñư ng cong ñó r i
s d ng công th c Bernstein ñ tái t o l i ñư ng cong Bezier ñã ñư c bi n ñ i.
Ch ng minh:
Gi s ñi m P(t) bi n ñ i Affine thành P’(t)
74
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
L

P’(t) = P(t).N + tr =

∑ Pk.BkL(t).N + tr
k=0

Trong ñó:
N: ma tr n bi n ñ i.
tr: vector t nh ti n.
L

Xét ñư ng cong

∑ (Pk.N + tr).BkL(t)

(*)

k=0

ñư c t o ra b ng cách bi n ñ i Affine các vector Pk. Ta s ch ng minh ñư ng cong
này chính là P’(t).
L

L

∑ Pk.N.BkL(t) +

∑ tr.BkL(t)

k=0

Khai tri n (*) ta có:

k=0

L

L

k=0

=

k=0

∑ Pk.N.BkL(t) + tr. ∑ BkL(t)

(**)

L

Nhưng theo ña th c Bernstein thì

∑ BkL(t) = (1-t+t)L = 1 nên s

h ng th hai c a

k=0

(**) s là tr.
Vì v y, P’(t) n m trên ñư ng cong Bezier t o ra b i các ñi m ki m soát Pk.
iii/ Tính ch t c a bao l i: ñư ng cong Bezier P(t) không bao gi ñi ra ngoài bao l i
c a nó.
ñây, bao l i c a các ñi m ki m soát là t p ñ nh nh nh t ch a t t c các ñi m
ki m soát ñó.
Ch ng minh:
Bao l i c a các ñi m ki m soát cũng chính là t p h p các t h p l i c a các
ñi m ki m soát.
Ta bi u di n t h p tuy n tính c a các ñi m Pk:
L

P(t) =

∑ ak.Pk

,

ak ≥ 0

k=0

Do P(t) là t h p l i c a các ñi m ki m soát ∀t ∈ [0,1] và

L

∑ BkL(t) = 1
k=0

Nên ñư ng cong Bezier s n m trong bao l i c a các ñi m ki m soát.
iv/ ð chính xác tuy n tính:
ðư ng cong Bezier có th tr thành m t ñư ng th ng khi t t c các ñi m ki m
soát n m trên m t ñư ng th ng vì khi ñó bao l i c a chúng là m t ñư ng th ng
75
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
nên ñư ng Bezier b k p vào bên trong bao l i nên nó cũng tr thành ñư ng
th ng.
v/ B t kỳ m t ñư ng th ng hay m t ph ng nào cũng luôn luôn c t ñư ng cong
Bezier ít l n hơn so v i c t ña giác ki m soát.
vi/ ð o hàm c a các ñư ng Bezier:
L−1

Ta có:

(P(t))’ = L. ∑ ∆Pk.BkL-1(t) ,

∆Pk = Pk+1 - Pk

k =0

Do ñó, ñ o hàm c a ñư ng cong Bezier là m t ñư ng cong Bezier khác ñư c
t o ra t các vector ki m soát ∆Pk ( Ta ch c n l y các ñi m ki m soát g c theo
t ng c p ñ t o ra các ñi m ki m soát cho (P(t))’.
6.1.6. ðánh giá các ñư ng cong Bezier
B ng các ñi m ki m soát, ta có th t o ra các d ng ñư ng cong khác nhau b ng
cách hi u ch nh các ñi m ki m soát cho t i khi t o ra ñư c m t d ng ñư ng cong
mong mu n. Công vi c này l p ñi l p l i cho ñ n khi toàn b ñư ng cong th a yêu
c u.
Tuy nhiên, khi ta thay ñ i b t kỳ m t ñi m ki m soát nào thì toàn b ñư ng cong b
thay ñ i theo. Nhưng trong th c t , ta thư ng mong mu n ch thay ñ i m t ít v d ng
ñư ng cong

g n khu v c ñang hi u ch nh các ñi m ki m soát.

Tính c c b y u c a ñư ng cong Bezier ñư c bi u hi n qua các ña th c BkL(t) ñ u
khác 0 trên toàn kho ng [0,1]. M t khác ñư ng cong p(t) l i là m t t h p tuy n tính
c a các ñi m ki m soát ñư c gia tr ng b i các hàm BkL(t) nên ta k t lu n r ng m i
ñi m ki m soát có nh hư ng ñ n ñư ng cong
ch nh b t kỳ m t ñi m ki m soát nào cũng s

t t c các giá tr t ∈ [0,1]. Do ñó, hi u
nh hư ng ñ n d ng c a toàn th ñư ng

cong.
ð gi i quy t bài toán này, ta s d ng m t t p h p các hàm tr n khác nhau. Các
hàm tr n này có giá mang (support: kho ng mà trên ñó hàm l y giá tr khác 0) ch là
m t ph n c a kho ng [0,1]. Ngoài giá mang này chúng có giá tr là 0.
Thư ng ta ch n các hàm tr n là các ña th c trên các giá mang ñó, các giá mang này
k nhau. Như v y, các hàm tr n chính là m t t p các ña th c ñư c ñ nh nghĩa trên
nh ng kho ng k nhau ñư c n i l i v i nhau ñ t o nên m t ñư ng cong liên t c. Các

76
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
ñư ng cong k t qu ñư c g i là ña th c riêng ph n hay t ng ph n (piecewise
polynomial).
Ví d : ta ñ nh nghĩa hàm g(t) g m 3 ña th c a(t), b(t), c(t) như sau:
1 2

a(t) = 2 t

3
3

g(t) = b(t) = - (t - )2
4
2

1
2
c(t) = (3 - t)

2


coï mang[0,1]
giaï
coï mang[1,2]
giaï
coï mang[2,3]
giaï

Giá mang c a g(t) là [0,3]
Các giá tr c a t ng v i các ch n i c a các ño n g i là nút (knut), ch ng h n
t=0,1,2,3 là b n nút c a g(t). Hơn n a, t i các ch n i c a ñư ng cong g(t) là trơn,
không b g p khúc. Do ñó, ta g i ñó là hàm Spline.
V y, m t hàm Spline c p m là ña th c riêng ph n c p m có ñ o hàm c p m -1
liên t c

m i nút.

D a trên tính ch t c a hàm Spline, ta có th dùng nó như các hàm tr n ñ t o ra
ñư ng cong p(t) d a trên các ñi m ki m soát P0,...,PL. Khi ñó:
L

P(t) =

∑ Pk.gk(t)
k=0

T ng quát hóa, ta xây d ng m t hàm p(t) v i L+1 ñi m ki m soát như sau:
V i m i ñi m ki m soát Pk , ta có m t hàm tr n tương ng Rk(t) và t p các nút g i
là vector nút T=(t0,t1,...,tn) v i ti ∈ R, ti ≤ ti+1 . Khi ñó:
L

P(t) =

∑ Pk.Rk(t)
k=0

6.2. ðƯ NG CONG SPLINE VÀ B-SPLINE
6.2.1. ð nh nghĩa
L

Theo trên ta có:

P(t) =

∑ Pk.Rk(t)

(*)

k=0

trong ñó

Pk v i k=1..L là các ñi m ki m soát.
Rk(t) là các hàm tr n liên t c trong m i ño n con [ti , ti+1]và liên t c trên

m i nút. M i Rk(t) là m t ña th c riêng ph n.
Do ñó ñư ng cong p(t) là t ng c a các ña th c này, l y trên các ñi m ki m soát.

77
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
Các ño n ñư ng cong riêng ph n này g p nhau

các ñi m nút và t o cho ñư ng

cong tr nên liên t c. Ta g i nh ng ñư ng cong như v y là SPLINE.
Cho trư c m t vector nút thì có th có nhi u h hàm tr n ñư c dùng ñ t o ra m t
ñư ng cong Spline có th ñ nh nghĩa trên vector nút ñó. M t h các hàm như v y ñư c
g i là cơ s cho các Spline.
Trong s các h hàm này, có m t cơ s c th mà các hàm tr n c a nó có giá mang
nh nh t và nh v y nó ñem l i kh năng ki m soát c c b l n nh t. ðó là các BSpline, v i B vi t t t c a ch Basic (cơ s ).
ð i v i các hàm B-Spline, m i ña th c riêng ph n t o ra nó có m t c p m nào ñó.
Do ñó, thay vì dùng ký hi u Rk(t) cho các hàm riêng ph n này ta s ký hi u các hàm
tr n này là Nk,m(t).
L

Do ñó các ñư ng cong B-Spline có th bi u di n l i: P(t) =

∑ Pk.Nk,m(t)
k=0

TÓM L I
ð xây d ng các ñư ng cong B-Spline ta c n có:
• M t vector nút T=(t0, t1, t2, ...,tk+m-1).
• (L+1) ñi m ki m soát.
• C p m c a các hàm B-Spline và công th c cơ b n cho hàm B-Spline Nk,m(t) là:
 t − tk 
 .Nk,m-1(t) +
 t k + m − 1 − tk 

Nk,m(t) = 

 tk + m − t 

 .Nk+1,m-1(t) v i k=0..L
 tk + m − tk + 1 

1 tk π t ≤ tk + 1
laûi
 0 ngæåüc

ðây là m t công th c ñ quy v i Nk,L(t) = 

(Hàm h ng b ng 1 trên ño n (tk , tk+1)
ð i v i các m t B-Spline, ta có công th c bi u di n tương t :
M

L

i =0

P(u,v) =

k=0

∑ ∑ Pi,k.Ni,m(u).Nk,m(v)

Nh n xét: Các ñư ng Bezier là các ñư ng B-Spline.
6.2.2. Các tính ch t h u ích trong vi c thi t k các ñư ng cong B-Spline
i/ Các ñư ng B-Spline c p m là các ña th c riêng ph n c p m. Chúng là các
Spline do chúng có m-2 c p ñ o hàm liên t c

m i ñi m trong giá mang c a

chúng.

78
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
Các hàm B-Spline c p m t o thành m t cơ s cho b t kỳ Spline nào có cùng
c p ñư c ñ nh nghĩa trên cùng các nút. Các Spline có th ñư c bi u di n như
m t t h p tuy n tính c a các B-Spline.
ii/ Hàm tr n B-Spline Nk,m(t) b t ñ u

tk và k t thúc

tk+m . Giá mang c a nó là

[tk,tk+m]. Giá mang c a h các hàm Nk,m(t) v i k=0,...L là kho ng [t0,tm+L].
iii/ M t ñư ng cong B-Spline ñóng d a trên L+1 ñi m ki m soát có th ñư c t o ra
b ng cách dùng phương trình ñư ng B-Spline tu n hoàn sau:
L

P(t) =

∑ Pk.N0,m((t-k) mod (L+1))
k=0

V i gi thi t các nút cách ñ u nhau trong ñ nh nghĩa c a hàm N0,m(...).
iv/ N u dùng vector chu n thì ñư ng cong B-Spline s n i suy các ñi m ki m soát
ñ u tiên và cu i cùng. Các hư ng kh i ñ u và k t thúc c a ñư ng cong ñó s
n m d c theo các c nh ñ u tiên và cu i cùng c a ña giác ki m soát.
v/ M i hàm B-Spline Nk,m(t) là không âm ∀t, và t ng các h hàm này b ng 1:
L

∑ Nk,m(t) = 1

∀t ∈ [t0 , tm+L ]

k=0

vi/ Các ñư ng cong d a trên các B-Spline là b t bi n Affin. Do ñó, ñ bi n ñ i
m t ñư ng cong B-Spline, ch c n bi n ñ i các ñi m ki m soát, sau ñó kh i t o
l i ñư ng cong t các ñi m ki m soát ñã ñư c bi n ñ i này.
vii/ M t ñư ng cong B-Spline s n m trong bao l i c a các ñi m ki m soát
M nh hơn:

b t kỳ t nào, ch có m hàm B-Spline là khác 0. Vì v y,

m i t ñư ng

cong ph i n m trong bao l i c a h u h t m ñi m ki m soát kích ho t k nhau.
(Các ñi m ki m soát kích ho t là các ñi m mà t i ñó hàm B-Spline khác 0)
viii/ð chính xác tuy n tính c a ñư ng cong B-Spline: N u m ñi m ki m soát k
nhau là tuy n tính cùng nhau thì bao l i c a chúng là m t ñư ng th ng. Do ñó
ñư ng cong cũng s tr thành ñư ng th ng.
ix/ Tính ch t gi m ñ bi n thiên: S giao ñi m gi a ñư ng cong B-Spline v i b t
kỳ m t m t ph ng nào (n u có) luôn luôn nh hơn s giao ñi m (n u có) gi a
ña giác ki m soát c a nó v i m t ph ng ñó.
6.2.3. Thi t k các m t Bezier và B-Spline

79
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
Ta có th dùng các hàm tr n Bezier và B-Spline ñ mô t và v các m t cong. ð i
v i các m t cong, ta bi u di n chúng dư i d ng tham s qua m t hàm vector v i 2
tham s là u, v. D ng t ng quát c a m t m t 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 bi n thiên trên m t kho ng nào ñó thì các hàm X(u,v), Y(u,v) và Z(u,v)
thay ñ i giá tr , do ñó làm cho v trí c a p(u,v) thay ñ i trong không gian 3 chi u.
Chúng ta s không bi u di n các m t qua các hàm toán h c tư ng minh mà s bi u
di n chúng qua các ñi m ki m soát.
Ví d : p(u,v) = (1-v).((1-u).P00 + u.P10) + v.((1-u).P01 + u.P11) dùng 4 ñi m ki m
soát

4 góc là Pij v i các hàm tr n là tuy n tính theo u, v.

6.2.4. Các băng Bezier
ðư ng cong Bezier trong không gian 3 chi u có th ñư c vi t dư i d ng là m t
hàm c a tham s v v i L+1 ñi m ki m soát tùy thu c vào tham s u theo m t ki u nào
L

ñó: Ch ng h n

P(u,v) =

∑ Pk(u).BkL(v)

(*)

k=0

Nghĩa là m i ñư ng vi n u là m t ñư ng cong Bezier chu n, nhưng
u khác nhau thì các ñi m ki m soát cũng n m

nh ng giá tr

nh ng v trí khác nhau.

Khi u bi n thiên thì m i ñi m ki m soát Pk(u) s ch y trên m t ñư ng cong c th .
Do ñó, m t cong có th xem như là m t s d ch chuy n ñư ng Bezier trong không
gian.
Ta tư ng tư ng m t ña giác ki m soát chuy n ñ ng trong không gian và thay ñ i
d ng khi chuy n ñ ng.

m i v trí, ña giác này t o nên m t ñư ng cong Bezier và

m t cong t o thành chính là cái v t còn ñ l i bên dư i c a ñư ng cong này.
Ví d : Phép chi u ph i cách c a m t m t ñư c t o ra b i vi c n i suy tuy n tính
gi a 2 ñư ng cong Bezier d a trên 2 ña giác ki m soát là P0 và P1. M i ñư ng cong
ki m soát pk(u) ñư c n i suy tuy n tính gi a 2 ñi m ki m soát Pk0 và Pk1 khi u bi n
thiên gi a 0 và 1:
pk(u) = (1-u).Pk0 + u.Pk1

k=0,1,2,3

Gi s các ñư ng cong ki m soát pk(u) chính là các ñư ng cong Bezier, m i ñư ng
cong này d a trên m +1 ñi m ki m soát c a chúng.

80
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
M

Vì v y: Pk(u) =

∑ Pi,k.BiM(u)
i =0

K t h p pk(u) này vào phương trình (*) ta ñư c:
M

i =0

P(u,v) =

L

k=0

∑ ∑ Pi,k.BiM(u).BkL(v)

(**)

Ta g i ñây là d ng tích Tensor cho băng Bezier.
Cũng gi ng như các ña giác ki m soát trong 2D, m t kh i ña di n ki m soát là m t
m ng g m có (M+1).(L+1) ñ nh.
Tóm l i, ñ t o ra m t băng ta ch c n ch ra các v trí c a các ñ nh này r i sau ñó áp
d ng phương trình (**) ñ v các ñư ng vi n hay ñ nh nghĩa d ng m t cong.
6.2.5. Dán các băng Bezier v i nhau
M c ñích là ñ t o ra các d ng m t ph c t p g m nhi u băng Bezier k t l i v i nhau
m t cách trơn tru

các biên chung.

Khi n i 2 băng Bezier l i v i nhau, m i băng có m t kh i ña di n ki m soát riêng
và ñ u ñư c t o ra t phương trình (*) v i u, v bi n thiên trong kho ng [0,1]. V n ñ
là làm sao cho 2 băng có th dán vào nhau m t cách trơn tru.
• Hai băng s g p nhau

t t c các ñi m d c theo biên chung n u các kh i ña di n

ki m soát c a chúng kh p nhau

biên. Như v y, ta ch c n ch n các ña giác ki m soát

biên ñ cho 2 băng ñ ng nh t nhau
trong phương trình (*)

biên. Có th th y ñư c ñi u này khi thay u=0 vào

trên.

• M t ñi u ki n ñ n a là m i c p c nh c a kh i ña di n mà nó g p nhau

biên

ph i tuy n tính cùng nhau.
6.2.6. Các băng B-Spline
Các hàm B-Spline có th ñư c s d ng trong d ng tích Tensor thay cho các ña th c
Bernstein ñ ñ t ñư c tính ki m soát cao hơn khi thi t k m t cong. ði u ñó có nghĩa
ta s thay phương trình (**) thành:
M

L

i =0

P(u,v) =

k=0

∑ ∑ Pi,k.Ni,m(u).Nk,m(v)

Kh i ña di n ki m soát g m có (L+1).(M+1) ñi m ki m soát; u,v bi n thiên t 0 t i
giá tr nút l n nh t trong các vector nút tương ng c a chúng.

81
Chương VI. Thi t k ñư ng cong và m t cong Bezier và B-Spline
ð i v i các băng B-Spline, ngư i ta v n dùng các B-Spline b c 4. Do vi c ch n s
ñi m ki m soát là không gi i h n nên có th t o ra nhi u d ng m t cong r t ph c t p.
T t nhiên khi thi t k , ta ph i ch n kh i ña di n nút ñ t o ra m t có d ng mong
mu n.

82
CHƯƠNG VII

KH

ðƯ NG VÀ M T KHU T

7.1. CÁC KHÁI NI M
M t v t th 3D có th bi u di n trong máy tính b ng nhi u mô hình khác nhau, song
hai mô hình ph bi n nh t ñó là mô hình khung dây (WireFrame) và mô hình các m t
ña giác ( Polygon mesh model)
• Mô hình WireFrame: ðã trình bày

chương 5, nó cho ta hình dáng c a v t th

dư i d ng m t b khung
• Mô hình các m t ña giác:

ñây m t v t th 3D ñư c xác ñ nh thông qua các m t

(thay vì các c nh như trong mô hình WireFrame), và m i m t m t l i ñư c xác
ñ nh thông qua các ñi m mà các ñi m này ñư c xem như là các ñ nh c a m t ña
giác, v i mô hình các m t ña giác thì chúng ta không ch t o ra ñư c hình dáng c a
v t th như mô hình Wireframe mà còn th hi n ñư c các ñ c tính v màu s c và
nhi u tính ch t khác c a v t th . Song ñ có th mô t v t th 3D m t cách trung
th c (như trong th

gi i

M t1

2

th c) thì ñòi h i ngư i l p
1

trình ph i tính toán và gi l p
nhi u thông tin, mà m u ch t

M t5

là v n ñ kh m t khu t và
chi u

sáng.Trong

này chúng ta s

3

M t4

chương
t p trung

M t3
5

nghiên c u v n ñ kh m t
khu t.

4

Ví d : Mô t v t th như trong

M t2
6

hình 7.1.
- Danh sách các ñ nh: 1,2,3,4,5,6

Hình 7.1

- Danh sách các m t ñư c xác ñ nh theo b ng sau:
M t

ð nh
Chương VII. Kh ñư ng và m t khu t
1

1,2,3

2

4,5,6

3

1,3,6,4

4

3,2,5,6

5

1,2,5,4

Chúng ta có th ñưa ra nhi u c u trúc d li u khác nhau ñ lưu tr cho ña giác. Dư i
ñây là phát th o m t ki u c u trúc:
Type Point3D = Record

{ði m 3 chi u}

x,y,z:real;
end;
Vector3D = Record

{Vector 3 chi u. M c dù nó gi ng v i

x,y,z:real; Point3D song ta v n khai ñ các thu t toán
ñư c tư ng minh}

end;
RGBColor = Record

{C u trúc màu s c c a m t m t}

B,G,R:Byte;
end;
KieuMat = Record
PhapVT:Vector3D;

{Pháp vector c a m t}

Sodinh:cardinal;

{S ñ nh c a m t}

List:array of integer;{Danh sách th t các ñ nh t o
nên m t.
Color:RGBColor;

ñây ta dùng m ng ñ ng}

{màu s c c a m t}

end;
Obj3D = record

{ð i tư ng 3 chi u}

ObjName:string;

{Tên c a ñ i tư ng}

Sodinh:cardinal;

{S ñ nh}

Dinh: array of point3d; {Danh sách ñ nh.

ñây ta dùng

ki u m ng ñ ng}
SoMat:cardinal;

{S m t}

Mat:array of KieuMat; {Danh sách m t}
84
Chương VII. Kh ñư ng và m t khu t
Xworld,Yworld,Zworld,Zoom:Real;

{To ñ và kích

thư c th t c a v t trong h to ñ th gi i}
end;
Khi cài ñ t cho m t ng d ng c thì vi c s d ng m ng c ñ nh có th gây ra các
tr ng i v kích thư c t i ña hay t i thi u, cũng như vi c s d ng b nh không t i ưu.
Vì th ngoài cách dùng m ng c ñ nh, ta có th dùng m ng ñ ng trong m t s ngôn
ng như Visual Basic, Delphi hay Visual C++,… ho c dùng c u trúc danh sách móc
n i. Song song v i ñi u ñó là vi c b t ñi hay ñưa thêm các thu c tính c n thi t ñ bi u
di n các ñ c tính khác c a m t hay c a ñ i tư ng.

* V n ñ kh m t khu t
Khi th hi n v t th 3D, m t v n ñ n y sinh là làm sao ch th hi n các m t có th
nhìn th y ñư c mà không th hi n các m t khu t phía sau. Vi c m t m t b khu t hay
không b khu t thì tuỳ thu c vào c u trúc các m t c a v t th và v trí c a ñi m nhìn
cũng như b i c nh mà v t th ñó ñư c ñ t vào.
7.2. CÁC PHƯƠNG PHÁP KH

M T KHU T

7.2.1. Gi i thu t ngư i th sơn và s p x p theo chi u sâu (Depth-Sorting)
Ngư i th sơn (hay Depth-sorting) là tên c a m t thu t gi i ñơn gi n nh t trong s
các thu t toán v

nh th c 3 chi u. N u ñ ý ngư i th sơn làm vi c, chúng ta s th y

anh ta sơn b c tranh t trong ra ngoài, v i các c nh v t t xa ñ n g n. Chúng ta có th
áp d ng m t cách tương t ñ v các ña giác trong danh sách các ña giác. Song có m t
v n ñ c n ph i ch n l a, ñó là m t ña giác t n t i trong không gian 3D có t i ba b n
ñ nh, và nh ng ñ nh này có th có các giá tr z ( giá tr ñ sâu ) khác nhau. Chúng ta s
không bi t ch n giá tr nào trong s chúng. T nh ng kinh nghi m trong th c t , ngư i
ta cho r ng nên s d ng giá tr z trung bình s cho k t qu t t trong h u h t các trư ng
h p.
Như v y, chúng ta c n ph i s p x p các m t theo th t t xa ñ n g n, r i sau ñó v
các m t t xa trư c, r i v các m t
che khu t b i các m t
khu t, do các m t

g n sau, như th thì các m t

xa, mà ch có các m t

g n s không b

xa m i có th b các m t

g n che

g n v sau nên có th ñư c v ch ng lên hình nh c a các m t xa.

85
Chương VII. Kh ñư ng và m t khu t
Như v y, thu t gi i Depth-Sorting ñư c th c hi n m t cách d dàng khi chúng ta
xác ñ nh m t giá tr ñ sâu (là giá tr z trong h to ñ quan sát) ñ i di n cho c m t.
Các m t d a vào ñ sâu ñ i di n c a mình ñ so sánh r i s p x p theo m t danh sách
gi m d n (theo ñ sâu ñ i di n). Bư c ti p theo là v các m t lên m t ph ng theo th
t trong danh sách.
Gi i thu t còn m t s vư ng m c sau (hình 7.2):
Khi hai m t c t nhau thì thu t gi i này ch th hi n như chúng ch ng lên nhau.

Hình nh th t

Khi v b ng gi i thu t trên

Hình 7.2
Khi hai m t

trong cùng m t kho ng không gian v ñ sâu và hình chi u c a

chúng lên m t ph ng chi u ch ng lên nhau (hay ch ng m t ph n lên nhau). Ch ng
h n như:
Maët A
Maët B

Maét nhìn

Hình 7.3
T nh ng ví d trên chúng ta có th th y r ng, có nh ng trư ng h p các ña giác
ñư c s p x p sai d n ñ n k t qu hi n th không ñúng. Li u chúng ta có th kh c ph c
ñư c v n ñ này không? Câu tr l i dĩ nhiên là có nhưng cũng ñ ng nghĩa là chúng ta
s ph i x lý thêm r t nhi u các trư ng h p và làm tăng ñ ph c t p tính toán.
• Phép ki m tra ph n kéo dài Z

86
Chương VII. Kh ñư ng và m t khu t
Phép ki m tra này nh m xác ñ nh ph n kéo dài z c a hai ña giác có g i lên
nhau hay không? N u các ph n kéo dài Z là g i lên nhau r t có th các ña
giác này c n ñư c hoán ñ i. Vì th phép ki m tra ti p theo ph i ñư c th c
hi n.
• Phép ki m tra ph n kéo dài X
Phép ki m tra này tương t như phép ki m tra trư c, nhưng nó s ki m tra
ph n kéo dài X c a hai ña giác có g i lên nhau hay không? N u có, thì r t có
th các ña giác này c n ñư c hoán ñ i. Vì th phép ki m tra ti p theo ph i
ñư c th c hi n.
• Phép ki m tra ph n kéo dài Y
Phép ki m tra này ki m tra ph n kéo dài Y c a hai ña giác có g i lên nhau
hay không? N u có, thì r t có th các ña giác này c n ñư c hoán ñ i. Vì th
phép ki m tra ti p theo ph i ñư c th c hi n.
• Phép ki m tra c nh xa
Gi s A và B là hai ña giác mà sau khi s p x p theo ñ sâu trung bình thì A
ñ ng trư c B. Song qua 3 phép ki m tra trên mà v n không xác ñ nh ñư c
li u tr t t trên là ñúng hay chưa. Lúc này chúng ph i ti n hành phép ki m
tra c nh xa. Phép ki m tra c nh xa nh m xác ñ nh xem ña giác B có n m
phía sau c nh xa c a ña giác A hay không? N u có thì tr t t này là ñúng,
ngư c l i thì ph i qua bư c ki m tra ti p theo.
ð ki m tra ña giác B có n m sau c nh xa c a ña giác A hay không, chúng
ta th c hi n vi c ki m tra m i ñ nh c a ña giác B. Các ñ nh này ñ u n m v
cùng m t phía c a ña giác A theo chi u tr c Z không? N u ñúng thì k t qu
tr t t trên là ñúng. Ngư c l i, có th x y ra m t trong hai tình hu ng như
hình (7.2) ho c hình (7.3), ñ xác ñ nh ñư c ta ph i ti p t c sang bư c ki m
tra ti p theo.
• Phép ki m tra c nh g n
Phép ki m tra c nh g n nh m xác ñ nh xem ña giác A có n m phía sau c nh
g n c a ña giác B hay không? N u có thì tr t t xác ñ nh trư c ñây không
87
Chương VII. Kh ñư ng và m t khu t
ñúng, chúng ta c n ph i hoán ñ i l i tr t t . Ngư c l i thì rõ ràng hai ña giác
ñang c t nhau (như hình 7.2) ho c chéo vào nhau (hình 7.4), lúc này chúng
ta ph i ti n hành chia nh hai ña giác A và B thành 3 (ho c 4) ña giác con,
ñư ng chia c t chính là ñư ng giao c t c a 2 ña giác. Sau phép chia chúng
ta ti n hành s p x p l i các ña giác con.

Hình 7.4
7.2.2. Gi i thu t BackFace
S r t ñơn gi n n u ta dùng Vector pháp tuy n ñ kh các m t khu t c a m t ñ i
tư ng 3D ñ c và l i. Ta s tính góc gi a véc tơ hư ng nhìn V và pháp vector N c a
m t, n u góc này là l n hơn 90o thì m t là không nhìn th y (b khu t), ngư c l i thì
m t là kh ki n.
D u c a tích vô hư ng c a 2 vector là dương n u góc gi a chúng nh hơn hay b ng
90o. V y thu t toán ñ xét m t m t b khu t hay không ch ñơn gi n là:

If V.N >= 0 then M t th y
Else M t không th y (m t khu t);
M t nhìn
υ

Vector hư ng nhìn
Vì υ<90o nên m t
quan sát ñư c

Hình 7.5

88
Chương VII. Kh ñư ng và m t khu t

Hình 7.6

Cài ñ t minh ho cho thu t toán ch n l c m t sau
Function Tich_vo_huong(v,n:Vector3D):real;
{Tính tích vô hư ngc a 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 tư ng theo thu t toán ch n l c m t sau.
Trong ñó:
+ Obj: ch a ñ i tư ng 3D c n v
+ Canvas: V i v (hay vùng ñ m khung)
+ Width, Height: Kích thư c c a Canvas
+ Zooom: H s t l khi v ñ i tư ng (Hay h s thu phóng)
+ V: Vector hư ng nhìn. N u Obj ñã ñư c chuy n sang h to ñ quan sát O’UVN
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;
{Duy t qua t t c các m t c a ñ i tư ng}
89
Chương VII. Kh ñư ng và m t khu t
For k:=0 to Obj.SoMat-1 do
if Tich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0 then
{M t kh ki n}
begin
setlength(Poly,Obj.Mat[K].Sodinh);{Thi t l p ñ dài c a
m ng Poly b ng s ñ nh c a ña giác}
For i:=0 to Obj.Mat[K].Sodinh -1 do
{ðưa to ñ các ñ nh c a ña giác vào 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;
{Thi t l p màu cho bút tô trư c 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 giác v i màu ñã ñư c thi t l p}
end;
setlength(poly,0);
end;
Rõ ràng, thu t toán r t ñơn gi n và ñ ph c t p tính toán không cao. Song khi s
d ng ph i luôn ñ m b o r ng ñ i tư ng có ñ t tính là “ñ c và l i”, n u ñ i tư ng
không tho mãn ñi u ki n ñó thì chúng ta ph i áp d ng m t tho t toán khác hay có
nh ng s a ñ i c n thi t ñ tránh s th hi n sai l c.
7.2.3. Gi i thu t vùng ñ m ñ sâu (Z-Buffer)
B ng cách tính giá tr ñ sâu (là giá tr Z trong h to ñ quan sát) c a m i ñi m
trong t t c các m t ña giác, t i m i ñi m trên m t ph ng chi u có th có nh c a nhi u
ñi m trên nhi u m t ña giác khác nhau, song hình v ch ñư c th hi n hình nh c a
ñi m có ñ sâu th p nh t ( t c là ñi m

g n nh t). V i cách th c hi n này gi i thu t

có th kh ñư c t t c các trư ng h p mà các gi i thu t khác m c ph i.

90
Chương VII. Kh ñư ng và m t khu t
Gi i h n c a phương pháp này là ñòi h i nhi u b nh và th c hi n nhi u tính toán.
Z-Buffer là m t b ñ m dùng ñ lưu ñ sâu cho m i pixel trên hình nh c a v t th ,
thông thư ng ta t ch c nó là m t ma tr n hình ch nh t. N u dùng 1 byte ñ bi u di n
ñ sâu c a m t pixel, thì m t v t th có hình nh trên m t ph ng chi u là 100x100 s
c n 10000 byte dùng ñ làm Depth Buffer, và khi ñó vùng ñ m ñ sâu s cho phép ta
phân bi t ñư c 256 m c sâu khác nhau, ñi u này có nghĩa là n u có 257 pixel

257 ñ

sâu khác nhau thì khi ñó bu t ta ph i quy 2 pixel nào ñó v cùng m t ñ sâu. N u ta
dùng 4 byte ñ bi u di n ñ sâu c a m t pixel, thì khi ñó vùng ñ m ñ sâu s cho phép
ta phân bi t ñư c 4294967296 (232) m c sâu khác nhau, song lúc ñó s ph i c n 40000
byte cho m t b ñ m kích thư c 100x100. Do tính ch t 2 m t này nên tuỳ vào tình
hu ng và yêu c u mà ta có th tăng hay gi m s byte ñ lưu gi ñ sâu c a 1 pixel. Và
thông thư ng ngư i ta dùng 4 byte ñ lưu gi ñ sâu c a m t ñi m, khi ñó thì ñ chính
xác r t cao.
M t câu h i có th ñ t ra là làm sao có th tính ñ sâu c a m i ñi m trong ña giác.
ñây có 2 phương pháp: phương pháp tr c ti p và phương pháp gián ti p.
• Phương pháp tr c ti p s tính ñ sâu c a m i ñi m d a vào phương trình
m t ph ng ch a ña giác. V i phương pháp này chúng ta c n duy t qua t t
các ñi m c a ña giác (t t nhiên ch h u h n ñi m), b ng cách cho các thành
ph n x và y, n u c p giá tr (x,y) tho trong mi n gi i h n c a ña giác thì
chúng ta s tìm thành ph n th 3 là z b ng cách thay th x và y vào phương
trình m t ph ng ñ tính ra thành ph n z. V m t toán h c thì phương pháp
tr c ti p rõ ràng là r t khoa h c, song khi áp d ng ta s g p ph i vư ng m c:
C n ph i tính bao nhiêu ñi m ñ hình nh th hi n c a ña giác lên m t
ph ng chi u ñ m n và cũng không b tình tr ng quá m n (t c là v r t nhi u
ñi m ch ng ch t lên nhau không c n thi t mà l i gây ra tình tr ng ch m
ch p và tăng ñ ph c t p tính toán. Cũng nên nh r ng khi th hi n m t ña
giác lên m t ph ng chi u thì nh c a nó có th ñư c phóng to hay thu nh ).
• Phương pháp gián ti p: Chúng ta s tính ñ sâu c a m t ñi m gián ti p
thông qua ñ sâu c a các ñi m lân c n. ð th c hi n chúng ta ti n hành theo
các bư c sau:

91
Chương VII. Kh ñư ng và m t khu t
G i G là m t m t ña giác ñư c bi u di n b i t p các ñi m P1, P2, … Pn
và G’ là hình chi u c a G xu ng m t ph ng chi u v i t p các ñ nh
P1’,P2’,… Pn’.
ð th hi n hình nh c a G lên m t ph ng chi u thì rõ ràng là chúng ta
ph i ti n hành tô ña giác G’. Song như thu t toán ñã phát bi u, chúng ta
c n xác ñ nh xem m i ñi m M’ b t kỳ thu c G’ là nh c a ñi m M nào
trên G và d a vào ñ sâu c a M ñ so sánh v i ñ sâu ñã có trong zbuffer ñ quy t ñ nh là có v ñi m M’ hay không. N u ta gán thêm cho
các ñi m nh m t thành ph n n a, ñó là giá tr ñ sâu c a ñi m t o nh
(t c là ñi m ñã t o ra ñi m nh sau phép chi u) thì lúc này ta không c n
thi t ph i xác ñ nh M ñ tính ñ sâu, mà ta có th tính ñư c giá tr ñ sâu
này qua công th c sau:
N u M’ n m trên ño n th ng P’Q’ v i t l là: P’M’/P’Q’=t
và n u bi t ñư c ñ sâu c a P’ và Q’ l n lư t là z(P’) và z(Q’) thì ñ sâu
mà ñi m nh M’ nh n ñư c là
z(M’)=z(P’)+(z(Q’)-z(P’))t

(2.3.1)

Ta có th s d ng ñư c công th c trên v i t t c các phép chi u
có b o toàn ñư ng th ng. T ñó ta có th xác ñ nh quy trình v ña giác
G’ là nh c a G như sau:
+ Gán thêm cho m i ñi m ñ nh c a ña giác G’ m t thành ph n z có giá
tr b ng ñ sâu c a ñi m t o nh. Có nghĩa là P’1 s ch a thêm giá tr
z(P1), P’2 s ch a thêm giá tr z(P2), hay m t cách t ng quát P’i s ch a
thêm giá tr z(Pi) v i i=1..n.
Ti n hành tô ña giác G’ theo m t quy trình tương t như thu t toán tô
ña giác theo dòng quét. Có nghĩa là cho m t dòng quét ch y ngang qua
ña giác, t i m i v trí b t kỳ c a dòng quét, chúng ta ti n hành tìm t p
các giao ñi m c a dòng quét v i ña giác. G i {xm} là t p các giao ñi m,
m t ñi u c n chú ý là ta c n tính ñ sâu cho các giao ñi m này. Gi s xi
là giao ñi m c a ñư ng quét v i c nh Pi’Pj’ th thì ta có th tính ra ñ
sâu c a xi thông qua công th c (2.3.1) như sau:
92
Chương VII. Kh ñư ng và m t khu t
N u g i yscan là giá tr tung ñ c a dòng quét th thì:
z(xi) = z(Pi’)+z(Pj’)*[(yscan – y(Pi’))/(y(Pj’)-y(Pi’))]

(2.3.2)

{trong ñó y(P) là thành ph n to ñ y c a ñi m P}
Rõ ràng qua công th c trên ta th y, n u xi là trung ñi m c a Pi’Pj’ thì
z(xi) = z(Pi’)+z(Pj’)*1/2

Cài ñ t minh ho cho gi i thu t “vùng ñ m ñ sâu”
T nh ng phân tính trên chúng ta có th ti n hành khai báo các c u trúc d li u c n
thi t và cài ñ t cho thu t toán.
• Khai báo các c u trúc d li u c n thi t:
Sau ñây là các khai báo c n thi t ñ cho phép lưu tr m t ñ i tư ng 3D theo mô
hình các m t ña giác, cùng các khai báo c n thi t ñ ti n hành kh m t khu t
theo thu t toán z-Buffer theo ngôn ng Pascal trong môi trư ng c a trình biên
d ch Delphi
{B t ñ u ph n khai báo ph c v cho gi i thu t Z-buffer}
Type Z_BufferType=Array of Array of cardinal; {Ki u b ñ m Z,
ñây là m t m ng ñ ng 2 chi u mà m i ph n t có ki u cardinal, ñi u ñó có nghĩa là
vùng ñ m ñ sâu s cho phép ta phân bi t ñư c 4294967296 (232) m c sâu khác nhau}

NutPoly_Z=record

{C u trúc c a m t ñ nh c a ña giác chi u G’ }

x,y:Integer; {To ñ c a nh trên m t ph ng chi u}
z:real;

{Thành ph n ñ sâu ñi kèm (là ñ sâu c a t o nh)}

end;
Polygon_Z =array of NutPoly_Z;

{ða giác chi u là m t m ng

ñ ng. Như m t ña giác 2 chi u, song m i m t ñ nh
có ch a thêm thành ph n ñ sâu c a ñ nh}
CanhCat_Z=record

{C u trúc c a các c nh ña giác ñư c xây d ng
nh m ph c v cho quá trình tính giao ñi m}

y1,y2:Integer;

{Tung ñ b t ñ u và k t thúc c a m t c nh
(y1<=y2)}
93
Chương VII. Kh ñư ng và m t khu t
xGiao:real; {hoành ñ xu t phát c a c nh. Song trong quá trình
tính toán nó s là tung ñ giao ñi m c a c nh v i
ñư ng quét ngang}
xStep:real; {Giá tr thay ñ i c a x khi y thay ñ i 1 ñơn v , nó cho
bi t ñ d c c a c nh}
zGiao:real; {Giá tr ñ sâu t i ñi m xu t phát c a c nh. Song
trong quá trình tính toán nó s là giá tr ñ sâu c a
giao ñi m v i ñư ng quét ngang}
zStep:real; {Giá tr ñ sâu c a giao ñi m ti p theo so v i giá tr
ñ sâu c a giao ñi m trư c ñó s chênh l ch nhau
m t kho ng là zStep}
end;
DanhSachCanhCat_Z=array of CanhCat_Z; {Danh sách các c nh
ñư c t o ra t ña giác chi u G’, danh sách này nh m ph v cho quá trình tính
toán các giao ñi m v i ñư ng quét cũng như ñ sâu c a m i giao ñi m}
GiaoDiem_Z=record

{Lưu to ñ giao ñi m và ñ sâu tương ng v i
giao ñi m ñó}

x,y:Integer;
z:real;

{To ñ giao ñi m}
{Giá tr ñ sâu}

ChiSoCanh:integer; {Ch s c nh c t t o ra giao ñi m (Nh m m c
ñích kh các giao ñi m th a)}
end;
DanhsachGiaoDiem_Z=array of GiaoDiem_Z;
{K t thúc ph n khai báo ph c v cho gi i thu t Z-buffer}

Procedure DrawObj(Obj:Obj3D; Zmin,ZMax:Real;
Z_Buffer:Z_BufferType; Canvas:TCanvas;
Width,Height:integer; Zoom:real);
{ð u vào: + ð i tư ng 3D ch a trong Obj
+ Gi i h n ñ sâu trong không gian mà chương trình x lý là t Zmin ñ n
Zmax. Ta s th c hi n ánh x các giá tr ñ sâu tính ñư c c a các ñi m trên ña
94
Chương VII. Kh ñư ng và m t khu t
giác sang ño n 0..4294967294. Bi t r ng ñ sâu Zmin ng v i 0 và Zmax ng
v i 4294967294. (ñ sâu 4294967295 làm giá tr m c ñ nh cho các ñi m n n
+ Z_Buffer: là ma tr n ch a ñ sâu các ñi m nh c a các ñ i tư ng ñã th
hi n trên Canvas (xem như là m t ph ng chi u). N u ta chưa v ñ i tư ng nào
trư c ñó thì Z_Buffer ñư c kh i ñ ng là 4294967295
Canvas: T m v i v . Chúng ta s th c hi n v hình nh c a ñ i tư ng lên
Canvas.
Width,Height: Là chi u r ng và cao c a Canvas
+ Zoom: t l th hi n ñ i tư ng lên Canvas sau khi th c hi n phép chi u,
ta có th hi u nôm na là t l thu phóng.}
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 {Duy t qua t t c các m t ña giác}
begin
setlength(Poly,Obj.Mat[K].Sodinh);
{Thi t l p s ph n t c a Poly b ng s ñ nh c a m t mà nó s p ch a}
For i:=0 to Obj.Mat[K].Sodinh -1 do
{Duy t qua t t c các ñ nh c a m t và thi t l p giá tr cho m i ñ nh
c a Poly}
begin
P:=Obj.Mat[K].list[i]; {ð nh th i trong ña giác K s
là ñ nh th P trong danh sách ñ nh c a Obj}
{Dùng phép chi u tr c giao ñ chi u ñi m Obj.dinh[P] xu ng m t
ph ng OXY ta ñư c t a ñ

nh là (Obj.dinh[P].y,Obj.dinh[P].x),

r i sau ñó phóng theo t l là Zoom và t nh ti n theo vector (cx,cy)
nh m giúp ñưa hình nh ra vùng gi a Canvas}
Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx;

95
Chương VII. Kh ñư ng và m t khu t
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 ñ sâu c a ñ nh Poly[i] là giá tr Obj.dinh[P].z song ñư c
ánh x vào ño n 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 t c tô màu m t ña giác theo thu t toán 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:Gi i h n ch s c a m ng Poly
D:Danh sách các c nh ñư c t o ra t Poly, ch a nh ng thông tin c n thi t ñ
tính giao ñi m và ñ sâu c a giao ñi m m t cách nhanh chóng
ND: S ph n t c a m ng D
G: Ch a danh sách các giao ñi m có ñư c sau m i l n dòng quét thay ñ i
NG:s ph n t c a m ng G}
Procedure TaoDanhSachCanhCat;
{Th t c này t o ra danh sách D, là danh sách các c nh c a ña giác t thông
tin ñ u vào Poly}
Var i,d1,d2,Dem,Dy,Cuoi:integer;
begin
96
Chương VII. Kh ñư ng và m t khu t
{Xác ñ nh s c nh c a ña giác}
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;
{T o ra các c nh}
For i:=L to Cuoi do
begin
If i<H then j:=i+1 else j:=L;
{Xác ñ nh ñi m ñ u và ñi m cu i c a c nh, ñi m ñ u là ñi m 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;
{Lưu tr tung ñ xu t phát và k t thúc}
D[dem].xGiao:=Poly[d1].x;
{Tung ñ xu t phát. Kh i ñ u thì (D[dem].y1,D[dem].xGiao) chính là to ñ
c a ñi m ñ u c a c nh}
D[dem].zGiao:=Poly[d1].z;
{ð sâu c a giao ñi m t i ñi m ñi m ñ u c a c nh}
Dy:=(Poly[d2].y-Poly[d1].y);
97
Chương VII. Kh ñư ng và m t khu t
{ð chênh l ch tung ñ c a ñi m ñ u và ñi m cu i}
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 ñ chênh l ch Dy ta suy ra gia tr ng c a x và ñ sâu z khi giá tr y tăng 1
ñơn v . N u khi dòng quét ñi qua ñi m ñ u thì to

ñ

giao ñi m là

(D[dem].y1,D[dem].xGiao) v i ñ sâu là D[dem].zGiao, n u sau ñó dòng quét
tăng

ñơn

1

v

thì

rõ

ràng

to

(D[dem].y1+1,D[dem].xGiao+D[dem].xStep)

ñ
và

giao
ñ

ñi m
sâu

s
s

là
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;
{T o danh sách các giao ñi m v i ñư ng quét có tung ñ y hi n th i}
Var i:integer;
Begin
Setlength(G,ND);
NG:=0;
{Duy t qua t t c các c nh}
for i:=0 to ND-1 do
begin
If (D[i].y1<=y)and(y<=D[i].y2) then
{Có giao ñi m v i ñư ng quét y}
Begin
98
Chương VII. Kh ñư ng và m t khu t
{Lưu l i to ñ giao ñi m và ñ sâu}
G[NG].x:=round(D[i].xGiao);
G[NG].y:=y;
G[NG].z:=D[i].zGiao;
G[NG].ChiSoCanh:=i;
{Ch s c nh ñã t o ra giao ñi m. Nh m ph c v cho quá trình l c
b các giao ñi m không c n thi t}
{Lưu l i Tung ñ và ñ sâu c a giao ñi m v i ñư ng quét ti p theo
(y+1) vào chính 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;
{S p x p l i các giao ñi m và l c b các giao ñi m th a}
Var i,j,C1,C2:integer;
Tg:GiaoDiem_Z;
Begin
{S p x p l i các giao ñi m}
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 nh ng Giao ñi m th a}
While i<(NG-2) do
begin
If G[i].x=G[i+1].x then {2 giao ñi m trùng nhau}
99
Chương VII. Kh ñư ng và m t khu t
begin
C1:=G[i].ChiSoCanh;
C2:=G[i+1].ChiSoCanh;
{C1 và C2 là hai c nh ñã t o nên 2 giao ñi m trùng nhau ñang xét}
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á b t m t giao ñi m n u như: 2 c nh t o nên 2 giao ñi m này
n m v hai phía c a ñư ng quét ho c có m t c nh là n m 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;
{Th c hi n tô màu các ño n th ng là ph n giao c a ñư ng quét v i ña giác.
ðó là các ño n x1x2, x3x4,…}
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
{V i m i ño n ta th c hi n tính ñ sâu c a t ng ñi m r i so sánh v i
giá tr có trong Z_Buffer}
begin
100
Chương VII. Kh ñư ng và m t khu t
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 sánh ñ sâu c a ñi m tính ñư c v i ñ sâu ñã có }
{N u ñ sâu c a ñi m tính ñư c nh hơn ñ sâu ñã có trong
Z_Buffer thì rõ ràng là ñi m tính ñư c

g n hơn ñi m ñã v

trư c ñó trong vùng ñ m Z và Canvas}
Begin
Canvas.Pixels[x,G[i].y]:=Color;
{V ñi m lên Canvas}
Z_Buffer[x,G[i].y]:=Z; {C p nh t ñ sâu c a
ñi m v a v vào vùng ñ m Z}
end;
end;
G[i].z:=G[i].z+Dz; {Gán giá tr ñ sâu c a ñi m ti p
theo vào trong G[i].z}
end;
i:=i+2;
end;
end;
{Th t c chính}
Begin
L:=low(Poly);
H:=High(Poly);
{Xác ñ nh gi i h n trên và gi i h n dư i c a Poly}
Z_BufferW:=high(Z_Buffer); {Xác ñ nh các chi u c a ma tr n Z_Buffer}
Z_BufferH:=high(Z_Buffer[0]);
{Z_BufferW+1:Chi u r ng (t 0..Z_BufferW)
Z_BufferH+1:Chi u cao (t 0..Z_BufferH)}

101
Chương VII. Kh ñư ng và m t khu t
{ Tìm giá tr y l n nh t và nh nh t c a ña giác Poly ñ t ñó cho dòng quét th c hi n
quét t trên 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; {T o danh sách các c nh c a ña giác Poly v i các tham
s thi t l p nh m giúp cho vi c tính toán giao ñi m ñư c d dàng}
For y:=MinY to MaxY do

{Cho dòng quét ch y t MinY ñ n MaxY }

begin
TaoDanhSachGiaoDiem; {Tìm danh sách các giao ñi m c a ñư ng quét y
v i các c nh c a Poly}
SapXepVaLoc; {S p x p l i các giao ñi m và l c b các giao ñi m th a}
ToMauCacDoan; {D a vào các giao ñi m ñ xác ñ nh ra các ño n n m
trong ña giác, t ñó tô màu t ng ñi m trên ño n ñó d a
vào ñ sâu so sánh v i giá tr ñ sâu tương ng trên Z_Buffer}
end;
Setlength(D,0);

{Gi i phóng m ng D}

Setlength(G,0);

{Gi i phóng m ng G}

end;

102
Chương VII. Kh ñư ng và m t khu t
BÀI T P
1. Cài ñ t cho thu t gi i Depth-Sorting
Cài ñ t chương trình cho phép bi u di n và quan sát v t th 3D theo mô hình "các
m t ña giác" trong ñó s d ng thu t gi i Depth-Sorting ñ kh các m t khu t
2. Cài ñ t cho thu t gi i ch n l c m t sau
Cài ñ t chương trình cho phép bi u di n và quan sát v t th 3D theo mô hình "các m t
ña giác" trong ñó s d ng thu t gi i ch n l c m t sau ñ kh các m t khu t. V i ñ i
tư ng là các hình l p phương, t di n, bát di n, c u,…
3. Cài ñ t cho thu t gi i vùng ñ m ñ sâu
Cài ñ t chương trình cho phép bi u di n và quan sát v t th 3D theo mô hình "các m t
ña giác" trong ñó s d ng thu t gi i ch n l c m t sau ñ kh các m t khu t. V i ñ i
tư ng là các m t c t nhau, các hình l i lõm b t kỳ.

103
CHƯƠNG VIII

T O BÓNG V T TH 3D
8.1. KHÁI NI M
Khi bi u di n các ñ i tư ng 3 chi u, m t y u t không th b qua ñ tăng tính th c
c a ñ i tư ng ñó là t o bóng sáng cho v t th . ð th c hi n ñư c ñi u này, chúng ta
c n ph i l n lư t tìm hi u các d ng ngu n sáng có trong t nhiên, cũng như các tính
ch t ñ c trưng khác nhau c a m i lo i ngu n sáng. T ñó ñưa ra các gi i pháp k thu t
khác nhau nh m th hi n s tác ñ ng c a các ngu n sáng khác nhau lên ñ i tư ng.
8.2. NGU N SÁNG XUNG QUANH
Ánh sáng xung quanh là m c sáng trung bình, t n t i trong m t vùng không gian.
M t không gian lý tư ng là không gian mà t i ñó m i v t ñ u ñư c cung c p m t
lư ng ánh sáng lên b m t là như nhau, t m i phía

m i nơi. Thông thư ng ánh sáng

xung quanh ñư c xác ñ nh v i m t m c c th g i là m c sáng xung quanh c a vùng
không gian mà v t th ñó cư ng , sau ñó ta c ng v i cư ng ñ sáng có ñư c t các
ngu n sáng khác ñ có ñư c cư ng ñ sáng cu i cùng lên m t ñi m hay m t m t c a
v t th .
Vector pháp tuy n c a m t
Ánh sáng ph n
x

Ánh sáng ph n x

Ánh sáng t i
Ánh sáng t i

Hình 8.1. S ph n x c a ánh sáng
Chương VIII. T o bóng v t th 3D
8.3. NGU N SÁNG ð NH HƯ NG
Ngu n sáng ñ nh hư ng gi ng như nh ng gì mà m t tr i cung c p cho chúng ta. Nó
bao g m m t t p các tia sáng song song, b t k cư ng ñ c a chúng có gi ng nhau hay
không. Có hai lo i k t qu c a ánh sáng ñ nh hư ng khi chúng chi u ñ n b m t là:
khuy ch tán và ph n chi u. N u b m t ph n x toàn b (gi ng như m t gương) thì các
tia ph n x s có hư ng ngư c v i hư ng c a góc t i (Hình 8.1). Trong trư ng h p
ngư c l i, n u b m t là không ph n x toàn ph n (có ñ nhám, xù xì) thì m t ph n
các tia sáng s b to ñi các hư ng khác hay b h p th , ph n còn l i thì ph n x l i, và
lư ng ánh sáng ph n x l i này t l v i góc t i.

ñây chúng ta s quan tâm ñ n hi n

tư ng ph n x không toàn ph n vì ñây là hi n tư ng ph bi n (vì ch có nh ng ñ i
tư ng ñư c c u t o t nh ng m t như m t gương m i x y ra hi n tư ng ph n x toàn
ph n), và ñ ng th i tìm cách tính cư ng ñ c a ánh sáng ph n x trên b m t.
Vector pháp tuy n c a m t
Ánh sáng ph n
x

Vector pháp tuy n c a m t

Ánh sáng t i
Ánh sáng ph n x

(a)

Ánh sáng t i

(b)

Hình 8.2. S ph n x không toàn ph n c a ánh sáng
Trong hình 8.2 th hi n s ph n x ánh sáng không toàn ph n. ð ñ m nét c a các
tia ánh sáng t i th hi n cư ng ñ sáng cao, ñ m nh c a các tia ph n x th hi n
cư ng ñ sáng th p. Nói chung, khi b m t là không ph n x toàn ph n thì cư ng ñ
c a ánh sáng ph n x (hay t m g i là tia ph n x ) luôn bé hơn so v i cư ng ñ c a ánh
sáng t i (hay g i là tia t i), và cư ng ñ c a tia ph n x còn t l v i góc gi a tia t i
v i vector pháp tuy n c a b m t, n u góc này càng nh thì cư ng ñ ph n x càng
cao (hình II.2 (a)), n u góc này l n thì cư ng ñ ph n x r t th p (hình II.2 (b)).

ñây

ta ch quan tâm ñ n thành ph n ánh sáng khuy ch tán và t m b qua hi n tư ng ph n

105
Chương VIII. T o bóng v t th 3D
x toàn ph n. ð cho ti n trong vi c tính toán ta t m ñ i hư ng c a tia t i th c s , v y
bây gi hư ng c a tia t i ñư c xem là hư ng ngư c l i c a tia sáng t i.
N u g i θ là góc gi a tia t i v i vector pháp tuy n c a b m t thì Cos(θ) ph thu c
vào tia t i a và vector pháp tuy n c a m t n theo công th c:

Cos (θ ) =

a.n

(8.1)

a.n

Trong công th c trên Cos(θ) b ng tích vô hư ng c a a và n chia cho tích ñ l n c a
chúng. N u ta ñã chu n hoá ñ l n c a các vector a và n v 1 t trư c thì ta có th
tính giá tr trên m t cách nhanh chóng như sau:
Cos(θ) = tích vô hư ng c a a và n = a.x*n.x+a.y*n.y+a.z*n.z
Vì Cos(θ) có giá tr t +1 ñ n -1 nên ta có th suy ra công th c tính cư ng ñ c a
ánh sáng ph n x là:
Cư ng ñ ánh sáng ph n x = Cư ng ñ c a ánh sáng ñ nh hư ng * [(Cos(θ)+1)/2] (8.2)

Trong ñó [(Cos(θ)+1)/2] có giá tr trong kho ng t 0 ñ n 1. V y qua công th c (8.1) và
(8.2) chúng ta có th tính ñư c cư ng ñ c a ánh sáng ph n x trên b m t khi bi t
ñư c cư ng ñ c a ánh sáng ñ nh hư ng cũng như các vector pháp tuy n c a m t và
tia t i.

Cài ñ t thu t toán
Dư i ñây là ph n trình bày các th t c ph c v cho vi c v ñ i tư ng 3D ñ c l i,
theo thu t toán ch n l c m t sau có tính ñ n v n ñ chi u sáng c a ngu n sáng xung
quanh và ngu n sáng ñ nh hư ng.
Function Cuong_Do_Anh_Sang_Dinh_Huong(v,n:Vector3D):real;
{Th t c tính cư ng ñ ánh sáng ph n x trên b m t c a ña giác khi bi t ñư c tia t i
v và vector pháp tuy n 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);
{Gán S b ng tích c a |v|*|n|}

106
Chương VIII. T o bóng v t th 3D
if s=0 then {M t trong hai vector b ng 0 do ñó t m xem cư ng ñ sáng b ng 1}
begin Cuong_Do_Anh_Sang_Dinh_Huong:=1;end
else
Begin t:=tich_vo_huong(v,n); {Tính tích vô hư ng c a v và n}
If t>0 then {N u góc gi a v và n n m trong kho ng 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 tư ng 3D ñ c l i theo thu t toán ch n l c m t sau có tính ñ n v n ñ chi u
sáng c a ngu n sáng xung quanh và ngu n sáng ñ nh hư ng.
Trong ñó:
+ Obj: ch a ñ i tư ng 3D c n v
+ Canvas: V i v (hay vùng ñ m khung)
+ Width, Height: Kích thư c c a Canvas
+ Zooom: H s t l khi v ñ i tư ng (Hay h s thu phóng)
+ V: Vector hư ng nhìn. N u Obj ñã ñư c chuy n sang h to ñ quan sát O’UVN
thì V=(0,0,-1)
+ AnhSangNen: Giá tr cư ng ñ c a ánh sáng xung quanh mà ñ i tư ng có th thu
nh n ñư c
+ AnhSangDinhHuong: Giá tr cư ng ñ c a ánh sáng ñ nh hư ng mà ñ i
tư ng có th thu nh n ñư c
*Chú ý: AnhSangNen + AnhSangDinhHuong <=1.

ñây ta xem t ng cư ng ñ

c a các ngu n sáng t o ra gi i h n trong kho ng 0..1. T ñó chúng ta có th ñi u
ch nh cư ng ñ chi u sáng c a các ngu n sáng b ng cách tăng h s cư ng ñ c a nó
song v n ph i luôn luôn tho mãn t ng c a chúng nh hơn hay b ng 1. Khi m t m t
107
Chương VIII. T o bóng v t th 3D
nh n ñư c t ng cư ng ñ sáng là 1 t các ngu n sáng khác nhau cung c p thì m t s
cho màu th c c a nó. N u t ng cư ng ñ sáng mà nó thu ñư c t các ngu n sáng nh
hơn 1 m t s hơi t i ñi.
+ VectorChieuSang: ðây là vector bi u di n tia t i (chú ý nó có hư ng ngư c v i
hư ng c a ánh sáng chi u t i như ñã nói trong ph n lý thuy t}
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
{Thi t l p ña giác là hình chi u c a m t xu ng m t ph ng OXY (có t nh ti n và ñ i
hư ng tr c 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 ñ c a ñ nh sau khi chi u là (Obj.dinh[P].x,Obj.dinh[P].y), song
ñư c bi n ñ i t l v i h s là zoom r i ñ i hư ng tr c Y và t nh ti n theo
vector (cx,cy)}
end;
{Tính cư ng ñ sáng mà m t nh n ñư c: b ng t ng cư ng ñ sáng do ngu n
sáng xung quanh (ánh sáng n n) và ngu n sáng ñ nh hư ng cung c p}
CuongDoSang:=AnhSangNen + AnhSangDinhHuong *
Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang,Obj.Mat[K].PhapVT);

108
Chương VIII. T o bóng v t th 3D
{ ñây cư ng ñ sáng mà m t nh n ñư c do ngu n sáng ñ nh hư ng cung c p
ph thu c không ch vào cư ng ñ sáng mà ngu n phát ra, mà còn ph thu c
vào hư ng ñón ánh sáng c a m t và ñư c bi u di n b i bi u th c:
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);
{Thi t l p màu s c cho m t b ng cách: l y cư ng ñ màu s c m t ñ nh c a m t
Obj.Mat[K].Color, nhân v i cư ng ñ sáng mà nó nh n ñư c trong th c t tính
toán ñư c CuongDoSang. T ñó ta th y, n u m t nh n ñư c ñ y ñ ánh sáng
(cư ng ñ sáng =1) thì m t s có màu m t ñ nh c a nó (xác ñ nh khi thi t k
ñ i tư ng), ngư c l i thì m t s có màu s c t i hơn. N u m t không ñư c chi u
sáng t các ngu n sáng (cư ng ñ sáng =0) thì m t s có màu ñen}
canvas.Brush.Color :=rgb(R,G,B);
Canvas.Pen.Color:=canvas.Brush.Color;
Canvas.Polygon(poly);
{v ña giác v i màu s c ñã ñư c xác ñ nh trư c b i bút tô (Brush.Color) và bút
v (Pen.Color)}
end;
setlength(poly,0);
end;
8.4. NGU N SÁNG ðI M
Ngu n sáng ñ nh hư ng là tương ñương v i ngu n sáng ñi m ñ t

vô t n. Nhưng

khi ngu n sáng ñi m ñư c mang ñ n g n ñ i tư ng thì các tia sáng t nó phát ra không
còn song song n a mà ñư c to ra theo m i hư ng theo d ng hình c u. Vì th , các tia
sáng s rơi xu ng các ñi m trên b m t dư i các góc khác nhau. Gi s vector pháp
tuy n c a m t là n=(xn, yn, zn), ñi m ñang xét có to ñ là (x0, y0, z0) và ngu n sáng
ñi m có t a ñ là (plx, ply, plz) thì ánh sáng s r i ñ n ñi m ñang sét theo vector (x0plx, y0-ply, z0-plz), hay tia t i:
a = (plx - x0, ply - y0,plz - z0).
109
Chương VIII. T o bóng v t th 3D
T ñó cư ng ñ sáng t i ñi m ñang xét s ph thu c vào Cos(θ) gi a n và a như ñã
trình bày trong ph n ngu n sáng ñ nh hư ng.
V y v i ngu n sáng ñ nh hư ng, chúng ta c n tính tia t i cho m i ñi m trên m t, t
ñó k t h p v i vector pháp tuy n c a m t ñ tính ñư c cư ng ñ sáng t i ñi m ñó, n u
tính toán tr c ti p thì có th m t khá nhi u th i gian do ph i tính vector a và tính
Cos(θ) thông qua công th c (8.1) v i t t c các ñi m trên m t. Nên nh r ng trong tình
hư ng ngu n sáng ñi m thì chúng ta bu c lòng ph i tính Cos(θ) thông qua công th c
(8.1) vì vector a s thay ñ i khi m t hay ngu n sáng thay ñ i (tr khi m t tĩnh, song
n u m t tĩnh và ngu n sáng c ñ nh thì suy ra chúng ta ch c n tính cư ng ñ sáng
m t l n).
8.5. MÔ HÌNH BÓNG GOURAUD
Mô hình bóng Gouraud là m t phương pháp v bóng, t o cho ñ i tư ng 3D có hình
dáng cong có m t cái nhìn có tính th c hơn. Phương pháp này ñ t cơ s trên th c t
sau: ñ i v i các ñ i tư ng 3D có b m t cong thì ngư i ta thư ng x p s b m t cong
c a ñ i tư ng b ng nhi u m t ña giác ph ng, ví d như m t m t c u có th s p s b i
m t t p các m t ña giác ph ng có kích thư c nh s p x p l i, khi s ña giác x p x tăng
lên (có nghĩa là di n tích m t ña giác nh l i) thì tính th c c a m t c u s tăng, s cho
ta c m giác m t c u trông tròn tr a hơn, m n và cong hơn. Tuy nhiên, khi s ña giác
x p x m t m t cong tăng thì kh i lư ng tính toán và lưu tr cũng tăng theo t l thu n
theo s m t, ñi u ñó d n ñ n t c ñ th c hi n s tr nên ch m ch p hơn. Chúng ta hãy
th v i m t ví d sau: ð mô ph ng m t m t c u ngư i ta x p x nó b i 200 m t thì
cho ta m t c m giác hơi g gh , nhưng v i 450 m t thì ta th y nó m n và tròn tr a hơn,
song khi s m t là 16200 thì cho ta c m giác hình c u r t tròn và m n (hình 8.3). Tuy
hình nh m t c u v i 16200 m t ña giác thì m n hơn so v i 200 m t, song lư ng tính
toán ph i th c hi n trên m i ña giác cũng tăng lên g p 16200/200= 81 l n.
Song v n ñ v n còn n y sinh m t khi ta phóng l n hay thu nh v t th . N u ta
phóng l n thì rõ ràng là các ña giác cũng ñư c phóng l n theo cùng t l , d n ñ n hình
nh v các m t ña giác l i hi n rõ và gây ra c m giác không ñư c trơn m n. Ngư c l i,
khi ta thu nh thì n u s ña giác x p x l n thì s d n ñ n tình tr ng các ña giác quá
nh , ch ng ch t lên nhau không c n thi t.

110
Chương VIII. T o bóng v t th 3D

200 m t

450 m t
Hình 8.3

16200 m t

ð gi i quy t v n ñ trên, chúng ta có th ti n hành theo phương pháp tô bóng
Gouraud. Mô hình bóng Gouraud t o cho ñ i tư ng m t cái nhìn gi ng như là nó có
nhi u m t ña giác b ng cách v m i m t không ch v i m t cư ng ñ sáng mà v v i
nhi u cư ng ñ sáng khác nhau trên các vùng khác nhau, làm cho m t ph ng nom như
b cong. B i th c ch t ta c m nh n ñư c ñ cong c a các m t cong do hi u ng ánh
sáng khi chi u lên m t, t i các ñi m trên m t cong s có pháp vector khác nhau nên s
ñón nh n và ph n x ánh sáng khác nhau, t ñó chúng ta s c m nh n ñư c các ñ
sáng khác nhau trên cùng m t m t cong.

Tô bóng thư ng

Tô bóng theo Gouraud
Hình 8.4

Thư ng thì m i m t ña giác có m t vector pháp tuy n, và như ph n trên ñã trình
bày, vector pháp tuy n ñó ñư c dùng ñ tính cư ng ñ c a ánh sáng ph n x trên b
m t c a ña giác t ñó suy ra cư ng ñ sáng c a m t. Tuy nhiên mô hình Gouraud l i
xem m t ña giác không ch có m t vector pháp tuy n, mà m i ñ nh c a m t ña giác l i
có m t vector pháp tuy n khác nhau, và t vector pháp tuy n c a các ñ nh chúng ta s
n i suy ra ñư c vector pháp tuy n c a t ng ñi m trên m t ña giác, t ñó tính ñư c
cư ng ñ sáng c a ñi m. Như th , các ñi m trên cùng m t m t c a ña giác s có cư ng
ñ sáng khác nhau và cho ta c m giác m t ña giác không ph i là m t ph ng mà là m t
cong.
111
Chương VIII. T o bóng v t th 3D

Vector trung bình c ng b ng trung
bình c ng c a các vector pháp
tuy n l n c n

Hình 8.5
Th c ch t thì m i m t ña giác ch có m t vector pháp tuy n, song phương pháp
Gouraud tính toán vector trung bình t i m i ñ nh c a ña giác b ng cách: l y trung bình
c ng các vector pháp tuy n c a các ña giác có ch a ñ nh ñang xét.
Vi c n i suy vector pháp tuy n c a t ng ñi m trên m t ña giác ñư c th c hi n
tương t như vi c n i suy ñ sâu trong gi i thu t “vùng ñ m ñ sâu” ñã ñư c trình bày
trong chương trư c.

Cài ñ t thu t toán
Dư i ñây là ph n trình bày các th t c ph c v cho vi c v ñ i tư ng 3D ñ c l i và
cong, theo thu t toán ch n l c m t sau có tính ñ n v n ñ chi u sáng c a ngu n sáng
xung quanh và ngu n sáng ñ nh hư ng, song m i ña giác s ñư c tô bóng theo phương
pháp Gouraud.
{B t ñ u ph n khai báo ph c v cho gi i thu t tô ña giác theo phương pháp Gouraud}
Type NutPolyGourand=record {1 ñ nh c a ña giác chi u (là nh c a m t
ña giác xu ng m t ph ng OXY}
N:Vector3D;
x,y:Integer;

{Pháp vector t i 1 ñ nh c a ña giác}
{To ñ c a ñ nh}

end;

112
Chương VIII. T o bóng v t th 3D
PolygonGourand =array of NutPolyGourand;
{m ng ñ ng dùng ñ ch a các ñ nh c a ña giác chi u}
CanhCat=record {M t c nh c a ña giác ñư c t o ra nh m ph c v cho
quá trình tính giao ñi m nhanh}
y1,y2:Integer;
xGiao:real;
XStep:real;
NGiao:Vector3D; {Pháp vector t i ñ nh, song nó s ñư c ch a pháp
vector tai giao ñi m v i ñư ng quét}
NStep:Vector3D; {ñ bi n thiên c a Pháp vector khi di chuy n d c
theo c nh, m i l n y thay ñ i 1 ñơn v thì pháp
vector thay ñ i m t lư ng là NStep}
end;
DanhSachCanhCat=array of CanhCat;
GiaoDiem=record

{C u trúc ch a giao ñi m c a ñư ng quét ngang
v i c nh ña giác chi u }

x,y:Integer;
NGiao:Vector3D;

{To ñ giao ñi m}
{Pháp vector t i giao ñi m}

ChiSoCanh:integer; {Ch s c nh ñã t o ra giao ñi m}
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 tư ng 3D ñ c l i và cong}
Var i,j,k,Dem,P,Q,cx,cy:integer;
Poly:PolygonGourand;
DinhLinkMat:array of Record {Ch a Danh sách các m t có liên k t
ñ n m t ñinh}
SoMat:Integer;

113
Chương VIII. T o bóng v t th 3D
A:array of integer;
end;
{S m t có liên k t v i ñ nh th i}

CMLD:array of integer;
begin

cx:=Width div 2;cy:=Height div 2;
Setlength(DinhLinkMat,Obj.Sodinh);
Setlength(CMLD,Obj.Sodinh);
For i:=0 to obj.Sodinh-1 do CMLD[i]:=0;
{Xác ñ nh m i ñ nh có bao nhiêu m t liên k t ñ 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 m t liên k t ñ n ñ nh th k ñư c tăng lên
khi có m t m t có liên k t ñ n nó }
end;
{Thi t l p danh sách các măt liên k t ñ n t ng ñ nh c a ñ i tư ng}
For i:=0 to obj.Sodinh-1 do
begin
setlength(DinhLinkMat[i].A,CMLD[i]);{S m t liên k t v i ñ nh i
là CMLD[i]}
DinhLinkMat[i].SoMat:=0;
end;
{Quá trình xác ñ nh rõ nh ng m t nào liên k t v i ñ 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;
114
Chương VIII. T o bóng v t th 3D
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
{thi t l p các thu c tính c a ñ nh th i c a Poly (ña giác chi u) }
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;
{Tính Vector pháp tuy n t i ñ nh Poly b ng cách tính t ng c a các
vector pháp tuy n c a các m t có liên k t v i ñ 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 giác Poly theo thu t toán tô ña giác theo dòng quét, song có n i suy vector
pháp tuy n cho m i ñi m, và tính cư ng ñ sáng c a m i ñi m trong ña giác d a vào
vector pháp tuy n t i ñi m ñó.}
end;
setlength(poly,0);
For i:=0 to obj.Sodinh-1 do
setlength(DinhLinkMat[i].A,0);
Setlength(DinhLinkMat,0);
115
Chương VIII. T o bóng v t th 3D
end;
Procedure FillPolygonGourand(Poly:PolygonGourand;
Vector_Chieu_Sang:Vector3D;
Anh_Sang_Nen,Anh_Sang_Chieu:real;
Canvas:TCanvas;Color:RGBColor);
{Tô ña giác Poly theo thu t toán tô ña giác theo dòng quét, song có n i suy vector
pháp tuy n cho m i ñi m, và tính cư ng ñ sáng c a m i ñi m trong ña giác d a vào
vector pháp tuy n t i ñi m ñó.
Th t c này tương t như th t c tô ña giác theo thu t toán Z-Buffer song thay vì n i
suy ñ sâu z c a m i ñi m, thì th t c này s n i suy pháp vector c a m i ñi m, r i
d a vào pháp vector c a ñi m ñó mà tính ra cư ng ñ sáng mà nó có ñư c do ngu n
sáng ñ nh hư ng cung c p.}
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;
116
Chương VIII. T o bóng v t th 3D
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;
117
Chương VIII. T o bóng v t th 3D
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
118
Chương VIII. T o bóng v t th 3D
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
119
Chương VIII. T o bóng v t th 3D
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);
{Cư ng ñ sáng t i m i ñi m ñư c tính b ng t ng c a cư ng ñ ánh sáng
n n c ng v i cư ng ñ có ñư c t ngu n sáng ñ nh hư ng, song ñ tính
ñư c cư ng ñ sáng có ñư c t ngu n ñ ng hư ng cung c p thì chúng ta
d a vào tia t i (Vector_Chieu_Sang) và pháp vector c a ñi m
G[i].Ngiao.}
Cd:=round(255*CuongDoSang);
Canvas.Pixels[x,G[i].y]:=rgb(Cd*Re,Cd*Gr,Cd*Bl);
{N i suy pháp vector c a ñi m ti p theo và gán vào 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
120
Chương VIII. T o bóng v t th 3D
begin
TaoDanhSachGiaoDiem;
SapXepVaLoc;
ToMauCacDoan;
end;
Setlength(D,0);
Setlength(G,0);
end;
BÀI T P
1. Xây d ng m t chương trình cho phép quan sát v t th 3D ñ c l i. Chương trình cho
phép thay ñ i v trí quan sát, cho phép th hi n tác ñ ng c a các ngu n sáng xung
quanh và ñ nh hư ng lên ñ i tư ng.
Nâng cao: Cho thép thay ñ i cư ng ñ c a các ngu n sáng, cũng như thay ñ i
hư ng chi u c a ngu n sáng ñ nh hư ng.
2. Hãy xây d ng chương trình v i các ch c năng như Bài 1 song s d ng phương pháp
tô bóng Gouraud.
3. Hãy t ng h p các ki n th c ñã bi t ñ xây d ng m t chương trình mô ph ng th
gi i th c trong ñó có nhi u ñ i tư ng khác nhau v n ñ ng.

121
PH L C

M TS

CHƯƠNG TRÌNH MINH H A

I. CÁC THU T TOÁN TÔ MÀU
1. Thu t toán tô màu theo lo t
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 l c. M t s chương trình minh h a
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;
123
Ph l c. M t s chương trình minh h a
End;
Procedure ThietLapDoHoa;
var Gd,Gm:Integer;
Begin
Gd:=0;
InitGraph(Gd,Gm,’C:BPBGI’);
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
if miny>a[i].y
if maxx<a[i].x
if maxy<a[i].x
end;
ThietLapDoHoa;
vedagiac(a,n);
Tomau(a,n);
readln;
closegraph;
end.

then
then
then
then

minx:=a[i].x;
miny:=a[i].y;
maxx:=a[i].x;
maxy:=a[i].y;

2. Thu t toán 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);
124
Ph l c. M t s chương trình minh h a
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].xa[j].x)+a[j].y then dem:=dem+1;
end;
if dem mod 2=1 then KiemTra:=True else KiemTra:=False;
125
Ph l c. M t s chương trình minh h a
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:TPBGI');
Vedagiac(n,4);
Toloang(x,y,14);
readln;
closegraph;
END.
3. Thu t toán 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
{ Nhap vao dau danh sach }
Var p:DanhSach;
Begin
new(p);
p^.Data:=a; p^.next:=nil;
p^.next:=Stack;

Stack:DanhSach);

126
Ph l c. M t s chương trình minh h a
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;
127
Ph l c. M t s chương trình minh h a
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
128
Ph l c. M t s chương trình minh h a
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)
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)
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)
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)
PUSHStack(C,Stack);
End;
End;
End;

then

then

then

then

BEGIN
KhoiTaoStack;
Nhapdagiac(n,a);
Gd:=Detect;
InitGraph(Gd,Gm,'D:TPBGI');
Vedagiac(n,4);
Toloang(x,y,14);
readln;
closegraph;
END.
II. CÁC THU T TOÁN XÉN HÌNH
1. Thu t toán 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;
129
Ph l c. M t s chương trình minh h a
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
if P.x>Duoi.x then s:=s OR
if P.y<Tren.y then s:=s OR
if P.y>Duoi.y then s:=s OR
Ma:=s;
end;

Left;
Right;
Above;
Below;

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
130
Ph l c. M t s chương trình minh h a
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;
131
Ph l c. M t s chương trình minh h a
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:TPBGI');
repeat
NhapDinhHCN;
VeHCN;
Clipping(A,B,Tren,Duoi);
until ch=#27;
closegraph;
END.
2. Thu t toán chia nh phân
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;
132
Ph l c. M t s chương trình minh h a
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
if P.x>Duoi.x then s:=s OR
if P.y<Tren.y then s:=s OR
if P.y>Duoi.y then s:=s OR
Ma:=s;
end;

Left;
Right;
Above;
Below;

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;
133
Ph l c. M t s chương trình minh h a
end;
End;
BEGIN
NhapDinhHCN;
gd:=detect; Initgraph(gd,gm,'D:TPBGI');
VeHCN;
Clipping(A,B,Tren,Duoi);
readln;
closegraph;
END.
3. Thu t toán 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;
134
Ph l c. M t s chương trình minh h a
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:TPBGI');
VeHCN;
LiangBaskyClip(a,b,PTop,PBottom);
readln;
closegraph;
135
Ph l c. M t s chương trình minh h a
END.
III. V CÁC ð I TƯ NG 3D
1. V m t yên ng a
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) +
END ;

c2*cos(u)*sin(v) + d*v ;

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}
136
Ph l c. M t s chương trình minh h a
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;
137
Ph l c. M t s chương trình minh h a
END.
2. V các ñ i tư ng 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
138
Ph l c. M t s chương trình minh h a
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 m t khu t theo gi i thu t 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);
139
Ph l c. M t s chương trình minh h a
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}
140
Ph l c. M t s chương trình minh h a
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);
141
Ph l c. M t s chương trình minh h a
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.

142

Giao trinh ly thuyet do hoa

  • 2.
    M CL C Chương1: CÁC Y U T CƠ S C A ð H A 1.1. T ng quan v ñ h a máy tính ............................................................................... 1 1.1.1. Gi i thi u v ñ h a máy tính ................................................................................ 1 1.1.2. Các k thu t ñ h a ................................................................................................ 1 1.1.2.1. K thu t ñ h a ñi m........................................................................................ 1 1.1.2.2. K thu t ñ h a vector...................................................................................... 2 1.1.3. ng d ng c a ñ h a máy tính............................................................................... 2 1.1.4. Các lĩnh v c c a ñ h a máy tính .......................................................................... 3 1.1.5. T ng quan v m t h ñ h a .................................................................................. 4 1.2. Màn hình ñ h a ...................................................................................................... 6 1.3. Các khái ni m........................................................................................................... 6 1.3.1. ði m..................................................................................................................... 6 1.3.2. Các bi u di n t a ñ ............................................................................................ 8 1.3.3. ðo n th ng........................................................................................................... 8 1.4. Các thu t toán v ño n th ng................................................................................. 8 1.4.1. Bài toán ................................................................................................................ 8 1.4.2. Thu t toán DDA................................................................................................... 9 1.4.3. Thu t toán Bresenham ....................................................................................... 10 1.4.4. Thu t toán MidPoint .......................................................................................... 12 1.5. Thu t toán v ñư ng tròn ..................................................................................... 14 1.5.1. Thu t toán Bresenham ....................................................................................... 14 1.5.2. Thu t toán MidPoint .......................................................................................... 16 1.6. Thu t toán v Ellipse............................................................................................. 17 1.6.1. Thu t toán Bresenham ....................................................................................... 17 1.6.2. Thu t toán MidPoint .......................................................................................... 20 1.7. Phương pháp v ñ th hàm s ............................................................................. 21 Bài t p ............................................................................................................................ 23 Chương 2: TÔ MÀU 2.1. Gi i thi u các h màu............................................................................................ 25 2.2. Các thu t toán tô màu .......................................................................................... 28 2.2.1. Bài toán .............................................................................................................. 28 2.2.2. Thu t toán xác ñ nh P ∈ S ................................................................................. 28 2.2.3. Thu t toán tô màu theo dòng quét ..................................................................... 30 2.2.4. Thu t toán tô màu theo v t d u loang................................................................ 30 Bài t p ............................................................................................................................ 31 Chương 3: XÉN HÌNH 3.1. ð t v n ñ ............................................................................................................... 32
  • 3.
    3.2. Xén ñon th ng vào vùng hình ch nh t............................................................. 32 3.2.1. C nh c a hình ch nh t song song v i các tr c t a ñ ..................................... 32 3.2.1.1. Thu t toán Cohen – Sutherland ...................................................................... 33 3.2.1.2. Thu t toán chia nh phân................................................................................. 34 3.2.1.3. Thu t toán Liang – Barsky ............................................................................. 35 3.2.2. Khi c nh c a hình ch nh t t o v i tr c hoành m t góc α................................ 36 3.3. Xén ño n th ng vào hình tròn .............................................................................. 37 3.4. Xén ñư ng tròn vào hình ch nh t...................................................................... 38 3.5. Xén ña giác vào hình ch nh t ............................................................................. 39 Bài t p ............................................................................................................................ 40 Chương 4: CÁC PHÉP BI N ð I 4.1. Các phép bi n ñ i trong m t ph ng..................................................................... 41 4.1.1. Cơ s toán h c ................................................................................................... 41 4.1.2. Ví d minh h a .................................................................................................. 43 4.2. Các phép bi n ñ i trong không gian .................................................................... 45 4.2.1. Các h tr c t a ñ .............................................................................................. 45 4.2.2. Các công th c bi n ñ i ...................................................................................... 46 4.2.3. Ma tr n ngh ch ñ o ............................................................................................ 48 4.3. Các phép chi u c a v t th trong không gian lên m t ph ng ........................... 48 4.3.1. Phép chi u ph i c nh ......................................................................................... 48 4.3.2. Phép chi u song song......................................................................................... 50 4.4. Công th c c a các phép chi u lên màn hình....................................................... 50 4.5. Ph l c .................................................................................................................... 56 4.6. Ví d minh h a....................................................................................................... 59 Bài t p ............................................................................................................................ 61 Chương 5: BI U DI N CÁC ð I TƯ NG BA CHI U 5.1. Mô hình WireFrame.............................................................................................. 63 5.2. V mô hình WireFrame v i các phép chi u........................................................ 64 5.3. V các m t toán h c............................................................................................... 65 Bài t p ............................................................................................................................ 68 Chương 6: THI T K ðƯ NG VÀ M T CONG BEZIER VÀ B-SPLINE 6.1. ðư ng cong Bezier và m t Bezier ........................................................................ 69 6.1.1. Thu t toán Casteljau .......................................................................................... 70 6.1.2. D ng Bernstein c a ñư ng cong Bezier ............................................................ 70 6.1.3. D ng bi u di n ma tr n c a ñư ng Bezier ........................................................ 71 6.1.4. T o và v ñư ng cong Bezier ............................................................................ 72 6.1.5. Các tính ch t c a ñư ng Bezier ......................................................................... 74 6.1.6. ðánh giá các ñư ng cong Bezier ....................................................................... 76 6.2. ðư ng cong Spline và B-Spline ............................................................................ 77 6.2.1. ð nh nghĩa.......................................................................................................... 77
  • 4.
    6.2.2. Các tínhch t h u ích trong vi c thi t k các ñư ng cong B-Spline ................. 78 6.2.3. Thi t k các m t Bezier và B-Spline ................................................................. 79 6.2.4. Các băng Bezier ................................................................................................. 80 6.2.5. Dán các băng Bezier v i nhau ........................................................................... 81 6.2.6. Các băng B-Spline ............................................................................................. 81 Chương 7: KH ðƯ NG VÀ M T KHU T 7.1. Các khái ni m......................................................................................................... 83 7.2. Các phương pháp kh m t khu t ........................................................................ 85 7.2.1. Gi i thu t s p x p theo chi u sâu ...................................................................... 85 7.2.2. Gi i thu t BackFace........................................................................................... 88 7.2.3. Gi i thu t vùng ñ m ñ sâu ............................................................................... 90 Bài t p .......................................................................................................................... 103 Chương 8: T O BÓNG V T TH 3D 8.1. Khái ni m ............................................................................................................. 104 8.2. Ngu n sáng xung quanh...................................................................................... 104 8.3. Ngu n sáng ñ nh hư ng ...................................................................................... 105 8.4. Ngu n sáng ñi m.................................................................................................. 109 8.5. Mô hình bóng Gouraud....................................................................................... 110 Bài t p .......................................................................................................................... 121 Ph l c: M T S CHƯƠNG TRÌNH MINH H A I. Các thu t toán tô màu ............................................................................................ 122 II. Các thu t toán xén hình ........................................................................................ 129 III. V các ñ i tư ng 3D............................................................................................. 136 Tài li u tham kh o...................................................................................................... 143
  • 5.
    L IM ð U ðh a là m t trong nh ng lĩnh v c phát tri n r t nhanh c a ngành Công ngh thông tin. Nó ñư c ng d ng r ng rãi trong nhi u lĩnh v c khoa h c và công ngh . Ch ng h n như y h c, ki n trúc, gi i trí... ð h a máy tính ñã giúp chúng ta thay ñ i cách c m nh n và s d ng máy tính, nó ñã tr thành nh ng công c tr c quan quan tr ng không th thi u trong ñ i s ng h ng ngày. Vì v y môn “ð h a” ñã tr thành m t trong nh ng môn h c chính trong các chuyên ngành Công ngh thông tin các trư ng ñ i h c. Cu n sách “Giáo trình lý thuy t ñ h a” ñư c biên so n theo sát n i dung chương trình ñào t o c nhân Công ngh thông tin. N i dung c a giáo trình này cung c p m t s ki n th c cơ b n v lý thuy t và thu t toán xây d ng các công c ñ h a 2D và 3D. T ñó giúp sinh viên có th ñ c l p xây d ng nh ng thư vi n ñ h a cho riêng mình và phát tri n các ph n m m ng d ng ñ h a cao hơn. Giáo trình ñư c chia làm 8 chương và ph n ph l c, sau m i chương ñ u có ph n bài t p ñ ki m tra ki n th c và rèn luy n kh năng l p trình cho b n ñ c. ð thu n ti n cho vi c trình bày thu t toán m t cách d hi u, các gi i thu t trong giáo trình ñư c vi t trên ngôn ng “t a Pascal” và các mã ngu n ñư c cài ñ t trên Turbo Pascal 7.0. Nh m giúp b n ñ c b t lúng túng trong quá trình cài ñ t các gi i thu t, ph n ph l c li t kê m t s mã ngu n cài ñ t các thu t toán trong các chương. Tuy nhiên, b n ñ c nên t cài ñ t các thu t toán ph n lý thuy t, n u c m th y khó khăn l m m i nên tham kh o ph n ph l c này. Chương 1, 2 và 3 trình bày v các y u t cơ s c a ñ h a như: màn hình ñ h a, ñi m, ño n th ng, ñư ng tròn, các h màu và các thu t toán tô màu, xén hình ... Chương 4 trang b các ki n th c toán h c v các phép bi n ñ i trong không gian 2D và 3D. Chương 5, 6 và 7 gi i thi u các mô hình ñ h a 3D, các gi i thu t kh m t khu t và t o bóng cho v t th ... Chương 8 trình bày v phương pháp thi t k các ñư ng cong Bezier và B-Spline. M c dù ñã r t c g ng trong quá trình biên so n nhưng ch c ch n giáo trình này v n không th tránh kh i nh ng thi u sót. Chúng tôi r t mong nh n ñư c nh ng ý ki n ñóng góp c a b n ñ c cũng như các b n ñ ng nghi p trong lĩnh v c ð h a ñ giáo trình ngày càng ñư c hoàn thi n hơn trong l n tái b n sau. ð a ch liên l c: Khoa Công ngh Thông tin, trư ng ð i h c Khoa h c Hu . ði n tho i: 054.826767. Email: paphuong@hueuni.edu.vn nhtai@hueuni.edu.vn Hu , tháng 08 năn 2003 Các tác gi
  • 6.
    Updatesofts.com Ebooks Team CHƯƠNG I CÁCY U T 1.1. T NG QUAN V ð CƠ S C Að H A H A MÁY TÍNH ð h a máy tính là m t lãnh v c phát tri n nhanh nh t trong Tin h c. Nó ñư c áp d ng r ng rãi trong nhi u lãnh v c khác nhau thu c v khoa h c, k ngh , y khoa, ki n trúc và gi i trí. Thu t ng ñ h a máy tính (Computer Graphics) ñư c ñ xu t b i nhà khoa h c ngư i M tên là William Fetter vào năm 1960 khi ông ñang nghiên c u xây d ng mô hình bu ng lái máy bay cho hãng Boeing. Các chương trình ñ h a ng d ng cho phép chúng ta làm vi c v i máy tính m t cách tho i mái, t nhiên. 1.1.1 Gi i thi u v ñ h a máy tính ð h a máy tính là m t ngành khoa h c Tin h c chuyên nghiên c u v các phương pháp và k thu t ñ có th mô t và thao tác trên các ñ i tư ng c a th gi i th c b ng máy tính. V b n ch t: ñó là m t quá trình xây d ng và phát tri n các công c trên c hai lĩnh v c ph n c ng và ph n m m h tr cho các l p trình viên thi t k các chương trình có kh năng ñ h a cao. V i vi c mô t d li u thông qua các hình nh và màu s c ña d ng c a nó, các chương trình ñ h a thư ng thu hút ngư i s d ng b i tính thân thi n, d dùng,... kích thích kh năng sáng t o và nâng cao năng su t làm vi c. 1.1.2. CÁC K THU T ð H A D a vào các phương pháp x lý d li u trong h th ng, ta phân ra làm hai k thu t ñ h a: 1.1.2.1. K thu t ñ h a ñi m
  • 7.
    Chương I. Cácy u t cơ s c a ñ h a Nguyên lý c a k thu t này như sau: các hình nh ñư c hi n th thông qua t ng pixel (t ng m u r i r c). V i k thu t này, chúng ta có th t o ra, xóa ho c thay ñ i thu c tính c a t ng pixel c a các ñ i tư ng. Các hình nh ñư c hi n th như m t lư i ñi m r i r c (grid), t ng ñi m ñ u có v trí xác ñ nh ñư c hi n th v i m t giá tr nguyên bi u th màu s c ho c d sáng c a ñi m ñó. T p h p t t c các pixel c a grid t o nên hình nh c a ñ i tư ng mà ta mu n bi u di n. 1.1.2.2. K thu t ñ h a vector Nguyên lý c a k thu t này là xây d ng mô hình hình h c (geometrical model) cho hình nh ñ i tư ng, xác ñ nh các thu c tính c a mô hình hình h c, sau ñó d a trên mô hình này ñ th c hi n quá trình tô trát (rendering) ñ hi n th t ng ñi m c a mô hình, hình nh c a ñ i tư ng. k thu t này, chúng ta ch lưu tr mô hình toán h c c a các thành ph n trong mô hình hình h c cùng v i các thu c tính tương ng mà không c n lưu l i toàn b t t c các pixel c a hình nh ñ i tư ng. 1.1.3. ng d ng c a ñ h a máy tính hi n nay Ngày nay, ñ h a máy tính ñư c s d ng r ng rãi trong nhi u lĩnh v c khác nhau như: Công nghi p, thương m i, qu n lý, giáo d c, gi i trí,... Sau ñây là m t s ng d ng tiêu bi u: 1.1.3.1. T o giao di n (User Interfaces): như các chương trình ng d ng WINDOWS, WINWORD, EXCEL ... ñang ñư c ña s ngư i s d ng ưa chu ng nh tính thân thi n, d s d ng. 1.1.3.2. T o ra các bi u ñ dùng trong thương m i, khoa h c và k thu t: Các bi u ñ ñư c t o ra r t ña d ng, phong phú bao g m c hai chi u l n ba chi u góp ph n thúc ñ y xu hư ng phát tri n các mô hình d li u h tr ñ c l c cho vi c phân tích thông tin và tr giúp ra quy t ñ nh. 1.1.3.3. T ñ ng hóa văn phòng và ch b n ñi n t : dùng nh ng ng d ng c a ñ h a ñ in n các tài li u v i nhi u lo i d li u khác nhau như: văn b n, bi u ñ , ñ th và nhi u lo i hình nh khác ... 1.1.3.4. Thi t k v i s tr giúp c a máy tính (Computer aided design): M t trong nh ng l i ích l n nh t c a máy tính là tr giúp con ngư i trong vi c thi t k . Các ng 2
  • 8.
    Chương I. Cácy u t cơ s c a ñ h a d ng ñ h a cho phép chúng ta thi t k các thi t b cơ khí, ñi n, ñi n t , ô tô, máy bay, ... như ph n m m AUTOCAD ... 1.1.3.5. Lĩnh v c gi i trí, ngh thu t: cho phép các h a sĩ t o ra các hình nh ngay trên màn hình c a máy tính. Ngư i h a sĩ có th t pha màu, tr n màu, th c hi n m t s thao tác: c t, dán, t y, xóa, phóng to, thu nh ... như các ph n m m PAINTBRUSH, CORELDRAW,... 1.1.3.6. Lĩnh v c b n ñ : xây d ng và in n các b n ñ ñ a lý. M t trong nh ng ng d ng hi n nay c a ñ h a là h th ng thông tin ñ a lý (GIS - Geographical Information System). 1.1.4. Các lĩnh v c c a ñ h a máy tính 1.1.4.1. Các h CAD/CAM (CAD – Computer Aided Design, CAM – Computer Aided Manufacture) Các h này xây d ng t p h p các công c ñ h a tr giúp cho vi c thi t k các chi ti t và các h th ng khác nhau: các thi t b cơ khí, ñi n t ... Ch ng h n như ph n m m Auto Cad c a h ng AutoDesk... 1.1.4.2. X lý nh (Image Processing) ðây là lĩnh v c x lý các d li u nh trong cu c s ng. Sau quá trình x lý nh, d li u ñ u ra là nh c a ñ i tư ng. Trong quá trình x lý nh, chúng ta s s d ng r t nhi u các k thu t ph c t p: khôi ph c nh, xác ñ nh biên... Ví d : ph n m m PhotoShop, Corel Draw, ... 1.1.4.3. Khoa h c nh n d ng (Pattern Recognition) Nh n d ng là m t lĩnh v c trong k thu t x lý nh. T nh ng m u nh có s n, ta phân lo i theo c u trúc ho c theo các phương pháp xác ñ nh nào ñó và b ng các thu t toán ch n l c ñ có th phân tích hay t ng h p nh ñã cho thành m t t p h p các nh g c, các nh g c này ñư c lưu trong m t thư vi n và căn c vào thư vi n này ñ nh n d ng các nh khác. Ví d : Ph n m m nh n d ng ch vi t (VnDOCR) c a vi n Công ngh Thông tin Hà N i, nh n d ng vân tay, nh n d ng m t ngư i trong khoa h c hình s ... 1.1.4.4. ð h a minh h a (Presentation Graphics) 3
  • 9.
    Chương I. Cácy u t cơ s c a ñ h a ðây là lĩnh v c ñ h a bao g m các công c tr giúp cho vi c hi n th các s li u th ng kê m t cách tr c quan thông qua các m u ñ th ho c bi u ñ có s n. Ch ng h n như các bi u ñ (Chart) trong các ph n m m Word, Excel... 1.1.4.5. Ho t hình và ngh thu t Lĩnh v c ñ h a này bao g m các công c giúp cho các h a sĩ, các nhà thi t k phim nh chuyên nghi p th c hi n các công vi c c a mình thông qua các k x o v tranh, ho t hình ho c các k x o ñi n nh khác... Ví d : Ph n m m x lý các k x o ho t hình như: 3D Animation, 3D Studio Max..., ph n m m x lý các k x o ñi n nh: Adobe Primiere, Cool 3D,... 1.1.5. T ng quan v m t h ñ h a (Graphics System) 1.1.5.1. H th ng ñ h a Ph n m m ñ h a: Là t p h p các câu l nh ñ h a c a h th ng. Các câu l nh l p trình dùng cho các thao tác ñ h a không ñư c các ngôn ng l p trình thông d ng như PASCAL, C, ... h tr . Thông thư ng, nó ch cung c p như là m t t p công c thêm vào trong ngôn ng . T p các công c này dùng ñ t o ra các thành ph n cơ s c a m t hình nh ñ h a như: ði m, ño n th ng, ñư ng tròn, màu s c,... Qua ñó, các nhà l p trình ph i t o ra các chương trình ñ h a có kh năng ng d ng cao hơn. Ph n c ng ñ h a: Là các thi t b ñi n t : CPU, Card, màn hình, chu t, phím... giúp cho vi c th c hi n và phát tri n các ph n m m ñ h a. 1.1.5.2. Các thành ph n c a m t h th ng ñ h a T p h p các công c này ñư c phân lo i d a trên nh ng công vi c trong t ng hoàn c nh c th : xu t, nh p, bi n ñ i nh, ... bao g m: • T p công c t o ra nh g c (output primitives): cung c p các công c cơ b n nh t cho vi c xây d ng các hình nh. Các nh g c bao g m các chu i ký t , các th c th hình h c như ñi m, ñư ng th ng, ña giác, ñư ng tròn,... • T p các công c thay ñ i thu c tính (attributes): dùng ñ thay ñ i thu c tính c a các nh g c. Các thu c tính c a nh g c bao g m màu s c (color), ki u ñư ng th ng (line style), ki u văn b n (text style), m u tô vùng (area filling pattern),... 4
  • 10.
    Chương I. Cácy u t cơ s c a ñ h a • T p các công c thay ñ i h quan sát (viewing transformation): M t khi mà các nh g c và các thu c tính c a nó ñư c xác ñ nh trong h t a ñ th c, ta c n ph i chi u ph n quan sát c a nh sang m t thi t b xu t c th . Các công c này cho phép ñ nh nghĩa các vùng quan sát trên h t a ñ th c ñ hi n th hình nh ñó. • T p các công c ph c v cho các thao tác nh p d li u (input operations): Các ng d ng ñ h a có th s d ng nhi u lo i thi t b nh p khác nhau như bút v , b ng, chu t, ... Chính vì v y, c n xây d ng thêm các công c này ñ ñi u khi n và x lý các d li u nh p sao cho có hi u qu . M t yêu c u v ph n c ng không th thi u ñ t ra cho các ph n m m ñ h a là: tính d mang chuy n (portability), có nghĩa là chương trình có th chuy n ñ i m t cách d dàng gi a các ki u ph n c ng khác nhau. N u không có s chu n hóa, các chương trình thi t k thư ng không th chuy n ñ i ñ n các h th ng ph n c ng khác mà không vi t l i g n như toàn b chương trình. Sau nh ng n l c c a các t ch c chu n hóa qu c t , m t chu n cho vi c phát tri n các ph n m m ñ h a ñã ra ñ i: ñó là GKS (Graphics Kernel System - H ñ h a cơ s ). H th ng này ban ñ u ñư c thi t k như là m t t p các công c ñ h a hai chi u, sau ñó ñư c phát tri n ñ m r ng trong ñ h a ba chi u. Ngoài ra, còn có m t s chu n ñ h a ph bi n như: • CGI (Computer Graphics Interface System): h chu n cho các phương pháp giao ti p v i các thi t b ngo i vi. • OPENGL: thư vi n ñ h a c a h ng Silicon Graphics. • DIRECTX: thư vi n ñ h a c a h ng Microsoft. 1.2. MÀN HÌNH ð H A M i máy tính ñ u có m t CARD dùng ñ qu n lý màn hình, g i là Video Adapter hay Graphics Adapter. Có nhi u lo i adapter như: CGA, MCGA, EGA, VGA, Hercules... Các adapter có th làm vi c hai ch ñ : văn b n (Text Mode) và ñ h a (Graphics Mode). Có nhi u cách ñ kh i t o các mode ñ h a. Ta có th s d ng hàm $00 ng t $10 c a BIOS v i các Mode sau: 5
  • 11.
    Chương I. Cácy u t cơ s c a ñ h a • Mode $12: ch ñ phân gi i 640x480x16 • Mode $13: ch ñ phân gi i 320x200x256 Ta có th vi t m t th t c ñ kh i t o ch ñ ñ h a như sau: Procedure InitGraph(Mode:Word); var Reg:Registers; Begin reg.ah := 0; reg.al := mode; intr($10,reg); End; Các b n có th tham kh o thêm các tài li u v l p trình h th ng. 1.3. CÁC KHÁI NI M 1.3.1. ði m (Pixel) Trong các h th ng ñ h a, m t ñi m ñư c bi u th b i các t a ñ b ng s . Ví du: Trong m t ph ng, m t ñi m là m t c p (x,y) Trong không gian ba chi u, m t ñi m là b ba (x,y,z) Trên màn hình c a máy tính, m t ñi m là m t v trí trong vùng nh màn hình dùng ñ lưu tr các thông tin v ñ sáng c a ñi m tương ng trên màn hình. S ñi m v trên màn hình ñư c g i là ñ phân gi i c a màn hình (320x200, 480x640, 1024x1024,...) Cách hi n th thông tin lên màn hình ñ h a: Vùng ñ m màn hình hay còn g i là b nh hi n th ñư c b t ñ u t ñ a ch A000h:$0000h. Vì v y, ñ hi n th thông tin ra màn hình thì ta ch c n ñưa thông tin vào vùng ñ m màn hình b t ñ u t ñ a ch trên là ñư c. Có nhi u cách ñ v m t ñi m ra màn hình: có th dùng các ph c v c a BIOS ho c cũng có th truy xu t tr c ti p vào vùng nh màn hình. • N u dùng ph c v c a BIOS, ta dùng hàm $0C ng t $10: Procedure PutPixel(Col,Row:Word; Color:Byte); Var reg:Registers; Begin reg.ah:=$0C; reg.al:=Color; 6
  • 12.
    Chương I. Cácy u t cơ s c a ñ h a reg.bh:=0; reg.cx:=Col; reg.dx:=Row; Intr($10,reg); End; • N u mu n truy xu t tr c ti p vào vùng ñ m màn hình: Gi s m t ñi m (x,y) ñư c v trên màn hình v i ñ phân gi i 320x200x256 (mode 13h), ñi m ñó s ñư c ñ nh v trong vùng ñ m b t ñ u t ñ a ch segment A000h và ñ a ch offset ñư c tính theo công th c: Offset = y*320 + x. Ta có th vi t th t c 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. Các bi u di n t a ñ H u h t các chương trình ñ h a ñ u dùng h t a ñ Decartes (Hình 1.1). Ta bi n ñ i: O Y O MaxX Y X X MaxY T a ñ th gi i th c T a ñ thi t b màn hình. Hình 1.1 1.3.3. ðo n th ng Trong các h th ng ñ h a, các ño n th ng ñư c bi u th b i vi c “tô” ño n th ng b t ñ u t ñi m ñ u mút này kéo dài cho ñ n khi g p ñi m ñ u mút kia. 1.4. CÁC THU T TOÁN V ðO N TH NG 7
  • 13.
    Chương I. Cácy u t cơ s c a ñ h a 1.4.1. Bài toán: V ño n th ng ñi qua 2 ñi m A(x1,y1) và B(x2,y2) * Trư ng h p x1=x2 ho c y1=y2: r t ñơn gi n. * Trư ng h p ñư ng th ng có h s góc m: Ý tư ng: Vì các Pixel ñư c v các v trí nguyên nên ñư ng th ng ñư c v gi ng như hình b c thang (do làm tròn). V n ñ ñ t ra là ch n các t a ñ nguyên g n v i ñư ng th ng nh t. 1.4.2. Thu t toán DDA (Digital differential analyzer) Xét ñư ng th ng có h s góc 0<m≤1(gi s ñi m ñ u A n m bên trái và ñi m cu i B n m bên ph i). N u ta ch n ∆x=1và tính giá tr y k ti p như sau: yk+1 = yk + ∆y = yk + m.∆x = yk + m V i h s góc m>1: ta hoán ñ i vai trò c a x,y cho nhau. N u ch n ∆y=1 thì: xk+1 = xk + 1/m Tương t , n u ñi m B n m bên trái và A n m bên ph i thì: yk+1 = yk - m (0<m≤1, ∆x= -1) xk+1 = xk - 1/m (m>1, ∆y= -1) Tóm l i: Ta có thu t toán v ñư ng th ng DDA như sau: Nh p A(x1,y1) B(x2,y2) Tính ∆x = x2 - x1 ∆y = y2 - y1 Step = Max(|∆x| , |∆y|) Kh i t o các giá tr : IncX = ∆x/Step; x = x1; IncY = ∆y/Step; {bư c tăng khi v } {Ch n ñi m v ñ u tiên} y = y1; V ñi m (x,y); Cho i ch y t 1 ñ n Step: x = x + IncX; y = y + IncY; V ñi m (Round(x),Round(y)) T ñó ta có th t c v ño n th ng theo thu t toán DDA như sau: Procedure DDALine(x1,y1,x2,y2:Integer); var dx,dy,step,i:integer; 8
  • 14.
    Chương I. Cácy u t cơ s c a ñ h a 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. Thu t toán Bresenham Phương trình ñư ng th ng có th phát bi u dư i d ng: y = m.x + b (1) Phương trình ñư ng th ng qua 2 ñi m: x − x1 y − y1 = x 2 − x1 y 2 − y1 ð t yi+ 1 y (*) yi ∆x = x2 - x1 ∆y = y2 - y1 (*) ⇔ y = x. xi ∆y ∆y + y1 - x1. ∆x ∆x ∆y ∆x xi+1 Hình 1.2 ∆y = m. ∆x (2) b = y1 - m.x1 Suy ra m = (3) nên Ta ch xét trư ng h p h s góc 0<m<1. Gi s ñi m (xi,yi) ñã ñư c v . Ta ph i ch n ñi m k ti p là: 9
  • 15.
    Chương I. Cácy u t cơ s c a ñ h a (xi + 1,yi) ho c (xi +1,yi +1) (Xem hình 1.2) Xét kho ng cách gi a 2 ñi m ch n v i ñi m n m trên ñư ng th c. N u kho ng cách nào bé hơn thì ta l y ñi m ñó. ð t: d1 = y - yi = m.(xi +1) + b - yi d2 = (yi +1) - y = yi + 1 - m.(xi + 1) - b Suy ra: d1 - d2 = 2m.(xi + 1) - 2yi + 2b - 1 = 2. ∆y .(xi + 1) - 2yi + 2b - 1 ∆x ⇔ ∆x(d1 - d2) = 2∆y.xi - 2∆x.yi + 2∆y + ∆x.(2b - 1) ð t pi = ∆x(d1 - d2) và C = 2∆y + ∆x.(2b - 1) thì pi = 2∆y.xi - 2∆x.yi + C (4) pi+1 = 2∆y.xi+1 - 2∆x.yi+1 + C Suy ra: pi+1 - pi = 2∆y(xi+1 - xi) - 2∆x(yi - yi+1) = 2∆y - 2∆x(yi+1 - yi) (5) ( vì xi+1 - xi = 1 ) * Nh n xét: . N u pi < 0: Ch n yi+1 = yi T (5) ⇒ pi+1 = pi + 2∆y. . N u pi ≥ 0: Ch n yi+1 = yi + 1 (d1<d2) T (5) ⇒ pi+1 = pi + 2∆y - 2∆x. (d1>d2) V i ñi m mút ñ u tiên, theo (4) ta có: p1 = 2∆y.x1 - 2∆x.y1 + 2∆y + ∆x[2.(y1 - m.x1) - 1] = 2∆y - ∆x T ñó, ta có th tóm t t thu t toán v ñư ng th ng theo Bresenham cho trư ng h p h s góc 0<m<1 như sau: • Bư c 1: Nh p các ñi m ñ u mút. ði m ñ u mút bên trái ch a t a ñ (x1,y1), ñi m ñ u mút bên ph i ch a t a ñ (x2,y2). • Bư c 2: ði m ñư c ch n ñ v ñ u tiên là (x1,y1). • Bư c 3: Tính ∆x = |x2 - x1| , ∆y = |y2 - y1| và P1 = 2∆y - ∆x N u pi < 0 thì ñi m k ti p là (xi + 1,yi) Ngư c l i: ñi m k ti p là (xi + 1,yi + 1) 10
  • 16.
    Chương I. Cácy u t cơ s c a ñ h a • Bư c 4: Ti p t c tăng x lên 1 Pixel. pi+1 = pi + 2∆y v trí xi +1, ta tính: n u pi < 0 pi+1 = pi + 2.( ∆y - ∆x) n u pi ≥ 0 N u pi+1 < 0 thì ta ch n to ñ y k ti p là yi+1 Ngư c l i thì ta ch n yi+1 +1 • Bư c 5: L p l i bư c 4 cho ñ n khi x = x2. Sau ñây là th t c cài ñ t thu t toán: 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; 11
  • 17.
    Chương I. Cácy u t cơ s c a ñ h a putpixel(x,y,red); end; end; 1.4.4. Thu t toán MidPoint Ta ch xét trư ng h p h s góc 0<m<1. Thu t toán này ñưa ra cách ch n ñi m S(xi+1,yi) hay P(xi+1,yi+1) b ng cách so sánh ñi m th c Q(xi+1,y) v i ñi m M (trung ñi m c a S và P). N u ñi m Q n m dư i ñi m M thì ch n ñi m S Ngư c l i, ch n ñi m P. (Xem hình 1.3) Ta có d ng t ng quát c a phương trình ñư ng th ng: Ax + By + C = 0 v i A = y2 – y1 , B = –(x2 – x1) , C = x2.y1 – x1.y2 ð t F(x,y) = Ax + By + C, ta có nh n xét: < 0 n u (x,y) n m phía trên ñư ng th ng F(x,y) = 0 n u (x,y) thu c v ñư ng th ng > 0 n u (x,y) n m phía dư i ñư ng th ng Lúc này, vi c ch n các ñi m S hay P ñư c ñưa v vi c xét d u c a: pi = F(M) = F(xi + 1,yi + 1 ) 2 N u pi < 0 ⇒ M n m trên ño n th ng ⇒ Q n m dư i M ⇒ Ch n S N u pi ≥ 0 ⇒ M n m dư i ño n P yi+ 1 Q M th ng ⇒ Q n m trên M ⇒ Ch n P M t khác: pi pi+1 = F(xi+1 + 1,yi+1 + S yi 1 = F(xi + 1,yi + ) 2 xi xi+1 1 ) 2 Hình 1.3 nên pi+1 - pi = F(xi+1 + 1,yi+1 + 1 1 ) - F(xi + 1,yi + ) 2 2 12
  • 18.
    Chương I. Cácy u t cơ s c a ñ h a = A(xi+1+1) + B(yi+1 + 1 1 ) + C - A(xi+1) - B(yi + ) - C 2 2 = A(xi+1 - xi) + B(yi+1 - yi) = A + B(yi+1 - yi) (vì xi+1 - xi =1) Suy ra: pi+1 = pi + A + B(yi+1 - yi) (*) *Nh n xét: . N u pi < 0: Ch n ñi m S: yi+1 = yi T (*) suy ra pi+1 = pi + A . N u pi ≥ 0: Ch n ñi m P: yi+1 = yi + 1 T (*) suy ra pi+1 = pi + A + B V i ñi m mút ñ u tiên, ta có: p1 = F(x1 + 1,y1 + 1 1 ) = A(x1+1) + B(y1 + ) + C 2 2 = Ax1 + Bx1 + C + A + B B =A+ (vì Ax1 + Bx1 + C = 0) 2 2 Thu t toán MidPoint cho k t qu tương t như thu t toán Bresenham. 1.5. THU T TOÁN V ðƯ NG TRÒN Xét ñư ng tròn (C) tâm O(xc,yc) bán kính R. (y,x) (y,x ) (x,y ) (-x,y) (-y,x) (x,y) Phương trình t ng quát c a ñư ng tròn có d ng: (x - xc)2 + (y - yc)2 = R2 ⇔ y = yc ± R2 − ( x − xC ) 2 (*) (1) ð ñơn gi n thu t toán, ñ u tiên ta xét ñư ng tròn có tâm (x,y) g c t a ñ (xc=0 và yc=0). * Ý tư ng: Do tính ñ i x ng c a ñư ng tròn nên n u ñi m ( y,- Hình 1.4 (x,y)∈(C) thì các ñi m (y,x), (-y,x), (-x,y), (-x,-y), (-y,-x), (y,-x), (x,-y) cũng ∈ (C) (Hình 1.4) Vì v y, ta ch c n v m t ph n tám cung tròn r i l y ñ i x ng qua g c O và 2 tr c to ñ thì ta có ñư c toàn b ñư ng tròn. 1.5.1. Thu t toán Bresenham Gi s (xi,yi) ñã v ñư c. C n ch n ñi m k ti p là (xi +1,yi) ho c (xi +1,yi -1) (Hình 1.5) T phương trình: x2 + y2 = R2 ta tính ñư c giá tr y th c ng v i xi +1 là: 13
  • 19.
    Chương I. Cácy u t cơ s c a ñ h a y2 = R2 - (xi +1)2 d1 = yi2 - y2 = yi2 - R2 + (xi + 1)2 ð t: d2 = y2 - (yi - 1)2 = R2 - (xi + 1)2 - (yi - 1)2 Suy ra: pi = d1 - d2 = 2.(xi + 1)2 + yi2 + (yi - 1)2 - 2R2 ⇒ pi+1 = 2.(xi+1 + 1)2 + y2i+1 + (yi+1 - 1)2 - 2R2 (2) yi y yi1 (3) T (2) và (3) ta có: pi+1 - pi = 4xi + 6 + 2.(y2i+1 - yi2) - 2.(yi+1 - yi) ⇒ pi+1 = pi + 4xi + 6 + 2.(y2i+1 - yi2) - 2.(yi+1 - yi) xi xi+1 Hình 1.5 (4) * Nh n xét: N u pi < 0: ch n yi+1 = yi (4) ⇒ pi+1 = pi + 4xi + 6 N u pi ≥ 0: ch n yi+1 = yi - 1 (4) ⇒ pi+1 = pi + 4.(xi - yi) + 10 Ta ch n ñi m ñ u tiên c n v (0,R), theo (2) ta có: p1 = 3 - 2R Tóm l i: Ta có thu t toán v ñư ng tròn: • Bư c 1: Ch n ñi m ñ u c n v (x1,y1) = (0,R) • Bư c 2: Tính P ñ u tiên: p1 = 3 - 2R N u p < 0: ch n ñi m k ti p là (xi +1,yi). Ngư c l i ch n ñi m (xi + 1,yi - 1) • Bư c 3: x:=x + 1, tính l i p: N u pi < 0: pi+1 = pi + 4xi + 6. Ngư c l i: pi+1 = pi + 4.(xi - yi) + 10 Khi ñó: N u pi+1 < 0: ch n ñi m k ti p là (xi +1,yi+1). Ngư c l i ch n ñi m (xi+1,yi+1-1) • Bư c 4: L p l i bư c 3 cho ñ n khi x = y. Sau ñây là th t c ñ cài ñ t thu t toán: 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); 14
  • 20.
    Chương I. Cácy u t cơ s c a ñ h a 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. Thu t toán MidPoint T phương trình ñư ng tròn: x2 + y2 = R2 2 2 2 ð t F(x,y) = x + y - R ,ta có: < 0 n u (x,y) = 0 n u (x,y) trên ñư ng tròn M Q P trong ñư ng tròn > 0 n u (x,y) F(x,y) S yi ngoàiñư ng tròn Lúc này, vi c ch n các ñi m S(xi+1,yi) hay P(xi+1,yi-1) ñư c ñưa v vi c xét d u c a: pi = F(M) = F(xi + 1,yi - yi1 xi xi+1 Hình 1.6 1 ) (Hình 1.6) 2 N u pi < 0 ⇒ M n m trong ñư ng tròn ⇒ Q g n S hơn ⇒ Ch n S N u pi ≥ 0 ⇒ M n m ngoài ñư ng tròn ⇒ Q g n P hơn ⇒ Ch n P 15
  • 21.
    Chương I. Cácy u t cơ s c a ñ h a M t khác: pi = F(xi + 1,yi - 1 ) 2 pi+1 = F(xi+1 + 1,yi+1 - 1 ) 2 nên pi+1 - pi = F(xi+1 + 1,yi+1 - 1 1 ) - F(xi + 1,yi - ) 2 2 = [(xi+1+1)2 + (yi+1 = [(xi+2)2 + (yi+1 - 1 2 1 ) - R2] - [(xi+1)2 + (yi - )2 - R2] 2 2 1 2 1 ) - R2] - [(xi+1)2 + (yi - )2 - R2] 2 2 = 2xi + 3 + (yi+12 - yi2) - (yi+1 - yi) Suy ra: pi+1 = pi + 2xi + 3 + (yi+12 - yi2) - (yi+1 - yi) (*) *Nh n xét: . N u pi < 0: Ch n ñi m S : yi+1 = yi T (*) ⇒ pi+1 = pi + 2xi + 3 . N u pi ≥ 0: Ch n ñi m P: yi+1 = yi - 1 T (*) ⇒ pi+1 = pi + 2(xi - yi) + 5 V i ñi m ñ u tiên (0,R), ta có: p1 = F(x1 + 1,y1 - 1 1 1 5 ) = F(1,R - ) = 1 + (R - )2 - R2 = - R 4 2 2 2 1.6. THU T TOÁN V ELLIPSE ð ñơn gi n, ta ch n Ellipse có tâm g ct a ñ . Phương trình c a nó có d ng: y2 x2 + 2 =1 a2 b Ta có th vi t l i: y2 = - b2 2 .x + b2 2 a (*) *Ý tư ng: Gi ng như thu t toán v ñư ng tròn. Ch có s khác bi t Hình 1.7 ñây là ta ph i v 2 nhánh: M t nhánh t trên xu ng và m t nhánh t dư i lên và 2 nhánh này s g p nhau t i ñi m mà ñó h s góc c a ti p tuy n v i Ellipse = -1 (Hình 1.7). Phương trình ti p tuy n v i Ellipse t i ñi m (x0,y0) ∈ (E) : 16
  • 22.
    Chương I. Cácy u t cơ s c a ñ h a x0 . y x + y0. 2 = 1 2 a b Suy ra, h s góc c a ti p tuy n t i ñi m ñó là: - x 0 .b 2 . y0 a 2 1.6.1. Thu t toán Bresenham ñây, ta ch xét nhánh v t trên xu ng. Gi s ñi m (xi,yi) ñã ñư c v . ði m ti p theo c n ch n s là (xi+1,yi) ho c (xi+1,yi-1) y2 = - Thay (xi +1) vào (*): b2 .(xi +1)2 + b2 2 a ð t: d1= yi2 - y2 = yi2 + d2= y2 - (yi -1)2 = - b2 .(xi +1)2 -b2 2 a b2 .(xi +1)2 + b2 - (yi -1)2 2 a b2 ⇒ pi = d1 - d2 = 2.[ 2 .(xi +1)2 - b2] + 2.(yi2 + yi) -1 a pi+1 = 2.[ b2 .(xi+1 +1)2 - b2] + 2.(yi+12 + yi+1) -1 2 a Suy ra: pi+1 - pi = 2. b2 .[(xi+1 +1)2 - (xi +1)2] + 2.( yi+12 - yi2 + yi+1 - yi) 2 a (**) *Nh n xét: • pi < 0: Ch n yi+1 = yi (**) ⇒ pi+1 = pi + 2. b2 .(2x + 3) a2 • pi ≥ 0: Ch n yi+1 = yi -1 (**) ⇒ pi+1 = pi + 2. b2 .(2x + 3) - 4yi a2 V i ñi m ñ u tiên (0,b), ta có: p1 = 2 b2 - 2b + 1 a2 T ñó, ta có th t c v Ellipse như sau: 17
  • 23.
    Chương I. Cácy u t cơ s c a ñ h a 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 18
  • 24.
    Chương I. Cácy u t cơ s c a ñ h a 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. Thu t toán MidPoint G i ý: Phương trình Ellipse: y2 x2 + 2 =1 a2 b Nhánh 1: p1 = b2 - a 2 b + 1 2 .a 4 If pi < 0 Then pi+1 = pi + b2 + 2b2xi+1 else pi+1 = pi + b2 + 2b2xi+1 - 2a2yi+1 Nhánh 2: p1 = b2(xi + 1 2 ) + a2(yi - 1)2 - a2b2 2 If pi > 0 Then pi+1 = pi + a2 - 2a2yi+1 else pi+1 = pi + a2 + 2b2xi+1 - 2a2yi+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); 19
  • 25.
    Chương I. Cácy u t cơ s c a ñ h a 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; 20
  • 26.
    Chương I. Cácy u t cơ s c a ñ h a End; 1.7. PHƯƠNG PHÁP V ð TH HÀM S 1.7.1. Bài toán: V ñ th c a hàm s y = f(x) trên ño n [Min,Max]. *Ý tư ng: Cho x ch y t ñ u ñ n cu i ñ l y các t a ñ (x,f(x)) sau ñó làm tròn thành s nguyên r i n i các ñi m ñó l i v i nhau. 1.7.2. Gi i thu t: • Bư c 1: Xác ñ nh ño n c n v [Min,Max]. • Bư c 2: - ð t g c t a ñ lên màn hình (x0,y0). - Chia t l v trên màn hình theo h s k. - Ch n bư c tăng dx c a m i ñi m trên ño n c n v . • Bư c 3: Ch n ñi m ñ u c n v : x = Min, tính f(x) ð i qua t a ñ màn hình và làm tròn: x1:=x0 + Round(x.k); y1:=y0 - Round(y.k); Di chuy n ñ n (x1,y1): MOVETO(x1,y1); • Bư c 4: Tăng x lên v i s gia dx: x:=x + dx; ð i qua t a ñ màn hình và làm tròn: x2:=x0 + Round(x.k); y2:=y0 - Round(y.k); V ñ n (x2,y2): LINETO(x2,y2); • Bư c 5: L p l i bư c 4 cho ñ n khi x > Max thì d ng. Ví d : V ñ th hàm 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); 21
  • 27.
    Chương I. Cácy u t cơ s c a ñ h a 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:BPBGI’); Dau:=-4*Pi; cuoi:=4*Pi; VeHinhSin(Dau,cuoi); repeat until KeyPressed; CloseGraph; END. BÀI T P 1. Cho hai ñi m A(20,10) và B(25,13). Hãy tính các giá tr Pi, xi, yi m i bư c khi v ño n th ng AB theo thu t toán Bresenham/MidPoint và k t q a ñi n vào b ng sau: i 1 2 3 4 5 6 22
  • 28.
    Chương I. Cácy u t cơ s c a ñ h a Pi ? ? ? ? ? ? xi ? ? ? ? ? ? yi ? ? ? ? ? ? 2. Cài ñ t th t c v ño n th ng theo thu t toán Bresenham và MidPoint cho các trư ng h p h s góc m>1, m<-1, -1<m<0. 3. Vi t th t c LineTo(x,y:Integer); ñ v ño n th ng t v trí hi n th i ñ n ñi m có t a ñ (x,y). 4. Vi t th t c LineRel(dx,dy:Integer); ñ v ño n th ng t v trí hi n th i ñ n ñi m m i cách ñi m hi n th i m t kho ng theo tr c x là dx và theo tr c y là dy. 5. Cài ñ t th t c v ñư ng tròn theo thu t toán MidPoint. 6. Vi t th t c Arc(x0,y0,g1,g2:Integer; R:Word); ñ v cung tròn có tâm (x0,y0) bán kính R v i góc b t ñ u là g1 và góc k t thúc là g2. 7. Vi t th t c Sector(x0,y0,g1,g2:Integer; Rx,Ry:Word); ñ v cung Ellipse có tâm (x0,y0) bán kính theo tr c X là Rx, bán kính theo tr c Y là Ry v i góc b t ñ u là g1 và góc k t thúc là g2. 8. Vi t th t c DrawPoly(P:Array; n:Byte; xc,yc,R:Word); ñ v m t ña giác ñ u có n ñ nh lưu trong m ng P n i ti p trong ñư ng tròn tâm (xc,yc) bán kính R. 9. Vi t th t c Circle3P(A,B,C:ToaDo2D); ñ v ñư ng tròn ñi qua 3 ñi m A,B,C. 10. Vi t th t c Arc3P(A,B,C:ToaDo2D); ñ v cung tròn ñi qua 3 ñi m A,B,C. 11. V ñ th các hàm s sau: y = ax2 + bx + c, y = ax3 + bx2 + cx + d, y = ax4 + bx3 + cx2 + dx + e y= ax + b , cx + d y= ax 2 + bx + c . dx + e 12. V các ñư ng cong sau: 2 y = 2px y2 x2 + 2 =1 a2 b y2 x2 - 2 = ±1 a2 b Bài t p l n: Vi t chương trình kh o sát và v ñ th các hàm s sơ c p bài t p s 11. 23
  • 29.
    CHƯƠNG 2 TÔ MÀU 2.1.GI I THI U V CÁC H MÀU Giác quan c a con ngư i c m nh n ñư c các v t th xung quanh thông qua các tia sáng màu t t hơn r t nhi u so v i 2 màu tr ng ñen. Vì v y, vi c xây d ng nên các chu n màu là m t trong nh ng lý thuy t cơ b n c a lý thuy t ñ h a. Vi c nghiên c u v màu s c ngoài các y u t v m t v t lý như bư c sóng, cư ng ñ , còn có 3 y u t khác liên quan ñ n c m nh n sinh lý c a m t ngư i dư i tác ñ ng c a chùm sáng màu ñi ñ n t v t th là: Hue (s c màu), Saturation (ñ b o hòa), Lightness (ñ sáng). M t trong nh ng h màu ñư c s d ng r ng rãi ñ u tiên do A.H.Munsell ñưa ra vào năm 1976, bao g m 3 y u t : Hue, Lightness và Saturation. Ba mô hình màu ñư c s d ng và phát tri n nhi u trong các ph n c ng là: RGB dùng v i các màn hình CRT (Cathode ray bube), YIQ – dùng trong các h th ng ti vi màu băng t n r ng và CMY - s d ng trong m t s thi t b in màu. Ngoài ra, còn có nhi u h màu khác như: HSV, HSL, YIQ, HVC, ... 2.1.1.H RGB (Red, Green, Blue) M t c a chúng ta c m nh n ba màu rõ nh t là Red (ñ ), Green (l c), Blue (xanh). Vì v y, ngư i ta ñã xây d ng mô hình màu RGB (Red,Green, Blue) là t p t t c các màu ñư c xác ñ nh thông qua ba màu v a nêu. Chu n này ñ u tiên ñư c xây d ng cho các h vô tuy n truy n hình và trong các máy vi tính. T t nhiên, không ph i là t t c các màu ñ u có th bi u di n qua ba màu nói trên nhưng h u h t các màu ñ u có th chuy n v ñư c. H này ñư c xem như m t kh i ba chi u v i màu Red là tr c X, màu Green là tr c Y và màu Blue là tr c Z. M i màu trong h này ñư c xác ñ nh theo ba thành ph n RGB (Hình 2.1).
  • 30.
    Chương II. Tômàu Z Cyan Blue Magenta White Y Black Green Red Yellow X Hình 2.1. H màu RGB Ví d : Màu Red là (1, 0, 0) Màu Blue là (0, 0, 1) Red + Green = Yellow Red + Green + Blue = White 2.1.2. H CMY (Cyan, Magenta, Yellow) H này cũng ñư c xem như m t kh i ba chi u như h RGB. Nhưng h CMY trái ngư c v i h RGB, ch ng h n: White có thành ph n (0, 0, 0) Cyan có thành ph n (1, 0, 0) Green có thành ph n (1, 0, 1) ... Sau ñây là công th c chuy n ñ i t h RGB → CMY :  C  1  R   M  = 1 − G        Y  1  B       2.1.3. H YIQ H màu này ñư c ng d ng trong truy n hình màu băng t n r ng t i M , do ñó nó có m i quan h ch t ch v i màn hình raster. YIQ là s thay ñ i c a RGB cho kh năng truy n phát và tính tương thích v i ti vi ñen tr ng th h trư c. Tín hi u truy n s d ng trong h th ng NTSC (National Television System Committee). Sau ñây là công th c bi n ñ i t h RGB thành h YIQ: 26
  • 31.
    Chương II. Tômàu 0.114   R  Y  0.299 0.587  I  = 0.596 − 0.275 − 0.321 * G        Q  0.212 − 0.523 0.311   B        Ma tr n ngh ch ñ o c a ma tr n bi n ñ i RGB thành h YIQ ñư c s d ng cho phép bi n ñ i t h YIQ thành RGB. 2.1.4. H HSV (Hue, Saturation, Value) Mô hình màu này còn ñư c g i là h HSB v i B là Brightness (ñ sáng) d a trên cơ s n n t ng tr c giác v tông màu, s c ñ và s c thái m thu t (Hình 2.2). Hue có giá tr t 00 → 3600 S, V có giá tr t 0 →1 V Yellow Green 1.0 Cyan White Blue Red White H S 0.0 Black Hình 2.2. H màu HSV Ví d : Red ñư c bi u di n (00, 1, 1) Green ñư c bi u di n (1200,1,1) 2.1.5. H HSL (Hue, Saturation, Lightness) H này ñư c xác ñ nh b i t p h p hình chóp sáu c nh ñôi c a không gian hình tr (hình 2.3). 1.0 L White Yellow Green 0.5 Cyan Blue Red White H S 0.0 Black Hình 2.3. H màu HSL 27
  • 32.
    Chương II. Tômàu 2.2. CÁC THU T TOÁN TÔ MÀU 2.2.1. Bài toán P2 Cho ña giác S xác ñ nh b i n ñ nh : P1, P2, W P1 ..., Pn. Hãy tô màu mi n S. * Phương pháp t ng quát : P3 S - Tìm hình ch nh t W nh nh t ch a S P5 (hình 2.4). - Duy t qua t t c các ñi m P(x, y) ∈ W. N u P ∈ S thì tô màu ñi m P. P4 Hình 2.4 2.2.2. Thu t toán xác ñ nh P ∈ S 2.2.2.1. S là ña giác l i - L y P ∈ W, n i P v i các ñ nh c a S thì ta ñư c n tam giác : Si= PPiPi+1, v i Pn+1=P1. n -N u ∑ dt(S ) i =1 i = dt(S) thì P ∈ S. Ta có công th c tính di n tích c a S: 1 n ( S= | ∑xi yi+1 −xi+1yi) | 2 i=1 2.2.2.2. Trư ng h p t ng quát (Thu t toán Jordan) L y P(x, y) ∈ W, k n a ñư ng th ng ∆P xu t phát t P và không ñi qua các ñ nh c a ña giác S. G i S(P) là s giao ñi m c a ∆P v i các biên c a S. N u S(P) l thì P ∈ S. * V n ñ còn l i là tìm S(P): Bư c 1: K n a ñư ng th ng ∆P // 0y và hư ng v phía y>0. Bư c 2: V i m i c nh Ci= PiPi+1 c a S: + N u x=xi thì xét 2 c nh có 1 ñ u là Pi: N u y<yi thì 28
  • 33.
    Chương II. Tômàu • N u c 2 ñ u kia cùng m t phía c a ∆P thì ta tính ∆P c t c 2 c nh. • Ngư c l i : ∆P c t 1 c nh. + Ngư c l i: • N u x>Max(xi,xi+1) ho c x<Min(xi,xi+1) thì ∆P không c t Ci • Ngư c l i: -N u y<= Min(yi, yi+1) thì ∆P c t Ci -Ngư c l i : Xét t a ñ giao ñi m (x0, y0) c a ∆P v i Ci N u y >= y0 thì ∆P không c t Ci. Ngư c l i ∆P c t Ci. Thu t toán này có th ñư c cài ñ t b ng ño n chương trình 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; 29
  • 34.
    Chương II. Tômàu 2.2.3. Thu t toán tô màu theo dòng quét (Scanline) ð t x0 = Min(xi), i∈ [1,n]. y Bư c 1: K Dy//0y ñi qua x0 (hình 2.5). Dy Bư c 2: Xác ñ nh các giao ñi m Mi(x,y) c a Dy v i các c nh Ci. N u có c nh Ci = PiPi+1 song song và trùng v i Dy thì xem như Dy c t Ci t i 2 ñi m Pi và Pi+1. Bư c 3: S p x p l i các ñi m Mi theo th t tăng d n ñ i v i yi (ñi m ñ u x0 x xi Hình 2.5 tiên có th t là 1). Bư c 4: Nh ng ñi m n m trên Dy gi a giao ñi m l và giao ñi m ch n liên ti p là nh ng ñi m n m trong ña giác và nh ng ñi m này s ñư c tô. Bư c 5: Tăng x0 lên m t Pixel. N u x0 ≤ Max(xi) thì quay l i bư c 1. 2.2.4. Thu t toán tô màu theo v t d u loang L y P(x,y) ∈ S, tô màu P. Xét các ñi m lân c n c a P (Hình 2.6). X X O N u các ñi m lân c n ñó v n còn thu c S và chưa O X X ñư c tô màu thì tô màu các ñi m lân c n ñó... Thu t toán trên có th ñư c minh h a b ng th t c Hình 2.6 ñ qui: Procedure TOLOANG(x,y:Integer; Color:Word); Begin If (P(x,y)∈S)and(P(x,y)chưa tô) Then Begin PutPixel(x,y,Color); TOLOANG(x+1,y,Color); TOLOANG(x-1,y,Color); 30
  • 35.
    Chương II. Tômàu TOLOANG(x,y+1,Color); TOLOANG(x,y-1,Color); End; End; BÀI T P 1. Vi t hàm DienTich(P:Array; n:Byte); ñ tính di n tích c a ña giác l i có n ñ nh lưu trong m ng P. 2. Vi t hàm KiemTra(x,y:Integer; P:Array; n:Byte):Boolean; ñ ki m tra ñi m (x,y) n m trong hay ngoài ña giác có n ñ nh ñư c lưu trong m ng P theo hai cách: - Dùng công th c tính di n tích ña giác (ñ i v i ña giác l i). - Dùng thu t toán Jordan (ñ i v i ña giác b t kỳ). 2. Vi t chương trình cài ñ t thu t toán tô màu m t ña giác theo thu t toán Scanline. 3. Vi t chương trình cài ñ t thu t toán tô màu m t ña giác theo v t d u loang theo hai phương án: a. ð qui. b. Kh ñ qui. 4. Vi t th t c FillRec(x1,y1,x2,y2:Integer; color:Byte); ñ tô màu hình ch nh t xác ñ nh b i 2 ñ nh (x1,y1) và (x2,y2). 5. Vi t th t c FillEllipse(x,y,Rx,Ry:Integer; color:Byte); ñ tô màu Ellipse có tâm (x,y) và bán kính theo hai tr c là Rx và Ry. 6. Vi t th t c FillSector(x,y,Rx,Ry,g1,g2:Integer; color:Byte); ñ tô màu hình qu t Ellipse có tâm (x,y), bán kính theo hai tr c là Rx và Ry, góc b t ñ u là g1 và góc k t thúc là g2. 7. Vi t th t c Donut(x,y,Rmin,Rmax:Integer; color:Byte); ñ tô màu hình vành khăn có tâm (x,y) và bán kính hai ñư ng tròn tương ng là Rmin và Rmax. Bài t p l n: Xây d ng m t thư vi n ñ h a MYGRAPH tương t như thư vi n GRAPH.TPU c a Turbo Pascal. 31
  • 36.
    CHƯƠNG III XÉN HÌNH 3.1.ð T V N ð Cho m t mi n D ⊂ Rn và F là m t hình trong Rn (F ⊂ Rn). Ta g i F ∩ D là hình có ñư c t F b ng cách xén vào trong D và ký hi u là ClipD(F). Bài toán ñ t ra là xác ñ nh ClipD(F). 3.2. XÉN ðO N TH NG VÀO VÙNG HÌNH CH NH T C A R2 3.2.1. C nh c a hình ch nh t song song v i các tr c t a ñ Lúc này:  D = ( x, y ) ∈ R 2 |  X min ≤ x ≤ X max   Y min ≤ y ≤ Y max  và F là ño n th ng n i 2 ñi m (x1,y1), (x2,y2) nên phương trình c a F là:  x = x1 + ( x 2 − x1). t   y = y1 + ( y 2 − y1). t t ∈ [0,1] Do ñó, F có th ñư c vi t dư i d ng: F = {(x,y) ∈ R2 | x = x1 + (x2 -x1).t; y = y1 + (y2 -y1).t; 0 ≤ t ≤ 1} Khi ñó, giao ñi m c a F và D chính là nghi m c a h b t phương trình (theo t): Xmin ≤ x1+ (x2 - x1). t ≤ Xmax   Ymin ≤ y1+ (y2 - y1). t ≤ Ymax  0≤ t ≤1  G i N là t p nghi m c a h phương trình A y yMax P Q yMin B xMin trên. Hình 3.1 N u N = ∅ thì ClipD(F) = ∅ N u N ≠ ∅ thì N = [t1, t2] (t1 ≤ t2) G i P, Q là 2 giao ñi m xác ñ nh b i: xMax X
  • 37.
    Chương III. Xénhình  Px = x1 + ( x 2 − x1). t 1   Py = y1 + ( y 2 − y1). t 1 thì: ClipD(F) = PQ  Qx = x1 + ( x 2 − x1). t 2  Qy = y1 + ( y 2 − y1). t 2 (Hình 3.1) 3.2.1.1. Thu t toán Cohen - Sutherland • Chia m t ph ng ra làm 9 vùng, m i vùng ñánh m t mã nh phân 4 bit (hình 3.2). Bit 1: Qui ñ nh vùng n m bên trái c a s 100 1 100 0 101 0 Bit 3: Qui ñ nh vùng n m bên dư i c a s 000 1 000 0 001 0 Bit 4: Qui ñ nh vùng n m bên trên c a s 010 1 010 0 011 0 Bit 2: Qui ñ nh vùng n m bên ph i c a s • Xét ñi m P ∈ R2 : Hình 3.2 1 0 nãúuPx < X min Ngæåüc laûi 1 0 nãúuP > X max x Ngæåüc laûi 1 0 nãúuPy < Y min Ngæåüc laûi 1  0 nãúuPy > Y max Ngæåüc laûi Pleft =  PRight =  PBelow =  PAbove = • Xét ño n th ng AB, ta có các trư ng h p sau: i/ N u Mã(A) = Mã(B) = 0000 thì AB ∈ D ⇒ ClipD(F) = AB ii/ N u Mã(A) AND Mã(B) ≠ 0000 thì ño n AB n m hoàn toàn bên ngoài hình ch nh t ⇒ ClipD(F) = ∅ Chú ý: Phép toán AND là phép toán Logic gi a các bit. iii/ N u (Mã(A) AND Mã(B) = 0000) và (Mã(A) ≠ 0000 ho c Mã(B) ≠ 0000) thì: Gi s Mã(A) ≠ 0000 ⇔ A n m ngoài hình ch nh t. ♦ N u Aleft = 1 : thay A b i ñi m n m trên ño n AB và c t c nh trái (n i dài) c a hình ch nh t. 33
  • 38.
    Chương III. Xénhình ♦ N u Aright = 1: thay A b i ñi m n m trên ño n AB c t c nh ph i (n i dài) c a hình ch nh t. ♦ N u ABelow = 1: thay A b i ñi m n m trên ño n AB và c t c nh dư i (n i dài) c a hình ch nh t. ♦ N u AAbove = 1: thay A b i ñi m n m trên ño n AB và c t c nh trên (n i dài) c a hình ch nh t. Chú ý: Quá trình này ñư c l p l i: Sau m i l n l p, ta ph i tính l i mã c a A. N u c n, ph i ñ i vai trò c a A và B ñ ñ m b o A luôn luôn n m bên ngoài hình ch nh t. Quá trình s d ng khi x y ra m t trong 2 trư ng h p: i/ ho c ii/ 3.2.1.2. Thu t toán chia nh phân • Ý tư ng c a thu t toán này tương t như thu t toán tìm nghi m b ng phương pháp chia nh phân. • M nh ñ : Cho M: trung ñi m c a ño n AB, Mã(A) ≠ 0000, Mã(B) ≠ 0000, Mã(M) ≠ 0000 thì ta có: [Mã(A) AND Mã(M)] ≠ 0000 ho c [Mã(M) AND Mã(B)] ≠ 0000. Ý nghĩa hình h c c a m nh ñ : N u c ba ñi m A, B, M ñ u ngoài hình ch nh t thì có ít nh t m t ño n hoàn toàn n m ngoài hình ch nh t. • Ta phát th o thu t toán như sau: i/ N u Mã(A) = 0000 và Mã(B) = 0000 thì ClipD(F) = AB ii/ N u Mã(A) AND Mã(B) ≠ 0000 thì ClipD(F) = ∅ iii/ N u Mã(A) = 0000 và Mã(B) ≠ 0000 thì: P:=A; Q:=B; Trong khi |xP -xQ| + |yP - yQ| ≥ 2 thì: ♦ L y trung ñi m M c a PQ; ♦ N u Mã(M) ≠ 0000 thì Q:= M. 34
  • 39.
    Chương III. Xénhình Ngư c l i: P:= M. ⇒ ClipD(F) = AP iv/ N u Mã(A) ≠ 0000 và Mã(B) = 0000 thì: ð i vai trò c a A, B và áp d ng ii/ v/ N u Mã(A) ≠ 0000 ≠ Mã(B) và [Mã(A) AND Mã(B)]= 0000 thì: P:=A; Q:=B; L y M: trung ñi m PQ; Trong khi Mã(M) ≠ 0000 và |xP - xQ| + |yP - yQ| ≥ 2 thì: ♦ N u Mã(M) AND Mã(Q) ≠ 0000 thì Q:=M. Ngư c l i P:=M. ♦ L y M: trung ñi m PQ. N u Mã(M) ≠ 0000 thì ClipD(F) = ∅ . Ngư c l i, áp d ng ii/ ta có: ClipD(MA) = MA1 ClipD(MB) = MB1 Suy ra: ClipD(F) = A1B1 3.2.1.3. Thu t toán Liang - Barsky ∆x = x2 - x1 ∆y = y2 - y1 p1 = - ∆x q1 = x1 - xMin p2 = ∆x q2 = xMax - x1 p3 = - ∆y q3 = y1 - yMin p4 = ∆y ð t q4 = yMax - y1 thì h b t phương trình giao ñi m c a F và D có th vi t l i: Pk .t ≤ Q k , k = 1..4   0 ≤ t ≤1 Xét các trư ng h p sau: i/ ∃k: Pk = 0 và Qk < 0: ( ðư ng th ng song song v i các biên và n m ngoài vùng hình ch nh t ) 35
  • 40.
    Chương III. Xénhình ⇒ ClipD(F) = ∅ ii/ ∀k ∈ {1,2,3,4}: Pk ≠ 0 ho c Qk ≥ 0: ð t K1 = {k | Pk > 0 } K2 = {k | Pk < 0 } u1 = Max({ Qk | k ∈ K2} ∪ {0}) Pk u2 = Min({ Qk | k ∈ K1} ∪ {1}) Pk N u u1 > u2 thì ClipD(F) = ∅ Ngư c l i: G i P, Q là 2 ñi m th a  Px = x1 + ∆x.u1 Qx = x1 + ∆x.u2 và   Py = y1 + ∆y.u1 Qy = y1 + ∆y.u2 thì ClipD(F) = PQ 3.2.2. Khi c nh c a vùng hình ch nh t t o v i tr c hoành m t góc α∈(0,Π/2) Π Ta dùng phép quay tr c t a ñ ñ ñưa bài toán v trư ng h p các c nh c a hình ch nh t song song v i các tr c t a ñ (hình 3.3). y G i R là ma tr n quay c a phép ñ i tr c, ta có:  X min  X min   = R.    Y min   Y min  α  X max  X max   = R.    Y max   Y max  x O v i  cos(α ) sin(α )    − sin(α ) cos(α ) R=  Hình 3.3 36
  • 41.
    Chương III. Xénhình 3.3. XÉN ðO N TH NG VÀO HÌNH TRÒN Gi s ta có ñư ng tròn tâm O(xc,yc) bán kính R và ño n th ng c n xén là AB v i A(x1,y1), B(x2,y2) (Hình 3.4). A * Thu t toán: B • Tính d(O,AB) • Xét các trư ng h p: i/ N u d > R thì ClipD(F) = ∅ Hình 3.4 ii/ N u d = R thì ClipD(F) = A0 v i A0 là chân ñư ng vuông góc h t O xu ng AB. iii/ N u d < R thì xét các trư ng h p sau: ♦ (OA < R) AND (OB < R) thì ClipD(F) = AB ♦ N u m t ñi m n m trong và ñi m kia n m ngoài hình tròn, ch ng h n OA<R và OB>R thì ClipD(F) = AI v i I là giao ñi m duy nh t gi a AB và ñư ng tròn. ♦ (OA > R) AND (OB > R) thì ClipD(F) = IJ v i I, J là hai giao ñi m c a AB v i ñư ng tròn. Sau ñây là phương pháp tìm giao ñi m gi a ño n th ng và ñư ng tròn: ◊ Phương trình ñư ng tròn: (x - xc)2 + (y - yc)2 = R2 (1)  x = x1 + ( x 2 − x1).λ  ◊ Phương trình ño n AB:  y = y1 + ( y 2 − y1).λ  0 ≤ λ ≤1  (2) ◊ Thay (2) vào (1) ta suy ra: λ = − a ± a 2 − bc b Trong ñó: a = ∆x.(x1 - xc) + ∆y.(y1 - yc) b = (∆x)2 + (∆y)2 c = (x1 - xc)2 + (y1 - yc)2 - R2 37
  • 42.
    Chương III. Xénhình ∆x = x2 - x1 ∆y = y2 - y1 ◊ D a vào ñi u ki n 0 ≤ λ ≤ 1 ñ ch n giao ñi m. 3.4. XÉN ðƯ NG TRÒN VÀO HÌNH CH NH T CÓ CÁC C NH SONG SONG V I TR C T A ð Lúc này: D = {(x,y)| xMin ≤ x ≤ xMax ; yMin ≤ y ≤ yMax } F = { (x,y)| (x - xC)2 + (y - yC)2 = R2} *Trư c h t, ta ki m tra các trư ng h p ñ c bi t sau: i/ Hình 3.5 N u xMin ≤ xC -R; xC +R ≤ xMax; yMin ≤ yC -R; yC +R ≤ yMax; thì ClipD(F) = F (Hình 3.5) ii/ N u xC +R < xMin ho c xC -R > xMax ho c yC +R < yMin ho c yC - R > yMax thì ClipD(F) = ∅ (Hình 3.6) Hình 3.6 *Xét trư ng h p còn l i: Tìm các giao ñi m c a F và D. S p x p các giao ñi m ñó theo chi u ngư c kim ñ ng h . • Các cung tròn ñư c t o b i 2 giao ñi m liên ti p s hoàn toàn n m trong D ho c hoàn toàn n m bên ngoài D. • ð xác ñ nh các cung này n m trong hay ngoài D, ta ch c n l y trung ñi m M c a cung ñó. N u M ∈ D thì cung ñó n m trong D, ngư c l i thì nó n m ngoài D. 38
  • 43.
    Chương III. Xénhình 3.5. XÉN ðA GIÁC VÀO HÌNH CH NH T Hình 3.7. Xén ña giác vào hình ch nh t Thu t toán SutherLand - Hodgman N u t t c các ñ nh c a ña giác ñ u n m trong hình ch nh t thì hình c n xén i/ chính là ña giác và bài toán coi như ñã ñư c gi i quy t. Ai+ Ai Ai Ai+ Ai+ Ai+ Ai+ Ai Ai Ai Hình 3.8. Các trư ng h p c n xét ii/ Trư ng h p ngư c l i: - Xu t phát t m t ñ nh n m ngoài hình ch nh t, ta ch y theo d c biên c a ña giác. V i m i c nh c a ña giác, ta có các trư ng h p sau: N u c hai ñ nh ñ u n m ngoài hình ch nh t thì: N u Ma(Ai) and Ma(Ai+1) ≠ 0000 thì không lưu ñ nh Ngư c l i thì lưu hai giao ñi m. Ai ngoài, Ai+1 trong: lưu giao ñi m P và Ai+1. C hai ñ nh ñ u n m trong hình ch nh t: lưu Ai và Ai+1. Ai trong, Ai+1 ngoài: lưu Ai và giao ñi m P. 39
  • 44.
    Chương III. Xénhình - Sau khi duy t qua t t c các c nh c a ña giác thì ta có ñư c m t dãy các ñ nh m i phát sinh: B1, B2, ..., Bn N u trong dãy các ñ nh m i này có hai ñ nh liên ti p không n m trên cùng m t c nh c a hình ch nh t , gi s hai ñ nh ñó là Bi và Bi+1 thì ta ñi d c các c nh c a hình ch nh t t Bi ñ n Bi+1 ñ tìm t t c các ñ nh c a hình ch nh t n m trong ña giác r i b sung chúng vào gi a Bi và Bj. T p ñ nh m i tìm ñư c chính là ña giác xén ñư c. - N u t p ñ nh m i này là r ng: N u có m t ñ nh c a hình ch nh t n m trong ña giác thì hình xén ñư c chính là toàn b hình ch nh t. Ngư c l i, hình xén ñư c là r ng. BÀI T P 1. Vi t hàm MA(P:ToaDo):Byte; ñ ñánh mã cho ñi m P. 2. Cài ñ t thu t toán xén m t ño n th ng vào m t hình ch nh t theo các thu t toán: Liang-Barsky, Cohen-Sutherland, chia nh phân. 3. Cài ñ t thu t toán xén m t ño n th ng vào m t hình tròn. 4.Cài ñ t thu t toán xén m t ña giác vào m t vùng hình ch nh t. 40
  • 45.
    CHƯƠNG IV CÁC PHÉPBI N ð I 4.1. CÁC PHÉP BI N ð I TRONG M T PH NG 4.1.1. Cơ s toán h c Phép bi n ñ i Affine 2D s bi n ñi m P(x,y) thành ñi m Q(x’,y’) theo h phương trình sau: x’ = Ax + Cy + trx y’ = Bx + Dy + try Dư i d ng ma tr n, h này có d ng: A B  + (trx try)  C D (x’ y’) = (x y).   Hay vi t g n hơn: X’ = X.M + tr v i X’=(x’,y’); X=(x,y); tr=(trx,try) - vector t nh ti n; A B  - ma tr n bi n ñ i.  C D M=   4.1.1.1. Phép ñ ng d ng Ma tr n c a phép ñ ng d ng là:  A 0   0 D M=   x ' = Ax  y ' = Dy ⇔ Cho phép ta phóng to hay thu nh hình theo m t hay hai chi u. 4.1.1.2. Phép ñ i x ng ðây là trư ng h p ñ c bi t c a phép ñ ng d ng v i A và D ñ i nhau.  −1 0    0 1 ñ i x ng qua Oy
  • 46.
    Chương IV. Cácphép bi n ñ i 1 0     0 −1 ñ i x ng qua Ox  −1 0     0 −1 ñ i x ng qua g c t a ñ 4.1.1.3. Phép quay Ma tr n t ng quát c a phép quay là  Cos (α ) Sin(α )     − Sin(α ) Cos (α )  R=   Chú ý: • Tâm c a phép quay ñư c xét ñây là g c t a ñ . • ð nh th c c a ma tr n phép quay luôn luôn b ng 1. 4.1.1.4. Phép t nh ti n Bi n ñ i (x,y) thành (x’,y’) theo công th c sau x’ = x + M y’ = y + N ð thu n ti n bi u di n dư i d ng ma tr n, ta có th bi u di n các t a ñ dư i d ng t a ñ thu n nh t (Homogen): 1  (x y 1).  0  M 0 1 N 0  0 = (x + M  1 y+N 1) 4.1.1.5. Phép bi n d ng Ma tr n t ng quát là: M =  1 g  Trong ñó:  h   1  g = 0: bi n d ng theo tr c x. h = 0: bi n d ng theo tr c y. 4.1.1.6. H p c a các phép bi n ñ i Có ma tr n bi n ñ i là tích c a các ma tr n c a các phép bi n ñ i. .42
  • 47.
    Chương IV. Cácphép bi n ñ i Ví d : Phép quay quanh m t ñi m b t kỳ trong m t ph ng có th th c hi n b i tích c a các phép bi n ñ i sau: ° Phép t nh ti n tâm quay ñ n g c t a ñ . ° Phép quay v i góc ñã cho. ° Phép t nh ti n k t qu v tâm quay ban ñ u. Như v y, ma tr n c a phép quay quanh m t ñi m b t kỳ ñư c th c hi n b i tích c a ba phép bi n ñ i sau:  1   0  −M 0 1 −N 0  Cos(α ) Sin (α ) 0  1     0 .  − Sin (α ) Cos(α ) 0 .  0     1  0 0 1  M 0 1 N 0  0  1 4.2. Ví d minh h a Vi t chương trình mô ph ng phép quay m t tam giác quanh g c t a ñ . 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), .43
  • 48.
    Chương IV. Cácphép bi n ñ i 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 .44
  • 49.
    Chương IV. Cácphép bi n ñ i 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. CÁC PHÉP BI N ð I TRONG KHÔNG GIAN 4.2.1. Các h tr c t a ñ ð ñ nh v m t ñi m trong không gian, ta có th ch n nhi u h tr c t a ñ : Z Z Y Y O X H tr c ti p H gián ti p Hình 4.1 • H t a ñ tr c ti p : n u tay ph i c m tr c Z sao cho ngón cái hư ng theo chi u dương c a tr c Z thì b n ngón còn l i s quay t tr c X sang tr c Y (Qui t c bàn tay ph i). .45
  • 50.
    Chương IV. Cácphép bi n ñ i • H t a ñ gián ti p : ngư c l i (Qui t c bàn tay trái). Thông thư ng, ta luôn luôn ñ nh v m t ñi m trong không gian qua h tr c ti p. Trong h t a ñ tr c ti p, ta chia ra làm 2 lo i sau: Z Z P(R,θ,φ) P(x,y,z) R Y φ O O Y θ X X H t a ñ Descarter H c u Hình 4.2 Ta có công th c chuy n ñ i t a ñ t h này sang h khác: x = R.Cos(θ).Cos(Φ) θ Φ y = R.Sin(θ).Cos(Φ) θ Φ z = R.Sin(Φ) Φ R 2 = x2 + y 2 + z 2 ð thu n ti n cho vi c tính toán, t t c các ñi m trong không gian ñ u ñư c mô t dư i d ng ma tr n 1x4, t c là (x,y,z,1). Vì v y, t t c các phép bi n ñ i trong không gian ñ u ñư c bi u di n b i các ma tr n vuông 4x4 (Ma tr n Homogen). 4.2.2. Các công th c bi n ñ i Phép bi n ñ i Affine 3D có d ng: X’=X.M + tr v i X’=(x’,y’,z’); X=(x,y,z); M - ma tr n bi n ñ i; tr=(trx,try,trz) - vector t nh ti n 4.2.2.1. Phép thay ñ i t l  A 0 0 0    0 B 0 0 M=  0 0 C 0    0 0 0 1 ⇔  x ' = A. x   y ' = B. y  z ' = C. z  .46
  • 51.
    Chương IV. Cácphép bi n ñ i 4.2.2.2. Phép ñ i x ng 1  0 Mz =  0  0 0  0 0 −1 0  0 0 1 0 1 0 0 1 0  0 −1 My=  0 0  0 0  −1  0 Mx =  0  0 ñ i x ng qua m t (XY) 0 0  0 0 1 0  0 1 ñ i x ng qua m t (XZ) 0 0 0  1 0 0 0 1 0  0 0 1 ñ i x ng qua m t (YZ) 4.2.2.3. Phép t nh ti n 1  0 M=  0  M 0 1 0 N 0  0 1 0  P 1 0 0 ⇔ x ' = x + M   y' = y + N  z' = z + P  4.2.2.4. Phép quay Ta nh n th y r ng, n u phép quay quay quanh m t tr c nào ñó thì t a ñ c a v t th t i tr c ñó s không thay ñ i. Do ñó, ta có ma tr n c a các phép quay như sau:  Cos (θ ) Sin(θ )   − Sin(θ ) Cos (θ ) RZ =  0 0   0 0  0 0  0 0 1 0  0 1  0 0 1   0 Cos (θ ) Sin(θ ) RX =  0 − Sin(θ ) Cos (θ )  0 0 0  0  0 0  1  .47
  • 52.
    Chương IV. Cácphép bi n ñ i  Cos (θ )  0  RY =  − Sin(θ )   0  Sin(θ ) 0  1 0 0 0 Cos (θ ) 0   0 0 1  0 Chú ý: Tích c a 2 ma tr n nói chung không giao hoán nên k t qu c a 2 phép quay liên ti p tùy thu c vào th t th c hi n tích s . Ví d : RX.RY ≠ RY.RX 4.2.3. Ma tr n ngh ch ñ o ð nh nghĩa: Hai ma tr n ñư c g i là ngh ch ñ o c a nhau n u tích s c a chúng là ma tr n ñơn v . Ma tr n ngh ch ñ o c a ma tr n M ký hi u là M-1 Ví d :  1 2 3  6 −2 −3  1 0 0        1 3 3 .  −1 1 0  =  0 1 0        1 2 4  −1 0 1   0 0 1 Ngư i ta ch ng minh ñư c r ng: T t c các ma tr n c a các phép bi n ñ i ñã nêu trên ñ u có ma tr n ngh ch ñ o. • Ma tr n ngh ch ñ o c a phép t nh ti n có ñư c b ng cách thay M, N, P b ng M, -N, -P. • Ma tr n ngh ch ñ o c a phép thay ñ i t l có ñư c b ng cách thay A, B, C b ng 1/A, 1/B, 1/C. • Ma tr n ngh ch ñ o c a phép quay có ñư c b ng cách thay góc θ b ng -θ . θ 4.3. CÁC PHÉP CHI U C A V T TH TRONG KHÔNG GIAN LÊN M T PH NG 4.3.1. Phép chi u ph i c nh (Perspective) Phép chi u này cho hình nh gi ng như khi nhìn v t th . ð tìm hình chi u P’(y’,z’) c a P(x,y,z), ta n i P v i m t (tâm chi u). Giao ñi m c a ñư ng này v i m t quan sát chính là P’ (hình 4.3). Gi s P n m phía trư c m t, t c là P.x < E. .48
  • 53.
    Chương IV. Cácphép bi n ñ i Z P(x,y,z) z' P' y' (E,0,0) X Maét Y Maët phaún g chieáu Hình 4.3 Phương trình c a tia ñi qua m t và P là: r(t) = (E,0,0).(1-t) + (x,y,z).t (*) Giao ñi m v i m t ph ng quan sát có thành ph n x’ = 0. Do thành ph n x’ c a tia r là E.(1-t) + x.t = 0 nên t = 1 . Thay t vào (*) ta 1− x / E tính ñư c: y’ = y z va z’ = 1− x / E 1− x / E NH N XÉT i/ Phép chi u ph i c nh không gi nguyên hình d ng c a v t th . ii/ Ch có nh ng ñư ng th ng song song v i m t ph ng chi u thì m i song song v i nhau. iii/ Phép chi u ph i c nh ñư c qui ñ nh b i 5 bi n: • Hư ng c a m t ph ng chi u so v i v t th . • ð cao c a tâm chi u so v i v t th . • Kho ng cách t tâm chi u ñ n v t th (R). • Kho ng cách t m t ph ng chi u ñ n tâm chi u (D). • ð d ch chuy n ngang c a tâm chi u so v i v t th . Chú ý: V i t a ñ c u, ta ch c n 4 tham s : R, Φ, θ, D. .49
  • 54.
    Chương IV. Cácphép bi n ñ i 4.3.2. Phép chi u song song (Parallel) Phép chi u này có tâm chi u vô c c và y’=y, z’=z.(Hình 4.4) Tính song song ñư c b o toàn. A A' Taâm chieáu (∝) B' B Maët phaúng chieáu Hình 4.4 4.4. CÔNG TH C C A CÁC PHÉP CHI U LÊN MÀN HÌNH Khi quan sát m t v t th trong không gian dư i m t góc ñ nào ñó, ta có 2 kh năng ch n l a: • ði m nhìn (màn hình) ñ ng yên và v t th di ñ ng. • V t th ñ ng yên và ñi m nhìn s ñư c b trí thích h p. Ta thư ng ch n gi i pháp th hai vì nó sát v i th c t hơn. Y0 Z Z0 YE O' XE Y φ O X0 θ X Maøn hình Hình 4.5 Khi quan sát m t v t th b t kỳ trong không gian, ta ph i tuân th các nguyên t c sau (hình 4.5): • V t th ph i ñư c chi u lên m t h tr c ti p (O,X,Y,Z). .50
  • 55.
    Chương IV. Cácphép bi n ñ i • Con m t ph i n m g c c a m t h gián ti p th hai (O’,X0,Y0,Z0) • Màn hình là m t ph ng vuông góc v i ñư ng th ng OO’. • Tr c Z0 c a h quan sát ch ñ n g c O. N u dùng h t a ñ c u ñ ñ nh v m t c a ngư i quan sát thì ta d dàng thay ñ i góc ng m b ng cách thay ñ i góc θ và Φ. Bây gi , ta kh o sát phép bi n ñ i mà v t th (X,Y,Z) ph i ch u ñ cho nó trùng v i h quan sát (X0,Y0,Z0) ñ cu i cùng t o ra h t a ñ màn hình (Xe,Ye). Bư c 1: T nh ti n g c O thành O’ (hình 4.6). Z1 Z Y1 O' φ O θ Y X1 X Hình 4.6 Ma tr n c a phép t nh ti n (L y ngh ch ñ o):  1  0 A=   0  −M 0 1 0 −N 0 1 0 0    0 0 1 0 =  1 0 0 0 1   − P 1  − R. Cos(θ ). Cos(φ ) − R. Sin (θ ). Cos(φ ) − R. Sin (φ ) 0 0 0  0 0  1 và h (X,Y,Z) bi n ñ i thành h (X1,Y1,Z1). Bư c 2: Quay h (X1,Y1,Z1) m t góc -θ‘ (θ‘=900 - θ) quanh tr c Z1 theo chi u kim θ θ ñ ng h . Phép quay này làm cho tr c âm c a Y1 c t tr c Z (hình 4.7). Ta g i Rz là ma tr n t ng quát c a phép quay quanh tr c Z. Vì ñây là phép quay h tr c nên ph i dùng ma tr n ngh ch ñ o R-1z. .51
  • 56.
    Chương IV. Cácphép bi n ñ i  Cos( a ) Sin ( a )  − Sin ( a ) Cos( a ) Rz =   0 0  0  0  Cos( a ) − Sin ( a )  -1  Sin ( a ) Cos( a ) R z=  0 0  0  0 0 0  0 0 1 0  0 1 0 0  0 0 1 0  0 1 ta thay góc a = -θ‘ . Theo các phép toán lư ng giác: θ Sin(-θ') = -Sin(θ') = -Sin(900 - θ) = -Cos(θ) θ θ θ Cos(-θ') = Cos(θ') = Cos(900-θ) = Sin(θ) θ θ θ θ Z Z2 O' Y2 Y φ O θ θ' X2 X Hình 4.7 Nên ma tr n c a phép quay tìm ñư c s có d ng:  Sin (θ ) Cos(θ )  − Cos(θ ) Sin (θ ) B=   0 0  0 0  Bư c 0 0  0 0 và h (X1,Y1,Z1) bi n ñ i thành h (X2,Y2,Z2). 1 0  0 1 3: Quay h (X2,Y2,Z2) m t góc 900 + Φ quanh tr c X2. Phép bi n ñ i này s làm cho tr c Z2 hư ng ñ n g c O (hình 4.8). Ta có: 0 0 1   0 Cos (a ) Sin(a ) Rx =  0 − Sin(a ) Cos (a )  0 0 0  0  0 0  1  .52
  • 57.
    Chương IV. Cácphép bi n ñ i Z Y3 O' Z3 φ O θ X3 Y θ' X Hình 4.8 0 0 1  0 Cos( a ) − Sin ( a ) R-1x =   0 Sin ( a ) Cos( a )  0 0 0 0  0 0  1 Thay góc a = 900 + Φ , ta có: Cos(900 + Φ) = -Sin(Φ) và Sin(900 + Φ) = Cos(Φ) Φ Φ nên ma tr n tìm ñư c s có d ng: 0 0 1  0 − Sin (φ ) − Cos(φ ) C=   0 Cos(φ ) − Sin (φ )  0 0 0 0  0 0  1 Lúc này, h (X2,Y2,Z2) bi n ñ i thành h (X3,Y2,Z3). Bư c 4: Bi n ñ i h tr c ti p (X3,Y3,Z3) thành h gián ti p (hình 4.9). Trong bư c này, ta ph i ñ i hư ng tr c X3 b ng cách ñ i d u các ph n t c a c t X. Ta nh n ñư c ma tr n:  −1  0 D=  0  0 0 0 0  1 0 0 0 1 0  0 0 1 và h (X3,Y3,Z3) bi n ñ i thành h (X0,Y0,Z0). .53
  • 58.
    Chương IV. Cácphép bi n ñ i Z Y0 X0 O' Z0 Y φ O θ' θ X Hình 4.9 TÓM L I Các ñi m trong không gian s nh n trong h quan sát m t t a ñ có d ng: (x0 ,y0 ,z0 ,1) = (x y z 1).A.B.C.D G i T = A.B.C.D, ta tính ñư c:  − sin(θ ) − Cos(θ ). Sin (φ ) − Cos(θ ). Cos(φ )  Cos(θ ) − Sin (θ ). Sin (φ ) − Sin (θ ). Cos(φ ) T=   0 Cos(φ ) − Sin (φ )  0 R  0 0  0 0  1 Cu i cùng ta có: (x0 ,y0 ,z0 ,1) = (x y z 1).T hay: x0 = -x.Sin(θ) + y.Cos(θ) θ θ y0 = -x.Cos(θ).Sin(Φ) - y.Sin(θ).Sin(Φ) + z.Cos(Φ) θ Φ θ Φ Φ z0 = -x.Cos(θ).Cos(Φ) - y.Sin(θ).Cos(Φ) - z.Sin(Φ) + R θ Φ θ Φ Φ * Bây gi ta chi u nh c a h quan sát lên màn hình. 1. Phép chi u ph i c nh Cho ñi m P(x,y,z) và hình chi u P’(x0,y0,z0) c a nó trên m t ph ng. G i D là kho ng cánh t m t ph ng ñ n m t (g c t a ñ ). (Hình 4.10) .54
  • 59.
    Chương IV. Cácphép bi n ñ i Y0 P(x0,y0,z0) P'(xE,yE,zE) Z0 O Maøn hình X0 Y0 P(x0,y0,z0) yE O D Maøn hình Z0 O xE P(x0,y0,z0) X0 Hình 4.10 Xét các tam giác ñ ng d ng, ta có: xE/D = x0/z0 và yE/D = y0/z0 ⇒ xE = D.x0/z0 và yE = D.y0/z0 Chú ý: z0 bao hàm vi c phóng to hay thu nh v t th . 2. Phép chi u song song T a ñ quan sát (x0,y0,z0) và t a ñ màn hình th a mãn công th c: xE = x0 và yE = y0 .55
  • 60.
    Chương IV. Cácphép bi n ñ i Phoùng to Thu nhoû Maét Vaät theå Maøn hình Maøn hình Hình 4.11 K T LU N Có 4 giá tr nh hư ng ñ n phép chi u v t th 3D là: các góc θ , Φ , kho ng cách R t O ñ n O’ và kho ng cách D t O’ ñ n m t ph ng quan sát. C th : • Tăng gi m θ s quay v t th trong m t ph ng (XY). • Tăng gi m Φ s quay v t th lên xu ng. • Tăng gi m R ñ quan sát v t t xa hay g n. • Tăng gi m D ñ phóng to hay thu nh nh. 4.5. PH L C T o 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; .56
  • 61.
    Chương IV. Cácphép bi n ñ i 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:BPBGI'); 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); .57
  • 62.
    Chương IV. Cácphép bi n ñ i 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 .58
  • 63.
    Chương IV. Cácphép bi n ñ i 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 H A Vi t chương trình mô t phép quay c a m t hình l p phương quanh các tr c (hình 4.12). .59
  • 64.
    Chương IV. Cácphép bi n ñ i Z P7 P6 P5 P8 Y P1 P2 P3 P4 X Hình 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); .60
  • 65.
    Chương IV. Cácphép bi n ñ i 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. BÀI T P 1. Cho 3 tam giác sau: ABC v i A(1,1) B(3,1) C(1,4) EFG v i E(4,1) F(6,1) G(4,4) MNP v i M(10,1) N(10,3) P(7,1) a. Tìm ma tr n bi n ñ i tam giác ABC thành tam giác EFG. b. Tìm ma tr n bi n ñ i tam giác ABC thành tam giác MNP. 2. Cài ñ t thu t toán xén m t ño n th ng vào m t hình ch nh t có c nh không song song v i tr c t a ñ . .61
  • 66.
    Chương IV. Cácphép bi n ñ i 3. Vi t chương trình v m t Ellipse có các tr c không song song v i h tr c t a ñ . 4. D a vào bài t p 2, hãy mô ph ng quá trình quay c a m t Ellipse xung quanh tâm c a nó. 5. Vi t chương trình mô ph ng quá trình quay, ñ i x ng, t nh ti n, phóng to, thu nh , bi n d ng c a m t hình b t kỳ trong m t ph ng. 6. Mô ph ng chuy n ñ ng c a trái ñ t xung quanh m t tr i ñ ng th i mô t chuy n ñ ng c a m t trăng xung quanh trái ñ t. M r ng trong không gian 3 chi u. 7. Vi t chương trình v ñ ng h ñang ho t ñ ng. 8. Vi t chương trình v các kh i ña di n ñ u trong không gian. M r ng: ñi u khi n phóng to, thu nh , quay các kh i ña di n quanh các tr c... .62
  • 67.
    CHƯƠNG V BI UDI N CÁC ð I TƯ NG BA CHI U 5.1. MÔ HÌNH WIREFRAME Mô hình WireFrame th hi n hình dáng c a ñ i tư ng 3D b ng 2 danh sách : • Danh sách các ñ nh : lưu t a ñ c a các ñ nh. • Danh sách các c nh : lưu các c p ñi m ñ u và cu i c a t ng c nh. Các d nh và các c nh ñư c ñánh s th t cho thích h p. Ví d : Bi u di n 1 căn nhà thô sơ (hình 5.1) Danh sách các ñ nh Vector Z 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 P4 P10 Const P8 Y P2 P6 P7 X Hình 5.1 ñây, chúng ta dùng c u trúc record d a trên 2 m ng: MaxDinh = 50; { S ñ nh t i ña} MaxCanh = 100; {S Type P3 P1 Có nhi u cách ñ lưu gi mô hình WireFrame. P9 P5 c nh t i ña} ToaDo3D = record x, y, z:real; end; WireFrame = Record
  • 68.
    Chương V. Biu di n các ñ i tư ng ba chi u Sodinh: 0..MaxDinh; Dinh: array [1..MaxDinh] of ToaDo3D; Socanh : 0..Maxcanh; Canh :array[1..Maxcanh, 1..2] of 1..MaxDinh; end; Khi ñó, ta dùng m t bi n ñ mô t căn nhà : Var House : WireFrame; v i bi n house trên, ta có th gán giá tr như sau: Danh sách các c nh C nh ð nh ñ u ð nh cu i With House Do 1 1 2 Begin 2 2 3 sodinh:=10; 3 3 4 socanh:=17; 4 4 5 dinh[1].x:=0; 5 5 1 dinh[1].y:=0; 6 6 7 dinh[1].z:=0; 7 7 8 8 8 9 {S ñ nh th nh t c a 9 9 10 c nh s 1} 10 10 6 11 1 6 12 2 7 ... 13 3 8 end; 14 4 9 15 5 10 16 2 5 17 1 3 ... canh[1, 1]:=1; canh[1, 2]:=2; {S ñ nh th hai c a c nh s 1} 5.2. V MÔ HÌNH WIREFRAME V I CÁC PHÉP CHI U ð v m t ñ i tư ng WireFrame, ta v t ng c nh trong danh sách các c nh c a mô hình. V n ñ là làm th nào ñ v 1 ñư ng th ng trong không gian 3 chi u vào m t ph ng? ð làm ñi u này, ta ph i b b t ñi 1 chi u trong mô hình bi u di n, t c là ta ph i dùng phép chi u t 3D → 2D . 64
  • 69.
    Chương V. Biu di n các ñ i tư ng ba chi u K thu t chung ñ v m t ñư ng th ng 3D là: Chi u 2 ñi m ñ u mút thành các ñi m 2D. V ñư ng th ng ñi qua 2 ñi m v a ñư c chi u. Sau ñây là th t c xác ñ nh hình chi u c a m t ñi m qua phép chi u ph i c nh: Procedure Chieu(P3D:ToaDo3D; E:Real; Var P2D:ToaDo2D); Var t:Real; Begin If (P3D.x >=E) OR (E=0) Then Writeln(‘ði m n m sau m t ho c m t n m trên m t ph ng nhìn’); Esle Begin t := 1/(1 - P3D.x/E); P2D.y := t*P3D.y; P2D.z := t*P3D.z; End; End; 5.3. V CÁC M T TOÁN H C Ta s v các m t cong d a trên phương trình tham s c a các m t ñó. Ví d : (a) (b) Hình 5.2 (c) • M t Ellipsoid: (hình 5.2.a) x=Rx.cos(u).cos(v) y=Ry.sin(u).cos(v) 65
  • 70.
    Chương V. Biu di n các ñ i tư ng ba chi u z=Rz.sin(v) Trong ñó: 0≤ u ≤ 2π • M t -π/2 ≤ v ≤ π/2 Hypeboloid: (hình 5.2.b) x=u y=v z=u2 - v2 Trong ñó u,v ∈[-1,1] • Hình xuy n: (hình 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 • Hình tr tròn (Cylinder) x = R.cos(u) y = R.sin(u) z=h • Hình nón (Cone) p(u,v) = (1-v).P0 + v.P1(u) trong ñó: P0: ñ nh nón u  x = R. cos( ) u,v ∈ [0,1]  y = R. sin(u) P1(u): ñư ng tròn  • Ch o Parabol (Paraboloid) x = a.v.cos(u) y = b.v.sin(u) u∈[-π,π], v ≥ 0 z = v2 Phương pháp chính ñây cũng là v các ñư ng vi n theo u và v. 66
  • 71.
    Chương V. Biu di n các ñ i tư ng ba chi u ð v m t ñư ng vi n u t i giá tr u’ khi v ch y t VMin ñ n VMax ta làm như sau: • T o m t t p h p các giá tr v[i] ∈ [VMin ,VMax], xác ñ nh v trí P[i] = (X(u’,v[i]), Y(u’,v[i]), Z(u’,v[i])). • Chi u t ng ñi m P[i] lên m t ph ng. • V các ñư ng g p khúc d a trên các ñi m 2D P’[i]. Sau ñây là th t c 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 ñi m xu t phát 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 ñi m m i } End; u:=u + du; End; End; Tương t , ta có th v h ñư ng cong theo v. 67
  • 72.
    Chương V. Biu di n các ñ i tư ng ba chi u TÓM L I: Mu n v m t m t cong, ta th c hi n các bư c sau • Nh p các h s c a phương trình m t: a, b, c, d, Umin, Umax, Vmin, Vmax. • Tính các hàm 2 bi n: X(u,v), Y(u,v), Z(u,v). • Kh i t o phép chi u: Song song/Ph i c nh. • V h ñư ng cong u. V h ñư ng cong v. BÀI T P 1. Hãy xây d ng m t c u trúc d li u ñ lưu tr mô hình WireFrame. 2. T o file text ñ lưu các ñ nh và c nh c a m t v t th trong không gian 3D theo mô hình WireFrame v i c u trúc như sau: Dòng ñ u tiên ch a hai s nguyên m, n dùng ñ lưu s ñ nh và s c nh c a mô hình. m dòng ti p theo, m i dòng lưu t a ñ x, y, z c a t ng ñ nh trong mô hình. n dòng ti p theo, m i dòng lưu hai s nguyên là ñ nh ñ u và ñ nh cu i c a t ng c nh trong mô hình. 3. Vi t th t c ñ ñ c các giá tr trong file text lưu vào mô hình WireFrame. 4. Vi t th t c ñ v v t th t mô hình WireFrame. 5. Vi t chương trình bi u di n các kh i ña di n sau: T di n ñ u, Kh i l p phương, Bát di n ñ u, Th p nh di n ñ u, Nh th p di n ñ u. 6. Vi t chương trình ñ mô ph ng các m t toán h c: yên ng a, m t c u, hình xuy n... 68
  • 73.
    CHƯƠNG VI THI TK ðƯ NG VÀ M T CONG BEZIER VÀ B-SPLINE Khác v i nh ng phương pháp bi u di n m t và ñư ng b i các công th c toán h c tư ng minh, ñây ta s bàn ñ n các công c cho phép ch ra các d ng ñư ng và m t khác nhau d a trên các d li u. ði u này có nghĩa là v i m t ñư ng cong cho trư c mà ta chưa xác ñ nh ñư c công th c toán h c c a nó thì làm th nào ñ có th n m b t ñư c d ng c a ñư ng cong ñó m t cách tương ñ i chính xác qua vi c s d ng m t t p nh các ñi m P0 , P1 ,... cùng v i m t phương pháp n i suy nào ñó t t p ñi m này ñ t o ra ñư ng cong mong mu n v i m t ñ chính xác cho phép. Có nhi u cách ñ n m b t ñư c ñư ng cong cho trư c, ch ng h n: • L y m t m u ñư ng cong ch ng vài ch c ñi m cách nhau tương ñ i ng n r i tìm m t hàm toán h c và ch nh hàm này sao cho nó ñi qua các ñi m này và kh p v i ñư ng cong ban ñ u. Khi ñó, ta có ñư c công th c c a ñư ng và dùng nó ñ v l i ñư ng cong. • Cách khác là dùng m t t p các ñi m ki m soát và dùng m t thu t toán ñ xây d ng nên m t ñư ng cong c a riêng nó d a trên các ñi m này. Có th ñư ng cong ban ñ u và ñư ng cong t o ra không kh p nhau l m, khi ñó ta có th di chuy n m t vài ñi m ki m soát và lúc này thu t toán l i phát sinh m t ñư ng cong m i d a trên t p ñi m ki m soát m i. Ti n trình này l p l i cho ñ n khi ñư ng cong t o ra kh p v i ñư ng cong ban ñ u. ñây, ta s ti p c n v n ñ theo phương pháp th hai, dùng ñ n các ñư ng cong Bezier và B-Spline ñ t o các ñư ng và m t. Gi s m t ñi m trong không gian ñư c bi u di n dư i d ng vector tham s p(t). V i các ñư ng cong 2D, p(t) = (x(t), y(t)) và các ñư ng 3D, p(t) = (x(t), y(t), z(t)). 6.1. ðƯ NG CONG BEZIER VÀ M T BEZIER 6.1.1. Thu t toán Casteljau
  • 74.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline ð xây d ng ñư ng cong p(t), ta d a trên m t dãy các ñi m cho trư c r i t o ra giá tr p(t) ng v i m i giá tr t nào ñó. Vi c thay ñ i các ñi m này s làm thay ñ i d ng c a ñư ng cong. Phương pháp này t o ra ñư ng cong d a trên m t dãy các bư c n i suy tuy n tính hay n i suy kho ng gi a (In-Betweening). Ví d : V i 3 ñi m P0 , P1 , P2 ta có th xây d ng m t Parabol n i suy t 3 ñi m này b ng cách ch n m t giá tr t ∈ [0, 1] nào ñó r i chia ño n P0P1 theo t l t, ta ñư c ñi m P01 trên P0P1 . Tương t , ta chia ti p P1P2 cũng theo t l t, ta ñư c P11 . N i P01 và P11 , l i l y ñi m trên P01P11 chia theo t l t, ta ñư c P02. V i cách làm này, ta s l y nh ng giá tr t khác ∈ [0, 1] thì s ñư c t p ñi m P02. ðó chính là ñư ng cong p(t). Ta bi u di n b ng phương trình: P01(t) = (1-t).P0 + t.P1 (1) P11(t) = (1-t).P1 + t.P2 (2) P02(t) = (1-t).P01 + t.P11 (3) Thay (1), (2) vào (3) ta ñư c: P(t) = P02(t) = (1-t)2.P0 + 2t.(1-t).P1 + t2.P2 ðây là m t ñư ng cong b c 2 theo t nên nó là m t Parabol. T ng quát hóa ta có thu t toán Casteljau cho (L+1) ñi m: Gi s ta có t p ñi m: P0, P1, P2, ..., PL V i m i giá tr t cho trư c, ta t o ra ñi m Pir(t) th h th r, t th h th (r - 1) trư c ñó, ta có: Pir(t) = (1-t).Pir-1(t) + t.Pi+1r-1(t) r = 0,1,...,L (3’) và i = 0,...,L-r Th h cu i cùng P0L (t) ñư c g i là ñư ng cong Bezier c a các ñi m P0,P1 ,P2,...,PL Các ñi m Pi , i=0,1,...,L ñư c g i là các ñi m ki m soát hay các ñi m Bezier. ða giác t o b i các ñi m ki m soát này g i là ña giác ki m soát hay ña giác Bezier. 6.1.2. D ng Bernstein c a các ñư ng cong Bezier ðư ng cong Bezier d a trên (L+1) ñi m ki m soát P0 ,P1 , ...,PL ñư c cho b i công th c: L P(t) = ∑ Pk.BkL(t) k=0 70
  • 75.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline Trong ñó, P(t) là m t ñi m trong m t ph ng ho c trong không gian. BkL(t) ñư c g i là ña th c Bernstein, ñư c cho b i công th c: BkL(t) = L! (1-t)L-k.tk k !( L − k )! v iL≥k M i ña th c Bernstein có b c là L. Thông thư ng ta còn g i các BkL(t) là các hàm tr n (blending function). Tương t , ñ i v i m t Bezier ta có phương trình sau: M L i =0 P(u,v) = i =0 ∑ ∑ Pi,k.BiM(u).BkL(v) Trong trư ng h p này, kh i ña di n ki m soát s có (M+1).(L+1) ñ nh. P1 P 01 P 11 P 02 P1 P2 ðư ng cong Bezier b c 2 ðư ng cong Bezier b c 3 Hình 6.1 6.1.3. D ng bi u di n ma tr n c a ñư ng Bezier ð thích h p cho vi c x lý trên máy tính, ta bi u di n hai m ng BL(t) và P như sau: BL(t) = (B0L(t), B1L(t), ..., BLL(t)) P = (P0 ,P1 , ...,PL ) Do ñó: P(t) = BL(t).P P(t) = BL(t).PT hay (tích vô hư ng) (PT là d ng chuy n v c a P) Dư i d ng ña th c, có th bi u di n BkL(t) như sau: BkL(t) = a0 + a1.t + a2.t2 + ... + aL.tL = (t0,t1,...,tL).(a0 ,a1 ,...,aL) Do ñó P(t) có th bi u di n l i như sau: P(t) = PowL(t).BezL.PT V i: • PowL(t) = (t0,t1,...,tL) 71
  • 76.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline • BezL là ma tr n bi u di n m ng BL(t) trong ñó m i hàng i c a ma tr n ng v i các h s tương ng (a0 ,a1 ,...,aL) c a ña th c BiL(t) và t i v trí (i,j) trong ma tr n BezL có giá tr BezL(i,j) = (-1)j-i.Cni.Cij Ví d : Ma tr n Bez3 cho các ñư ng Bezier b c 3 1 0 0  −3 3 0 3 Bez =   3 −6 3   −1 3 −3 0  0 0  1 6.1.4. T o và v các ñư ng Bezier ð t o ra m t ñư ng cong Bezier t m t dãy các ñi m ki m soát ta s áp d ng phương pháp l y m u hàm p(t) các giá tr cách ñ u nhau c a tham s t, ví d có th l y ti = i/N, i=0,1,...,N. Khi ñó ta s ñư c các ñi m P(ti) t công th c Bezier. N i các ñi m này b ng các ño n th ng ta s ñư c ñư ng cong Bezier g n ñúng. ð tính P(ti) ta có th áp d ng ma tr n c a P(t) trên trong ñó ch có thành ph n PowL(ti) là thay ñ i, còn tích BezL.PT v i P = (P0 ,P1 , ...,PL ) là không thay ñ i. Sau ñây là th t c minh h a vi c v ñư ng cong Bezier trong m t ph ng: 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; 72
  • 77.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline 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; 73
  • 78.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline 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. Các tính ch t c a ñư ng cong Bezier i/ N i suy ñư c các ñi m ñ u và cu i. Ch ng minh: L Ta có: P(t) = ∑ Pk.BkL(t) k=0 L Do ñó P(0) = ∑ Pk.BkL(0) k=0 trong ñó: BkL(0) = = L! (1-0)L-k.0k k !( L − k )! L! .0 = 0 k !( L − k )! P(0) = P0.B0L(0) + PL.BLL(0) = P0 Vì v y, ∀k ≠ 0 và k ≠ L + 0 = P0 Lý lu n tương t cho P(1). Ta có P(1) = PL. ii/ Tính b t bi n Affine: Khi bi n ñ i m t ñư ng cong Bezier, ta không c n bi n ñ i m i ñi m trên ñư ng cong m t cách riêng r mà ch c n bi n ñ i các ñi m ki m soát c a ñư ng cong ñó r i s d ng công th c Bernstein ñ tái t o l i ñư ng cong Bezier ñã ñư c bi n ñ i. Ch ng minh: Gi s ñi m P(t) bi n ñ i Affine thành P’(t) 74
  • 79.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline L P’(t) = P(t).N + tr = ∑ Pk.BkL(t).N + tr k=0 Trong ñó: N: ma tr n bi n ñ i. tr: vector t nh ti n. L Xét ñư ng cong ∑ (Pk.N + tr).BkL(t) (*) k=0 ñư c t o ra b ng cách bi n ñ i Affine các vector Pk. Ta s ch ng minh ñư ng cong này chính là P’(t). L L ∑ Pk.N.BkL(t) + ∑ tr.BkL(t) k=0 Khai tri n (*) ta có: k=0 L L k=0 = k=0 ∑ Pk.N.BkL(t) + tr. ∑ BkL(t) (**) L Nhưng theo ña th c Bernstein thì ∑ BkL(t) = (1-t+t)L = 1 nên s h ng th hai c a k=0 (**) s là tr. Vì v y, P’(t) n m trên ñư ng cong Bezier t o ra b i các ñi m ki m soát Pk. iii/ Tính ch t c a bao l i: ñư ng cong Bezier P(t) không bao gi ñi ra ngoài bao l i c a nó. ñây, bao l i c a các ñi m ki m soát là t p ñ nh nh nh t ch a t t c các ñi m ki m soát ñó. Ch ng minh: Bao l i c a các ñi m ki m soát cũng chính là t p h p các t h p l i c a các ñi m ki m soát. Ta bi u di n t h p tuy n tính c a các ñi m Pk: L P(t) = ∑ ak.Pk , ak ≥ 0 k=0 Do P(t) là t h p l i c a các ñi m ki m soát ∀t ∈ [0,1] và L ∑ BkL(t) = 1 k=0 Nên ñư ng cong Bezier s n m trong bao l i c a các ñi m ki m soát. iv/ ð chính xác tuy n tính: ðư ng cong Bezier có th tr thành m t ñư ng th ng khi t t c các ñi m ki m soát n m trên m t ñư ng th ng vì khi ñó bao l i c a chúng là m t ñư ng th ng 75
  • 80.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline nên ñư ng Bezier b k p vào bên trong bao l i nên nó cũng tr thành ñư ng th ng. v/ B t kỳ m t ñư ng th ng hay m t ph ng nào cũng luôn luôn c t ñư ng cong Bezier ít l n hơn so v i c t ña giác ki m soát. vi/ ð o hàm c a các ñư ng Bezier: L−1 Ta có: (P(t))’ = L. ∑ ∆Pk.BkL-1(t) , ∆Pk = Pk+1 - Pk k =0 Do ñó, ñ o hàm c a ñư ng cong Bezier là m t ñư ng cong Bezier khác ñư c t o ra t các vector ki m soát ∆Pk ( Ta ch c n l y các ñi m ki m soát g c theo t ng c p ñ t o ra các ñi m ki m soát cho (P(t))’. 6.1.6. ðánh giá các ñư ng cong Bezier B ng các ñi m ki m soát, ta có th t o ra các d ng ñư ng cong khác nhau b ng cách hi u ch nh các ñi m ki m soát cho t i khi t o ra ñư c m t d ng ñư ng cong mong mu n. Công vi c này l p ñi l p l i cho ñ n khi toàn b ñư ng cong th a yêu c u. Tuy nhiên, khi ta thay ñ i b t kỳ m t ñi m ki m soát nào thì toàn b ñư ng cong b thay ñ i theo. Nhưng trong th c t , ta thư ng mong mu n ch thay ñ i m t ít v d ng ñư ng cong g n khu v c ñang hi u ch nh các ñi m ki m soát. Tính c c b y u c a ñư ng cong Bezier ñư c bi u hi n qua các ña th c BkL(t) ñ u khác 0 trên toàn kho ng [0,1]. M t khác ñư ng cong p(t) l i là m t t h p tuy n tính c a các ñi m ki m soát ñư c gia tr ng b i các hàm BkL(t) nên ta k t lu n r ng m i ñi m ki m soát có nh hư ng ñ n ñư ng cong ch nh b t kỳ m t ñi m ki m soát nào cũng s t t c các giá tr t ∈ [0,1]. Do ñó, hi u nh hư ng ñ n d ng c a toàn th ñư ng cong. ð gi i quy t bài toán này, ta s d ng m t t p h p các hàm tr n khác nhau. Các hàm tr n này có giá mang (support: kho ng mà trên ñó hàm l y giá tr khác 0) ch là m t ph n c a kho ng [0,1]. Ngoài giá mang này chúng có giá tr là 0. Thư ng ta ch n các hàm tr n là các ña th c trên các giá mang ñó, các giá mang này k nhau. Như v y, các hàm tr n chính là m t t p các ña th c ñư c ñ nh nghĩa trên nh ng kho ng k nhau ñư c n i l i v i nhau ñ t o nên m t ñư ng cong liên t c. Các 76
  • 81.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline ñư ng cong k t qu ñư c g i là ña th c riêng ph n hay t ng ph n (piecewise polynomial). Ví d : ta ñ nh nghĩa hàm g(t) g m 3 ña th c a(t), b(t), c(t) như sau: 1 2  a(t) = 2 t  3 3  g(t) = b(t) = - (t - )2 4 2  1 2 c(t) = (3 - t)  2  coï mang[0,1] giaï coï mang[1,2] giaï coï mang[2,3] giaï Giá mang c a g(t) là [0,3] Các giá tr c a t ng v i các ch n i c a các ño n g i là nút (knut), ch ng h n t=0,1,2,3 là b n nút c a g(t). Hơn n a, t i các ch n i c a ñư ng cong g(t) là trơn, không b g p khúc. Do ñó, ta g i ñó là hàm Spline. V y, m t hàm Spline c p m là ña th c riêng ph n c p m có ñ o hàm c p m -1 liên t c m i nút. D a trên tính ch t c a hàm Spline, ta có th dùng nó như các hàm tr n ñ t o ra ñư ng cong p(t) d a trên các ñi m ki m soát P0,...,PL. Khi ñó: L P(t) = ∑ Pk.gk(t) k=0 T ng quát hóa, ta xây d ng m t hàm p(t) v i L+1 ñi m ki m soát như sau: V i m i ñi m ki m soát Pk , ta có m t hàm tr n tương ng Rk(t) và t p các nút g i là vector nút T=(t0,t1,...,tn) v i ti ∈ R, ti ≤ ti+1 . Khi ñó: L P(t) = ∑ Pk.Rk(t) k=0 6.2. ðƯ NG CONG SPLINE VÀ B-SPLINE 6.2.1. ð nh nghĩa L Theo trên ta có: P(t) = ∑ Pk.Rk(t) (*) k=0 trong ñó Pk v i k=1..L là các ñi m ki m soát. Rk(t) là các hàm tr n liên t c trong m i ño n con [ti , ti+1]và liên t c trên m i nút. M i Rk(t) là m t ña th c riêng ph n. Do ñó ñư ng cong p(t) là t ng c a các ña th c này, l y trên các ñi m ki m soát. 77
  • 82.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline Các ño n ñư ng cong riêng ph n này g p nhau các ñi m nút và t o cho ñư ng cong tr nên liên t c. Ta g i nh ng ñư ng cong như v y là SPLINE. Cho trư c m t vector nút thì có th có nhi u h hàm tr n ñư c dùng ñ t o ra m t ñư ng cong Spline có th ñ nh nghĩa trên vector nút ñó. M t h các hàm như v y ñư c g i là cơ s cho các Spline. Trong s các h hàm này, có m t cơ s c th mà các hàm tr n c a nó có giá mang nh nh t và nh v y nó ñem l i kh năng ki m soát c c b l n nh t. ðó là các BSpline, v i B vi t t t c a ch Basic (cơ s ). ð i v i các hàm B-Spline, m i ña th c riêng ph n t o ra nó có m t c p m nào ñó. Do ñó, thay vì dùng ký hi u Rk(t) cho các hàm riêng ph n này ta s ký hi u các hàm tr n này là Nk,m(t). L Do ñó các ñư ng cong B-Spline có th bi u di n l i: P(t) = ∑ Pk.Nk,m(t) k=0 TÓM L I ð xây d ng các ñư ng cong B-Spline ta c n có: • M t vector nút T=(t0, t1, t2, ...,tk+m-1). • (L+1) ñi m ki m soát. • C p m c a các hàm B-Spline và công th c cơ b n cho hàm B-Spline Nk,m(t) là:  t − tk   .Nk,m-1(t) +  t k + m − 1 − tk  Nk,m(t) =   tk + m − t    .Nk+1,m-1(t) v i k=0..L  tk + m − tk + 1  1 tk π t ≤ tk + 1 laûi  0 ngæåüc ðây là m t công th c ñ quy v i Nk,L(t) =  (Hàm h ng b ng 1 trên ño n (tk , tk+1) ð i v i các m t B-Spline, ta có công th c bi u di n tương t : M L i =0 P(u,v) = k=0 ∑ ∑ Pi,k.Ni,m(u).Nk,m(v) Nh n xét: Các ñư ng Bezier là các ñư ng B-Spline. 6.2.2. Các tính ch t h u ích trong vi c thi t k các ñư ng cong B-Spline i/ Các ñư ng B-Spline c p m là các ña th c riêng ph n c p m. Chúng là các Spline do chúng có m-2 c p ñ o hàm liên t c m i ñi m trong giá mang c a chúng. 78
  • 83.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline Các hàm B-Spline c p m t o thành m t cơ s cho b t kỳ Spline nào có cùng c p ñư c ñ nh nghĩa trên cùng các nút. Các Spline có th ñư c bi u di n như m t t h p tuy n tính c a các B-Spline. ii/ Hàm tr n B-Spline Nk,m(t) b t ñ u tk và k t thúc tk+m . Giá mang c a nó là [tk,tk+m]. Giá mang c a h các hàm Nk,m(t) v i k=0,...L là kho ng [t0,tm+L]. iii/ M t ñư ng cong B-Spline ñóng d a trên L+1 ñi m ki m soát có th ñư c t o ra b ng cách dùng phương trình ñư ng B-Spline tu n hoàn sau: L P(t) = ∑ Pk.N0,m((t-k) mod (L+1)) k=0 V i gi thi t các nút cách ñ u nhau trong ñ nh nghĩa c a hàm N0,m(...). iv/ N u dùng vector chu n thì ñư ng cong B-Spline s n i suy các ñi m ki m soát ñ u tiên và cu i cùng. Các hư ng kh i ñ u và k t thúc c a ñư ng cong ñó s n m d c theo các c nh ñ u tiên và cu i cùng c a ña giác ki m soát. v/ M i hàm B-Spline Nk,m(t) là không âm ∀t, và t ng các h hàm này b ng 1: L ∑ Nk,m(t) = 1 ∀t ∈ [t0 , tm+L ] k=0 vi/ Các ñư ng cong d a trên các B-Spline là b t bi n Affin. Do ñó, ñ bi n ñ i m t ñư ng cong B-Spline, ch c n bi n ñ i các ñi m ki m soát, sau ñó kh i t o l i ñư ng cong t các ñi m ki m soát ñã ñư c bi n ñ i này. vii/ M t ñư ng cong B-Spline s n m trong bao l i c a các ñi m ki m soát M nh hơn: b t kỳ t nào, ch có m hàm B-Spline là khác 0. Vì v y, m i t ñư ng cong ph i n m trong bao l i c a h u h t m ñi m ki m soát kích ho t k nhau. (Các ñi m ki m soát kích ho t là các ñi m mà t i ñó hàm B-Spline khác 0) viii/ð chính xác tuy n tính c a ñư ng cong B-Spline: N u m ñi m ki m soát k nhau là tuy n tính cùng nhau thì bao l i c a chúng là m t ñư ng th ng. Do ñó ñư ng cong cũng s tr thành ñư ng th ng. ix/ Tính ch t gi m ñ bi n thiên: S giao ñi m gi a ñư ng cong B-Spline v i b t kỳ m t m t ph ng nào (n u có) luôn luôn nh hơn s giao ñi m (n u có) gi a ña giác ki m soát c a nó v i m t ph ng ñó. 6.2.3. Thi t k các m t Bezier và B-Spline 79
  • 84.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline Ta có th dùng các hàm tr n Bezier và B-Spline ñ mô t và v các m t cong. ð i v i các m t cong, ta bi u di n chúng dư i d ng tham s qua m t hàm vector v i 2 tham s là u, v. D ng t ng quát c a m t m t 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 bi n thiên trên m t kho ng nào ñó thì các hàm X(u,v), Y(u,v) và Z(u,v) thay ñ i giá tr , do ñó làm cho v trí c a p(u,v) thay ñ i trong không gian 3 chi u. Chúng ta s không bi u di n các m t qua các hàm toán h c tư ng minh mà s bi u di n chúng qua các ñi m ki m soát. Ví d : p(u,v) = (1-v).((1-u).P00 + u.P10) + v.((1-u).P01 + u.P11) dùng 4 ñi m ki m soát 4 góc là Pij v i các hàm tr n là tuy n tính theo u, v. 6.2.4. Các băng Bezier ðư ng cong Bezier trong không gian 3 chi u có th ñư c vi t dư i d ng là m t hàm c a tham s v v i L+1 ñi m ki m soát tùy thu c vào tham s u theo m t ki u nào L ñó: Ch ng h n P(u,v) = ∑ Pk(u).BkL(v) (*) k=0 Nghĩa là m i ñư ng vi n u là m t ñư ng cong Bezier chu n, nhưng u khác nhau thì các ñi m ki m soát cũng n m nh ng giá tr nh ng v trí khác nhau. Khi u bi n thiên thì m i ñi m ki m soát Pk(u) s ch y trên m t ñư ng cong c th . Do ñó, m t cong có th xem như là m t s d ch chuy n ñư ng Bezier trong không gian. Ta tư ng tư ng m t ña giác ki m soát chuy n ñ ng trong không gian và thay ñ i d ng khi chuy n ñ ng. m i v trí, ña giác này t o nên m t ñư ng cong Bezier và m t cong t o thành chính là cái v t còn ñ l i bên dư i c a ñư ng cong này. Ví d : Phép chi u ph i cách c a m t m t ñư c t o ra b i vi c n i suy tuy n tính gi a 2 ñư ng cong Bezier d a trên 2 ña giác ki m soát là P0 và P1. M i ñư ng cong ki m soát pk(u) ñư c n i suy tuy n tính gi a 2 ñi m ki m soát Pk0 và Pk1 khi u bi n thiên gi a 0 và 1: pk(u) = (1-u).Pk0 + u.Pk1 k=0,1,2,3 Gi s các ñư ng cong ki m soát pk(u) chính là các ñư ng cong Bezier, m i ñư ng cong này d a trên m +1 ñi m ki m soát c a chúng. 80
  • 85.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline M Vì v y: Pk(u) = ∑ Pi,k.BiM(u) i =0 K t h p pk(u) này vào phương trình (*) ta ñư c: M i =0 P(u,v) = L k=0 ∑ ∑ Pi,k.BiM(u).BkL(v) (**) Ta g i ñây là d ng tích Tensor cho băng Bezier. Cũng gi ng như các ña giác ki m soát trong 2D, m t kh i ña di n ki m soát là m t m ng g m có (M+1).(L+1) ñ nh. Tóm l i, ñ t o ra m t băng ta ch c n ch ra các v trí c a các ñ nh này r i sau ñó áp d ng phương trình (**) ñ v các ñư ng vi n hay ñ nh nghĩa d ng m t cong. 6.2.5. Dán các băng Bezier v i nhau M c ñích là ñ t o ra các d ng m t ph c t p g m nhi u băng Bezier k t l i v i nhau m t cách trơn tru các biên chung. Khi n i 2 băng Bezier l i v i nhau, m i băng có m t kh i ña di n ki m soát riêng và ñ u ñư c t o ra t phương trình (*) v i u, v bi n thiên trong kho ng [0,1]. V n ñ là làm sao cho 2 băng có th dán vào nhau m t cách trơn tru. • Hai băng s g p nhau t t c các ñi m d c theo biên chung n u các kh i ña di n ki m soát c a chúng kh p nhau biên. Như v y, ta ch c n ch n các ña giác ki m soát biên ñ cho 2 băng ñ ng nh t nhau trong phương trình (*) biên. Có th th y ñư c ñi u này khi thay u=0 vào trên. • M t ñi u ki n ñ n a là m i c p c nh c a kh i ña di n mà nó g p nhau biên ph i tuy n tính cùng nhau. 6.2.6. Các băng B-Spline Các hàm B-Spline có th ñư c s d ng trong d ng tích Tensor thay cho các ña th c Bernstein ñ ñ t ñư c tính ki m soát cao hơn khi thi t k m t cong. ði u ñó có nghĩa ta s thay phương trình (**) thành: M L i =0 P(u,v) = k=0 ∑ ∑ Pi,k.Ni,m(u).Nk,m(v) Kh i ña di n ki m soát g m có (L+1).(M+1) ñi m ki m soát; u,v bi n thiên t 0 t i giá tr nút l n nh t trong các vector nút tương ng c a chúng. 81
  • 86.
    Chương VI. Thit k ñư ng cong và m t cong Bezier và B-Spline ð i v i các băng B-Spline, ngư i ta v n dùng các B-Spline b c 4. Do vi c ch n s ñi m ki m soát là không gi i h n nên có th t o ra nhi u d ng m t cong r t ph c t p. T t nhiên khi thi t k , ta ph i ch n kh i ña di n nút ñ t o ra m t có d ng mong mu n. 82
  • 87.
    CHƯƠNG VII KH ðƯ NGVÀ M T KHU T 7.1. CÁC KHÁI NI M M t v t th 3D có th bi u di n trong máy tính b ng nhi u mô hình khác nhau, song hai mô hình ph bi n nh t ñó là mô hình khung dây (WireFrame) và mô hình các m t ña giác ( Polygon mesh model) • Mô hình WireFrame: ðã trình bày chương 5, nó cho ta hình dáng c a v t th dư i d ng m t b khung • Mô hình các m t ña giác: ñây m t v t th 3D ñư c xác ñ nh thông qua các m t (thay vì các c nh như trong mô hình WireFrame), và m i m t m t l i ñư c xác ñ nh thông qua các ñi m mà các ñi m này ñư c xem như là các ñ nh c a m t ña giác, v i mô hình các m t ña giác thì chúng ta không ch t o ra ñư c hình dáng c a v t th như mô hình Wireframe mà còn th hi n ñư c các ñ c tính v màu s c và nhi u tính ch t khác c a v t th . Song ñ có th mô t v t th 3D m t cách trung th c (như trong th gi i M t1 2 th c) thì ñòi h i ngư i l p 1 trình ph i tính toán và gi l p nhi u thông tin, mà m u ch t M t5 là v n ñ kh m t khu t và chi u sáng.Trong này chúng ta s 3 M t4 chương t p trung M t3 5 nghiên c u v n ñ kh m t khu t. 4 Ví d : Mô t v t th như trong M t2 6 hình 7.1. - Danh sách các ñ nh: 1,2,3,4,5,6 Hình 7.1 - Danh sách các m t ñư c xác ñ nh theo b ng sau: M t ð nh
  • 88.
    Chương VII. Khñư ng và m t khu t 1 1,2,3 2 4,5,6 3 1,3,6,4 4 3,2,5,6 5 1,2,5,4 Chúng ta có th ñưa ra nhi u c u trúc d li u khác nhau ñ lưu tr cho ña giác. Dư i ñây là phát th o m t ki u c u trúc: Type Point3D = Record {ði m 3 chi u} x,y,z:real; end; Vector3D = Record {Vector 3 chi u. M c dù nó gi ng v i x,y,z:real; Point3D song ta v n khai ñ các thu t toán ñư c tư ng minh} end; RGBColor = Record {C u trúc màu s c c a m t m t} B,G,R:Byte; end; KieuMat = Record PhapVT:Vector3D; {Pháp vector c a m t} Sodinh:cardinal; {S ñ nh c a m t} List:array of integer;{Danh sách th t các ñ nh t o nên m t. Color:RGBColor; ñây ta dùng m ng ñ ng} {màu s c c a m t} end; Obj3D = record {ð i tư ng 3 chi u} ObjName:string; {Tên c a ñ i tư ng} Sodinh:cardinal; {S ñ nh} Dinh: array of point3d; {Danh sách ñ nh. ñây ta dùng ki u m ng ñ ng} SoMat:cardinal; {S m t} Mat:array of KieuMat; {Danh sách m t} 84
  • 89.
    Chương VII. Khñư ng và m t khu t Xworld,Yworld,Zworld,Zoom:Real; {To ñ và kích thư c th t c a v t trong h to ñ th gi i} end; Khi cài ñ t cho m t ng d ng c thì vi c s d ng m ng c ñ nh có th gây ra các tr ng i v kích thư c t i ña hay t i thi u, cũng như vi c s d ng b nh không t i ưu. Vì th ngoài cách dùng m ng c ñ nh, ta có th dùng m ng ñ ng trong m t s ngôn ng như Visual Basic, Delphi hay Visual C++,… ho c dùng c u trúc danh sách móc n i. Song song v i ñi u ñó là vi c b t ñi hay ñưa thêm các thu c tính c n thi t ñ bi u di n các ñ c tính khác c a m t hay c a ñ i tư ng. * V n ñ kh m t khu t Khi th hi n v t th 3D, m t v n ñ n y sinh là làm sao ch th hi n các m t có th nhìn th y ñư c mà không th hi n các m t khu t phía sau. Vi c m t m t b khu t hay không b khu t thì tuỳ thu c vào c u trúc các m t c a v t th và v trí c a ñi m nhìn cũng như b i c nh mà v t th ñó ñư c ñ t vào. 7.2. CÁC PHƯƠNG PHÁP KH M T KHU T 7.2.1. Gi i thu t ngư i th sơn và s p x p theo chi u sâu (Depth-Sorting) Ngư i th sơn (hay Depth-sorting) là tên c a m t thu t gi i ñơn gi n nh t trong s các thu t toán v nh th c 3 chi u. N u ñ ý ngư i th sơn làm vi c, chúng ta s th y anh ta sơn b c tranh t trong ra ngoài, v i các c nh v t t xa ñ n g n. Chúng ta có th áp d ng m t cách tương t ñ v các ña giác trong danh sách các ña giác. Song có m t v n ñ c n ph i ch n l a, ñó là m t ña giác t n t i trong không gian 3D có t i ba b n ñ nh, và nh ng ñ nh này có th có các giá tr z ( giá tr ñ sâu ) khác nhau. Chúng ta s không bi t ch n giá tr nào trong s chúng. T nh ng kinh nghi m trong th c t , ngư i ta cho r ng nên s d ng giá tr z trung bình s cho k t qu t t trong h u h t các trư ng h p. Như v y, chúng ta c n ph i s p x p các m t theo th t t xa ñ n g n, r i sau ñó v các m t t xa trư c, r i v các m t che khu t b i các m t khu t, do các m t g n sau, như th thì các m t xa, mà ch có các m t g n s không b xa m i có th b các m t g n che g n v sau nên có th ñư c v ch ng lên hình nh c a các m t xa. 85
  • 90.
    Chương VII. Khñư ng và m t khu t Như v y, thu t gi i Depth-Sorting ñư c th c hi n m t cách d dàng khi chúng ta xác ñ nh m t giá tr ñ sâu (là giá tr z trong h to ñ quan sát) ñ i di n cho c m t. Các m t d a vào ñ sâu ñ i di n c a mình ñ so sánh r i s p x p theo m t danh sách gi m d n (theo ñ sâu ñ i di n). Bư c ti p theo là v các m t lên m t ph ng theo th t trong danh sách. Gi i thu t còn m t s vư ng m c sau (hình 7.2): Khi hai m t c t nhau thì thu t gi i này ch th hi n như chúng ch ng lên nhau. Hình nh th t Khi v b ng gi i thu t trên Hình 7.2 Khi hai m t trong cùng m t kho ng không gian v ñ sâu và hình chi u c a chúng lên m t ph ng chi u ch ng lên nhau (hay ch ng m t ph n lên nhau). Ch ng h n như: Maët A Maët B Maét nhìn Hình 7.3 T nh ng ví d trên chúng ta có th th y r ng, có nh ng trư ng h p các ña giác ñư c s p x p sai d n ñ n k t qu hi n th không ñúng. Li u chúng ta có th kh c ph c ñư c v n ñ này không? Câu tr l i dĩ nhiên là có nhưng cũng ñ ng nghĩa là chúng ta s ph i x lý thêm r t nhi u các trư ng h p và làm tăng ñ ph c t p tính toán. • Phép ki m tra ph n kéo dài Z 86
  • 91.
    Chương VII. Khñư ng và m t khu t Phép ki m tra này nh m xác ñ nh ph n kéo dài z c a hai ña giác có g i lên nhau hay không? N u các ph n kéo dài Z là g i lên nhau r t có th các ña giác này c n ñư c hoán ñ i. Vì th phép ki m tra ti p theo ph i ñư c th c hi n. • Phép ki m tra ph n kéo dài X Phép ki m tra này tương t như phép ki m tra trư c, nhưng nó s ki m tra ph n kéo dài X c a hai ña giác có g i lên nhau hay không? N u có, thì r t có th các ña giác này c n ñư c hoán ñ i. Vì th phép ki m tra ti p theo ph i ñư c th c hi n. • Phép ki m tra ph n kéo dài Y Phép ki m tra này ki m tra ph n kéo dài Y c a hai ña giác có g i lên nhau hay không? N u có, thì r t có th các ña giác này c n ñư c hoán ñ i. Vì th phép ki m tra ti p theo ph i ñư c th c hi n. • Phép ki m tra c nh xa Gi s A và B là hai ña giác mà sau khi s p x p theo ñ sâu trung bình thì A ñ ng trư c B. Song qua 3 phép ki m tra trên mà v n không xác ñ nh ñư c li u tr t t trên là ñúng hay chưa. Lúc này chúng ph i ti n hành phép ki m tra c nh xa. Phép ki m tra c nh xa nh m xác ñ nh xem ña giác B có n m phía sau c nh xa c a ña giác A hay không? N u có thì tr t t này là ñúng, ngư c l i thì ph i qua bư c ki m tra ti p theo. ð ki m tra ña giác B có n m sau c nh xa c a ña giác A hay không, chúng ta th c hi n vi c ki m tra m i ñ nh c a ña giác B. Các ñ nh này ñ u n m v cùng m t phía c a ña giác A theo chi u tr c Z không? N u ñúng thì k t qu tr t t trên là ñúng. Ngư c l i, có th x y ra m t trong hai tình hu ng như hình (7.2) ho c hình (7.3), ñ xác ñ nh ñư c ta ph i ti p t c sang bư c ki m tra ti p theo. • Phép ki m tra c nh g n Phép ki m tra c nh g n nh m xác ñ nh xem ña giác A có n m phía sau c nh g n c a ña giác B hay không? N u có thì tr t t xác ñ nh trư c ñây không 87
  • 92.
    Chương VII. Khñư ng và m t khu t ñúng, chúng ta c n ph i hoán ñ i l i tr t t . Ngư c l i thì rõ ràng hai ña giác ñang c t nhau (như hình 7.2) ho c chéo vào nhau (hình 7.4), lúc này chúng ta ph i ti n hành chia nh hai ña giác A và B thành 3 (ho c 4) ña giác con, ñư ng chia c t chính là ñư ng giao c t c a 2 ña giác. Sau phép chia chúng ta ti n hành s p x p l i các ña giác con. Hình 7.4 7.2.2. Gi i thu t BackFace S r t ñơn gi n n u ta dùng Vector pháp tuy n ñ kh các m t khu t c a m t ñ i tư ng 3D ñ c và l i. Ta s tính góc gi a véc tơ hư ng nhìn V và pháp vector N c a m t, n u góc này là l n hơn 90o thì m t là không nhìn th y (b khu t), ngư c l i thì m t là kh ki n. D u c a tích vô hư ng c a 2 vector là dương n u góc gi a chúng nh hơn hay b ng 90o. V y thu t toán ñ xét m t m t b khu t hay không ch ñơn gi n là: If V.N >= 0 then M t th y Else M t không th y (m t khu t); M t nhìn υ Vector hư ng nhìn Vì υ<90o nên m t quan sát ñư c Hình 7.5 88
  • 93.
    Chương VII. Khñư ng và m t khu t Hình 7.6 Cài ñ t minh ho cho thu t toán ch n l c m t sau Function Tich_vo_huong(v,n:Vector3D):real; {Tính tích vô hư ngc a 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 tư ng theo thu t toán ch n l c m t sau. Trong ñó: + Obj: ch a ñ i tư ng 3D c n v + Canvas: V i v (hay vùng ñ m khung) + Width, Height: Kích thư c c a Canvas + Zooom: H s t l khi v ñ i tư ng (Hay h s thu phóng) + V: Vector hư ng nhìn. N u Obj ñã ñư c chuy n sang h to ñ quan sát O’UVN 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; {Duy t qua t t c các m t c a ñ i tư ng} 89
  • 94.
    Chương VII. Khñư ng và m t khu t For k:=0 to Obj.SoMat-1 do if Tich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0 then {M t kh ki n} begin setlength(Poly,Obj.Mat[K].Sodinh);{Thi t l p ñ dài c a m ng Poly b ng s ñ nh c a ña giác} For i:=0 to Obj.Mat[K].Sodinh -1 do {ðưa to ñ các ñ nh c a ña giác vào 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; {Thi t l p màu cho bút tô trư c 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 giác v i màu ñã ñư c thi t l p} end; setlength(poly,0); end; Rõ ràng, thu t toán r t ñơn gi n và ñ ph c t p tính toán không cao. Song khi s d ng ph i luôn ñ m b o r ng ñ i tư ng có ñ t tính là “ñ c và l i”, n u ñ i tư ng không tho mãn ñi u ki n ñó thì chúng ta ph i áp d ng m t tho t toán khác hay có nh ng s a ñ i c n thi t ñ tránh s th hi n sai l c. 7.2.3. Gi i thu t vùng ñ m ñ sâu (Z-Buffer) B ng cách tính giá tr ñ sâu (là giá tr Z trong h to ñ quan sát) c a m i ñi m trong t t c các m t ña giác, t i m i ñi m trên m t ph ng chi u có th có nh c a nhi u ñi m trên nhi u m t ña giác khác nhau, song hình v ch ñư c th hi n hình nh c a ñi m có ñ sâu th p nh t ( t c là ñi m g n nh t). V i cách th c hi n này gi i thu t có th kh ñư c t t c các trư ng h p mà các gi i thu t khác m c ph i. 90
  • 95.
    Chương VII. Khñư ng và m t khu t Gi i h n c a phương pháp này là ñòi h i nhi u b nh và th c hi n nhi u tính toán. Z-Buffer là m t b ñ m dùng ñ lưu ñ sâu cho m i pixel trên hình nh c a v t th , thông thư ng ta t ch c nó là m t ma tr n hình ch nh t. N u dùng 1 byte ñ bi u di n ñ sâu c a m t pixel, thì m t v t th có hình nh trên m t ph ng chi u là 100x100 s c n 10000 byte dùng ñ làm Depth Buffer, và khi ñó vùng ñ m ñ sâu s cho phép ta phân bi t ñư c 256 m c sâu khác nhau, ñi u này có nghĩa là n u có 257 pixel 257 ñ sâu khác nhau thì khi ñó bu t ta ph i quy 2 pixel nào ñó v cùng m t ñ sâu. N u ta dùng 4 byte ñ bi u di n ñ sâu c a m t pixel, thì khi ñó vùng ñ m ñ sâu s cho phép ta phân bi t ñư c 4294967296 (232) m c sâu khác nhau, song lúc ñó s ph i c n 40000 byte cho m t b ñ m kích thư c 100x100. Do tính ch t 2 m t này nên tuỳ vào tình hu ng và yêu c u mà ta có th tăng hay gi m s byte ñ lưu gi ñ sâu c a 1 pixel. Và thông thư ng ngư i ta dùng 4 byte ñ lưu gi ñ sâu c a m t ñi m, khi ñó thì ñ chính xác r t cao. M t câu h i có th ñ t ra là làm sao có th tính ñ sâu c a m i ñi m trong ña giác. ñây có 2 phương pháp: phương pháp tr c ti p và phương pháp gián ti p. • Phương pháp tr c ti p s tính ñ sâu c a m i ñi m d a vào phương trình m t ph ng ch a ña giác. V i phương pháp này chúng ta c n duy t qua t t các ñi m c a ña giác (t t nhiên ch h u h n ñi m), b ng cách cho các thành ph n x và y, n u c p giá tr (x,y) tho trong mi n gi i h n c a ña giác thì chúng ta s tìm thành ph n th 3 là z b ng cách thay th x và y vào phương trình m t ph ng ñ tính ra thành ph n z. V m t toán h c thì phương pháp tr c ti p rõ ràng là r t khoa h c, song khi áp d ng ta s g p ph i vư ng m c: C n ph i tính bao nhiêu ñi m ñ hình nh th hi n c a ña giác lên m t ph ng chi u ñ m n và cũng không b tình tr ng quá m n (t c là v r t nhi u ñi m ch ng ch t lên nhau không c n thi t mà l i gây ra tình tr ng ch m ch p và tăng ñ ph c t p tính toán. Cũng nên nh r ng khi th hi n m t ña giác lên m t ph ng chi u thì nh c a nó có th ñư c phóng to hay thu nh ). • Phương pháp gián ti p: Chúng ta s tính ñ sâu c a m t ñi m gián ti p thông qua ñ sâu c a các ñi m lân c n. ð th c hi n chúng ta ti n hành theo các bư c sau: 91
  • 96.
    Chương VII. Khñư ng và m t khu t G i G là m t m t ña giác ñư c bi u di n b i t p các ñi m P1, P2, … Pn và G’ là hình chi u c a G xu ng m t ph ng chi u v i t p các ñ nh P1’,P2’,… Pn’. ð th hi n hình nh c a G lên m t ph ng chi u thì rõ ràng là chúng ta ph i ti n hành tô ña giác G’. Song như thu t toán ñã phát bi u, chúng ta c n xác ñ nh xem m i ñi m M’ b t kỳ thu c G’ là nh c a ñi m M nào trên G và d a vào ñ sâu c a M ñ so sánh v i ñ sâu ñã có trong zbuffer ñ quy t ñ nh là có v ñi m M’ hay không. N u ta gán thêm cho các ñi m nh m t thành ph n n a, ñó là giá tr ñ sâu c a ñi m t o nh (t c là ñi m ñã t o ra ñi m nh sau phép chi u) thì lúc này ta không c n thi t ph i xác ñ nh M ñ tính ñ sâu, mà ta có th tính ñư c giá tr ñ sâu này qua công th c sau: N u M’ n m trên ño n th ng P’Q’ v i t l là: P’M’/P’Q’=t và n u bi t ñư c ñ sâu c a P’ và Q’ l n lư t là z(P’) và z(Q’) thì ñ sâu mà ñi m nh M’ nh n ñư c là z(M’)=z(P’)+(z(Q’)-z(P’))t (2.3.1) Ta có th s d ng ñư c công th c trên v i t t c các phép chi u có b o toàn ñư ng th ng. T ñó ta có th xác ñ nh quy trình v ña giác G’ là nh c a G như sau: + Gán thêm cho m i ñi m ñ nh c a ña giác G’ m t thành ph n z có giá tr b ng ñ sâu c a ñi m t o nh. Có nghĩa là P’1 s ch a thêm giá tr z(P1), P’2 s ch a thêm giá tr z(P2), hay m t cách t ng quát P’i s ch a thêm giá tr z(Pi) v i i=1..n. Ti n hành tô ña giác G’ theo m t quy trình tương t như thu t toán tô ña giác theo dòng quét. Có nghĩa là cho m t dòng quét ch y ngang qua ña giác, t i m i v trí b t kỳ c a dòng quét, chúng ta ti n hành tìm t p các giao ñi m c a dòng quét v i ña giác. G i {xm} là t p các giao ñi m, m t ñi u c n chú ý là ta c n tính ñ sâu cho các giao ñi m này. Gi s xi là giao ñi m c a ñư ng quét v i c nh Pi’Pj’ th thì ta có th tính ra ñ sâu c a xi thông qua công th c (2.3.1) như sau: 92
  • 97.
    Chương VII. Khñư ng và m t khu t N u g i yscan là giá tr tung ñ c a dòng quét th thì: z(xi) = z(Pi’)+z(Pj’)*[(yscan – y(Pi’))/(y(Pj’)-y(Pi’))] (2.3.2) {trong ñó y(P) là thành ph n to ñ y c a ñi m P} Rõ ràng qua công th c trên ta th y, n u xi là trung ñi m c a Pi’Pj’ thì z(xi) = z(Pi’)+z(Pj’)*1/2 Cài ñ t minh ho cho gi i thu t “vùng ñ m ñ sâu” T nh ng phân tính trên chúng ta có th ti n hành khai báo các c u trúc d li u c n thi t và cài ñ t cho thu t toán. • Khai báo các c u trúc d li u c n thi t: Sau ñây là các khai báo c n thi t ñ cho phép lưu tr m t ñ i tư ng 3D theo mô hình các m t ña giác, cùng các khai báo c n thi t ñ ti n hành kh m t khu t theo thu t toán z-Buffer theo ngôn ng Pascal trong môi trư ng c a trình biên d ch Delphi {B t ñ u ph n khai báo ph c v cho gi i thu t Z-buffer} Type Z_BufferType=Array of Array of cardinal; {Ki u b ñ m Z, ñây là m t m ng ñ ng 2 chi u mà m i ph n t có ki u cardinal, ñi u ñó có nghĩa là vùng ñ m ñ sâu s cho phép ta phân bi t ñư c 4294967296 (232) m c sâu khác nhau} NutPoly_Z=record {C u trúc c a m t ñ nh c a ña giác chi u G’ } x,y:Integer; {To ñ c a nh trên m t ph ng chi u} z:real; {Thành ph n ñ sâu ñi kèm (là ñ sâu c a t o nh)} end; Polygon_Z =array of NutPoly_Z; {ða giác chi u là m t m ng ñ ng. Như m t ña giác 2 chi u, song m i m t ñ nh có ch a thêm thành ph n ñ sâu c a ñ nh} CanhCat_Z=record {C u trúc c a các c nh ña giác ñư c xây d ng nh m ph c v cho quá trình tính giao ñi m} y1,y2:Integer; {Tung ñ b t ñ u và k t thúc c a m t c nh (y1<=y2)} 93
  • 98.
    Chương VII. Khñư ng và m t khu t xGiao:real; {hoành ñ xu t phát c a c nh. Song trong quá trình tính toán nó s là tung ñ giao ñi m c a c nh v i ñư ng quét ngang} xStep:real; {Giá tr thay ñ i c a x khi y thay ñ i 1 ñơn v , nó cho bi t ñ d c c a c nh} zGiao:real; {Giá tr ñ sâu t i ñi m xu t phát c a c nh. Song trong quá trình tính toán nó s là giá tr ñ sâu c a giao ñi m v i ñư ng quét ngang} zStep:real; {Giá tr ñ sâu c a giao ñi m ti p theo so v i giá tr ñ sâu c a giao ñi m trư c ñó s chênh l ch nhau m t kho ng là zStep} end; DanhSachCanhCat_Z=array of CanhCat_Z; {Danh sách các c nh ñư c t o ra t ña giác chi u G’, danh sách này nh m ph v cho quá trình tính toán các giao ñi m v i ñư ng quét cũng như ñ sâu c a m i giao ñi m} GiaoDiem_Z=record {Lưu to ñ giao ñi m và ñ sâu tương ng v i giao ñi m ñó} x,y:Integer; z:real; {To ñ giao ñi m} {Giá tr ñ sâu} ChiSoCanh:integer; {Ch s c nh c t t o ra giao ñi m (Nh m m c ñích kh các giao ñi m th a)} end; DanhsachGiaoDiem_Z=array of GiaoDiem_Z; {K t thúc ph n khai báo ph c v cho gi i thu t Z-buffer} Procedure DrawObj(Obj:Obj3D; Zmin,ZMax:Real; Z_Buffer:Z_BufferType; Canvas:TCanvas; Width,Height:integer; Zoom:real); {ð u vào: + ð i tư ng 3D ch a trong Obj + Gi i h n ñ sâu trong không gian mà chương trình x lý là t Zmin ñ n Zmax. Ta s th c hi n ánh x các giá tr ñ sâu tính ñư c c a các ñi m trên ña 94
  • 99.
    Chương VII. Khñư ng và m t khu t giác sang ño n 0..4294967294. Bi t r ng ñ sâu Zmin ng v i 0 và Zmax ng v i 4294967294. (ñ sâu 4294967295 làm giá tr m c ñ nh cho các ñi m n n + Z_Buffer: là ma tr n ch a ñ sâu các ñi m nh c a các ñ i tư ng ñã th hi n trên Canvas (xem như là m t ph ng chi u). N u ta chưa v ñ i tư ng nào trư c ñó thì Z_Buffer ñư c kh i ñ ng là 4294967295 Canvas: T m v i v . Chúng ta s th c hi n v hình nh c a ñ i tư ng lên Canvas. Width,Height: Là chi u r ng và cao c a Canvas + Zoom: t l th hi n ñ i tư ng lên Canvas sau khi th c hi n phép chi u, ta có th hi u nôm na là t l thu phóng.} 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 {Duy t qua t t c các m t ña giác} begin setlength(Poly,Obj.Mat[K].Sodinh); {Thi t l p s ph n t c a Poly b ng s ñ nh c a m t mà nó s p ch a} For i:=0 to Obj.Mat[K].Sodinh -1 do {Duy t qua t t c các ñ nh c a m t và thi t l p giá tr cho m i ñ nh c a Poly} begin P:=Obj.Mat[K].list[i]; {ð nh th i trong ña giác K s là ñ nh th P trong danh sách ñ nh c a Obj} {Dùng phép chi u tr c giao ñ chi u ñi m Obj.dinh[P] xu ng m t ph ng OXY ta ñư c t a ñ nh là (Obj.dinh[P].y,Obj.dinh[P].x), r i sau ñó phóng theo t l là Zoom và t nh ti n theo vector (cx,cy) nh m giúp ñưa hình nh ra vùng gi a Canvas} Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx; 95
  • 100.
    Chương VII. Khñư ng và m t khu t 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 ñ sâu c a ñ nh Poly[i] là giá tr Obj.dinh[P].z song ñư c ánh x vào ño n 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 t c tô màu m t ña giác theo thu t toán 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:Gi i h n ch s c a m ng Poly D:Danh sách các c nh ñư c t o ra t Poly, ch a nh ng thông tin c n thi t ñ tính giao ñi m và ñ sâu c a giao ñi m m t cách nhanh chóng ND: S ph n t c a m ng D G: Ch a danh sách các giao ñi m có ñư c sau m i l n dòng quét thay ñ i NG:s ph n t c a m ng G} Procedure TaoDanhSachCanhCat; {Th t c này t o ra danh sách D, là danh sách các c nh c a ña giác t thông tin ñ u vào Poly} Var i,d1,d2,Dem,Dy,Cuoi:integer; begin 96
  • 101.
    Chương VII. Khñư ng và m t khu t {Xác ñ nh s c nh c a ña giác} 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; {T o ra các c nh} For i:=L to Cuoi do begin If i<H then j:=i+1 else j:=L; {Xác ñ nh ñi m ñ u và ñi m cu i c a c nh, ñi m ñ u là ñi m 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; {Lưu tr tung ñ xu t phát và k t thúc} D[dem].xGiao:=Poly[d1].x; {Tung ñ xu t phát. Kh i ñ u thì (D[dem].y1,D[dem].xGiao) chính là to ñ c a ñi m ñ u c a c nh} D[dem].zGiao:=Poly[d1].z; {ð sâu c a giao ñi m t i ñi m ñi m ñ u c a c nh} Dy:=(Poly[d2].y-Poly[d1].y); 97
  • 102.
    Chương VII. Khñư ng và m t khu t {ð chênh l ch tung ñ c a ñi m ñ u và ñi m cu i} 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 ñ chênh l ch Dy ta suy ra gia tr ng c a x và ñ sâu z khi giá tr y tăng 1 ñơn v . N u khi dòng quét ñi qua ñi m ñ u thì to ñ giao ñi m là (D[dem].y1,D[dem].xGiao) v i ñ sâu là D[dem].zGiao, n u sau ñó dòng quét tăng ñơn 1 v thì rõ ràng to (D[dem].y1+1,D[dem].xGiao+D[dem].xStep) ñ và giao ñ ñi m sâu s s là 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; {T o danh sách các giao ñi m v i ñư ng quét có tung ñ y hi n th i} Var i:integer; Begin Setlength(G,ND); NG:=0; {Duy t qua t t c các c nh} for i:=0 to ND-1 do begin If (D[i].y1<=y)and(y<=D[i].y2) then {Có giao ñi m v i ñư ng quét y} Begin 98
  • 103.
    Chương VII. Khñư ng và m t khu t {Lưu l i to ñ giao ñi m và ñ sâu} G[NG].x:=round(D[i].xGiao); G[NG].y:=y; G[NG].z:=D[i].zGiao; G[NG].ChiSoCanh:=i; {Ch s c nh ñã t o ra giao ñi m. Nh m ph c v cho quá trình l c b các giao ñi m không c n thi t} {Lưu l i Tung ñ và ñ sâu c a giao ñi m v i ñư ng quét ti p theo (y+1) vào chính 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; {S p x p l i các giao ñi m và l c b các giao ñi m th a} Var i,j,C1,C2:integer; Tg:GiaoDiem_Z; Begin {S p x p l i các giao ñi m} 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 nh ng Giao ñi m th a} While i<(NG-2) do begin If G[i].x=G[i+1].x then {2 giao ñi m trùng nhau} 99
  • 104.
    Chương VII. Khñư ng và m t khu t begin C1:=G[i].ChiSoCanh; C2:=G[i+1].ChiSoCanh; {C1 và C2 là hai c nh ñã t o nên 2 giao ñi m trùng nhau ñang xét} 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á b t m t giao ñi m n u như: 2 c nh t o nên 2 giao ñi m này n m v hai phía c a ñư ng quét ho c có m t c nh là n m 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; {Th c hi n tô màu các ño n th ng là ph n giao c a ñư ng quét v i ña giác. ðó là các ño n x1x2, x3x4,…} 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 {V i m i ño n ta th c hi n tính ñ sâu c a t ng ñi m r i so sánh v i giá tr có trong Z_Buffer} begin 100
  • 105.
    Chương VII. Khñư ng và m t khu t 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 sánh ñ sâu c a ñi m tính ñư c v i ñ sâu ñã có } {N u ñ sâu c a ñi m tính ñư c nh hơn ñ sâu ñã có trong Z_Buffer thì rõ ràng là ñi m tính ñư c g n hơn ñi m ñã v trư c ñó trong vùng ñ m Z và Canvas} Begin Canvas.Pixels[x,G[i].y]:=Color; {V ñi m lên Canvas} Z_Buffer[x,G[i].y]:=Z; {C p nh t ñ sâu c a ñi m v a v vào vùng ñ m Z} end; end; G[i].z:=G[i].z+Dz; {Gán giá tr ñ sâu c a ñi m ti p theo vào trong G[i].z} end; i:=i+2; end; end; {Th t c chính} Begin L:=low(Poly); H:=High(Poly); {Xác ñ nh gi i h n trên và gi i h n dư i c a Poly} Z_BufferW:=high(Z_Buffer); {Xác ñ nh các chi u c a ma tr n Z_Buffer} Z_BufferH:=high(Z_Buffer[0]); {Z_BufferW+1:Chi u r ng (t 0..Z_BufferW) Z_BufferH+1:Chi u cao (t 0..Z_BufferH)} 101
  • 106.
    Chương VII. Khñư ng và m t khu t { Tìm giá tr y l n nh t và nh nh t c a ña giác Poly ñ t ñó cho dòng quét th c hi n quét t trên 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; {T o danh sách các c nh c a ña giác Poly v i các tham s thi t l p nh m giúp cho vi c tính toán giao ñi m ñư c d dàng} For y:=MinY to MaxY do {Cho dòng quét ch y t MinY ñ n MaxY } begin TaoDanhSachGiaoDiem; {Tìm danh sách các giao ñi m c a ñư ng quét y v i các c nh c a Poly} SapXepVaLoc; {S p x p l i các giao ñi m và l c b các giao ñi m th a} ToMauCacDoan; {D a vào các giao ñi m ñ xác ñ nh ra các ño n n m trong ña giác, t ñó tô màu t ng ñi m trên ño n ñó d a vào ñ sâu so sánh v i giá tr ñ sâu tương ng trên Z_Buffer} end; Setlength(D,0); {Gi i phóng m ng D} Setlength(G,0); {Gi i phóng m ng G} end; 102
  • 107.
    Chương VII. Khñư ng và m t khu t BÀI T P 1. Cài ñ t cho thu t gi i Depth-Sorting Cài ñ t chương trình cho phép bi u di n và quan sát v t th 3D theo mô hình "các m t ña giác" trong ñó s d ng thu t gi i Depth-Sorting ñ kh các m t khu t 2. Cài ñ t cho thu t gi i ch n l c m t sau Cài ñ t chương trình cho phép bi u di n và quan sát v t th 3D theo mô hình "các m t ña giác" trong ñó s d ng thu t gi i ch n l c m t sau ñ kh các m t khu t. V i ñ i tư ng là các hình l p phương, t di n, bát di n, c u,… 3. Cài ñ t cho thu t gi i vùng ñ m ñ sâu Cài ñ t chương trình cho phép bi u di n và quan sát v t th 3D theo mô hình "các m t ña giác" trong ñó s d ng thu t gi i ch n l c m t sau ñ kh các m t khu t. V i ñ i tư ng là các m t c t nhau, các hình l i lõm b t kỳ. 103
  • 108.
    CHƯƠNG VIII T OBÓNG V T TH 3D 8.1. KHÁI NI M Khi bi u di n các ñ i tư ng 3 chi u, m t y u t không th b qua ñ tăng tính th c c a ñ i tư ng ñó là t o bóng sáng cho v t th . ð th c hi n ñư c ñi u này, chúng ta c n ph i l n lư t tìm hi u các d ng ngu n sáng có trong t nhiên, cũng như các tính ch t ñ c trưng khác nhau c a m i lo i ngu n sáng. T ñó ñưa ra các gi i pháp k thu t khác nhau nh m th hi n s tác ñ ng c a các ngu n sáng khác nhau lên ñ i tư ng. 8.2. NGU N SÁNG XUNG QUANH Ánh sáng xung quanh là m c sáng trung bình, t n t i trong m t vùng không gian. M t không gian lý tư ng là không gian mà t i ñó m i v t ñ u ñư c cung c p m t lư ng ánh sáng lên b m t là như nhau, t m i phía m i nơi. Thông thư ng ánh sáng xung quanh ñư c xác ñ nh v i m t m c c th g i là m c sáng xung quanh c a vùng không gian mà v t th ñó cư ng , sau ñó ta c ng v i cư ng ñ sáng có ñư c t các ngu n sáng khác ñ có ñư c cư ng ñ sáng cu i cùng lên m t ñi m hay m t m t c a v t th . Vector pháp tuy n c a m t Ánh sáng ph n x Ánh sáng ph n x Ánh sáng t i Ánh sáng t i Hình 8.1. S ph n x c a ánh sáng
  • 109.
    Chương VIII. To bóng v t th 3D 8.3. NGU N SÁNG ð NH HƯ NG Ngu n sáng ñ nh hư ng gi ng như nh ng gì mà m t tr i cung c p cho chúng ta. Nó bao g m m t t p các tia sáng song song, b t k cư ng ñ c a chúng có gi ng nhau hay không. Có hai lo i k t qu c a ánh sáng ñ nh hư ng khi chúng chi u ñ n b m t là: khuy ch tán và ph n chi u. N u b m t ph n x toàn b (gi ng như m t gương) thì các tia ph n x s có hư ng ngư c v i hư ng c a góc t i (Hình 8.1). Trong trư ng h p ngư c l i, n u b m t là không ph n x toàn ph n (có ñ nhám, xù xì) thì m t ph n các tia sáng s b to ñi các hư ng khác hay b h p th , ph n còn l i thì ph n x l i, và lư ng ánh sáng ph n x l i này t l v i góc t i. ñây chúng ta s quan tâm ñ n hi n tư ng ph n x không toàn ph n vì ñây là hi n tư ng ph bi n (vì ch có nh ng ñ i tư ng ñư c c u t o t nh ng m t như m t gương m i x y ra hi n tư ng ph n x toàn ph n), và ñ ng th i tìm cách tính cư ng ñ c a ánh sáng ph n x trên b m t. Vector pháp tuy n c a m t Ánh sáng ph n x Vector pháp tuy n c a m t Ánh sáng t i Ánh sáng ph n x (a) Ánh sáng t i (b) Hình 8.2. S ph n x không toàn ph n c a ánh sáng Trong hình 8.2 th hi n s ph n x ánh sáng không toàn ph n. ð ñ m nét c a các tia ánh sáng t i th hi n cư ng ñ sáng cao, ñ m nh c a các tia ph n x th hi n cư ng ñ sáng th p. Nói chung, khi b m t là không ph n x toàn ph n thì cư ng ñ c a ánh sáng ph n x (hay t m g i là tia ph n x ) luôn bé hơn so v i cư ng ñ c a ánh sáng t i (hay g i là tia t i), và cư ng ñ c a tia ph n x còn t l v i góc gi a tia t i v i vector pháp tuy n c a b m t, n u góc này càng nh thì cư ng ñ ph n x càng cao (hình II.2 (a)), n u góc này l n thì cư ng ñ ph n x r t th p (hình II.2 (b)). ñây ta ch quan tâm ñ n thành ph n ánh sáng khuy ch tán và t m b qua hi n tư ng ph n 105
  • 110.
    Chương VIII. To bóng v t th 3D x toàn ph n. ð cho ti n trong vi c tính toán ta t m ñ i hư ng c a tia t i th c s , v y bây gi hư ng c a tia t i ñư c xem là hư ng ngư c l i c a tia sáng t i. N u g i θ là góc gi a tia t i v i vector pháp tuy n c a b m t thì Cos(θ) ph thu c vào tia t i a và vector pháp tuy n c a m t n theo công th c: Cos (θ ) = a.n (8.1) a.n Trong công th c trên Cos(θ) b ng tích vô hư ng c a a và n chia cho tích ñ l n c a chúng. N u ta ñã chu n hoá ñ l n c a các vector a và n v 1 t trư c thì ta có th tính giá tr trên m t cách nhanh chóng như sau: Cos(θ) = tích vô hư ng c a a và n = a.x*n.x+a.y*n.y+a.z*n.z Vì Cos(θ) có giá tr t +1 ñ n -1 nên ta có th suy ra công th c tính cư ng ñ c a ánh sáng ph n x là: Cư ng ñ ánh sáng ph n x = Cư ng ñ c a ánh sáng ñ nh hư ng * [(Cos(θ)+1)/2] (8.2) Trong ñó [(Cos(θ)+1)/2] có giá tr trong kho ng t 0 ñ n 1. V y qua công th c (8.1) và (8.2) chúng ta có th tính ñư c cư ng ñ c a ánh sáng ph n x trên b m t khi bi t ñư c cư ng ñ c a ánh sáng ñ nh hư ng cũng như các vector pháp tuy n c a m t và tia t i. Cài ñ t thu t toán Dư i ñây là ph n trình bày các th t c ph c v cho vi c v ñ i tư ng 3D ñ c l i, theo thu t toán ch n l c m t sau có tính ñ n v n ñ chi u sáng c a ngu n sáng xung quanh và ngu n sáng ñ nh hư ng. Function Cuong_Do_Anh_Sang_Dinh_Huong(v,n:Vector3D):real; {Th t c tính cư ng ñ ánh sáng ph n x trên b m t c a ña giác khi bi t ñư c tia t i v và vector pháp tuy n 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); {Gán S b ng tích c a |v|*|n|} 106
  • 111.
    Chương VIII. To bóng v t th 3D if s=0 then {M t trong hai vector b ng 0 do ñó t m xem cư ng ñ sáng b ng 1} begin Cuong_Do_Anh_Sang_Dinh_Huong:=1;end else Begin t:=tich_vo_huong(v,n); {Tính tích vô hư ng c a v và n} If t>0 then {N u góc gi a v và n n m trong kho ng 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 tư ng 3D ñ c l i theo thu t toán ch n l c m t sau có tính ñ n v n ñ chi u sáng c a ngu n sáng xung quanh và ngu n sáng ñ nh hư ng. Trong ñó: + Obj: ch a ñ i tư ng 3D c n v + Canvas: V i v (hay vùng ñ m khung) + Width, Height: Kích thư c c a Canvas + Zooom: H s t l khi v ñ i tư ng (Hay h s thu phóng) + V: Vector hư ng nhìn. N u Obj ñã ñư c chuy n sang h to ñ quan sát O’UVN thì V=(0,0,-1) + AnhSangNen: Giá tr cư ng ñ c a ánh sáng xung quanh mà ñ i tư ng có th thu nh n ñư c + AnhSangDinhHuong: Giá tr cư ng ñ c a ánh sáng ñ nh hư ng mà ñ i tư ng có th thu nh n ñư c *Chú ý: AnhSangNen + AnhSangDinhHuong <=1. ñây ta xem t ng cư ng ñ c a các ngu n sáng t o ra gi i h n trong kho ng 0..1. T ñó chúng ta có th ñi u ch nh cư ng ñ chi u sáng c a các ngu n sáng b ng cách tăng h s cư ng ñ c a nó song v n ph i luôn luôn tho mãn t ng c a chúng nh hơn hay b ng 1. Khi m t m t 107
  • 112.
    Chương VIII. To bóng v t th 3D nh n ñư c t ng cư ng ñ sáng là 1 t các ngu n sáng khác nhau cung c p thì m t s cho màu th c c a nó. N u t ng cư ng ñ sáng mà nó thu ñư c t các ngu n sáng nh hơn 1 m t s hơi t i ñi. + VectorChieuSang: ðây là vector bi u di n tia t i (chú ý nó có hư ng ngư c v i hư ng c a ánh sáng chi u t i như ñã nói trong ph n lý thuy t} 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 {Thi t l p ña giác là hình chi u c a m t xu ng m t ph ng OXY (có t nh ti n và ñ i hư ng tr c 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 ñ c a ñ nh sau khi chi u là (Obj.dinh[P].x,Obj.dinh[P].y), song ñư c bi n ñ i t l v i h s là zoom r i ñ i hư ng tr c Y và t nh ti n theo vector (cx,cy)} end; {Tính cư ng ñ sáng mà m t nh n ñư c: b ng t ng cư ng ñ sáng do ngu n sáng xung quanh (ánh sáng n n) và ngu n sáng ñ nh hư ng cung c p} CuongDoSang:=AnhSangNen + AnhSangDinhHuong * Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang,Obj.Mat[K].PhapVT); 108
  • 113.
    Chương VIII. To bóng v t th 3D { ñây cư ng ñ sáng mà m t nh n ñư c do ngu n sáng ñ nh hư ng cung c p ph thu c không ch vào cư ng ñ sáng mà ngu n phát ra, mà còn ph thu c vào hư ng ñón ánh sáng c a m t và ñư c bi u di n b i bi u th c: 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); {Thi t l p màu s c cho m t b ng cách: l y cư ng ñ màu s c m t ñ nh c a m t Obj.Mat[K].Color, nhân v i cư ng ñ sáng mà nó nh n ñư c trong th c t tính toán ñư c CuongDoSang. T ñó ta th y, n u m t nh n ñư c ñ y ñ ánh sáng (cư ng ñ sáng =1) thì m t s có màu m t ñ nh c a nó (xác ñ nh khi thi t k ñ i tư ng), ngư c l i thì m t s có màu s c t i hơn. N u m t không ñư c chi u sáng t các ngu n sáng (cư ng ñ sáng =0) thì m t s có màu ñen} canvas.Brush.Color :=rgb(R,G,B); Canvas.Pen.Color:=canvas.Brush.Color; Canvas.Polygon(poly); {v ña giác v i màu s c ñã ñư c xác ñ nh trư c b i bút tô (Brush.Color) và bút v (Pen.Color)} end; setlength(poly,0); end; 8.4. NGU N SÁNG ðI M Ngu n sáng ñ nh hư ng là tương ñương v i ngu n sáng ñi m ñ t vô t n. Nhưng khi ngu n sáng ñi m ñư c mang ñ n g n ñ i tư ng thì các tia sáng t nó phát ra không còn song song n a mà ñư c to ra theo m i hư ng theo d ng hình c u. Vì th , các tia sáng s rơi xu ng các ñi m trên b m t dư i các góc khác nhau. Gi s vector pháp tuy n c a m t là n=(xn, yn, zn), ñi m ñang xét có to ñ là (x0, y0, z0) và ngu n sáng ñi m có t a ñ là (plx, ply, plz) thì ánh sáng s r i ñ n ñi m ñang sét theo vector (x0plx, y0-ply, z0-plz), hay tia t i: a = (plx - x0, ply - y0,plz - z0). 109
  • 114.
    Chương VIII. To bóng v t th 3D T ñó cư ng ñ sáng t i ñi m ñang xét s ph thu c vào Cos(θ) gi a n và a như ñã trình bày trong ph n ngu n sáng ñ nh hư ng. V y v i ngu n sáng ñ nh hư ng, chúng ta c n tính tia t i cho m i ñi m trên m t, t ñó k t h p v i vector pháp tuy n c a m t ñ tính ñư c cư ng ñ sáng t i ñi m ñó, n u tính toán tr c ti p thì có th m t khá nhi u th i gian do ph i tính vector a và tính Cos(θ) thông qua công th c (8.1) v i t t c các ñi m trên m t. Nên nh r ng trong tình hư ng ngu n sáng ñi m thì chúng ta bu c lòng ph i tính Cos(θ) thông qua công th c (8.1) vì vector a s thay ñ i khi m t hay ngu n sáng thay ñ i (tr khi m t tĩnh, song n u m t tĩnh và ngu n sáng c ñ nh thì suy ra chúng ta ch c n tính cư ng ñ sáng m t l n). 8.5. MÔ HÌNH BÓNG GOURAUD Mô hình bóng Gouraud là m t phương pháp v bóng, t o cho ñ i tư ng 3D có hình dáng cong có m t cái nhìn có tính th c hơn. Phương pháp này ñ t cơ s trên th c t sau: ñ i v i các ñ i tư ng 3D có b m t cong thì ngư i ta thư ng x p s b m t cong c a ñ i tư ng b ng nhi u m t ña giác ph ng, ví d như m t m t c u có th s p s b i m t t p các m t ña giác ph ng có kích thư c nh s p x p l i, khi s ña giác x p x tăng lên (có nghĩa là di n tích m t ña giác nh l i) thì tính th c c a m t c u s tăng, s cho ta c m giác m t c u trông tròn tr a hơn, m n và cong hơn. Tuy nhiên, khi s ña giác x p x m t m t cong tăng thì kh i lư ng tính toán và lưu tr cũng tăng theo t l thu n theo s m t, ñi u ñó d n ñ n t c ñ th c hi n s tr nên ch m ch p hơn. Chúng ta hãy th v i m t ví d sau: ð mô ph ng m t m t c u ngư i ta x p x nó b i 200 m t thì cho ta m t c m giác hơi g gh , nhưng v i 450 m t thì ta th y nó m n và tròn tr a hơn, song khi s m t là 16200 thì cho ta c m giác hình c u r t tròn và m n (hình 8.3). Tuy hình nh m t c u v i 16200 m t ña giác thì m n hơn so v i 200 m t, song lư ng tính toán ph i th c hi n trên m i ña giác cũng tăng lên g p 16200/200= 81 l n. Song v n ñ v n còn n y sinh m t khi ta phóng l n hay thu nh v t th . N u ta phóng l n thì rõ ràng là các ña giác cũng ñư c phóng l n theo cùng t l , d n ñ n hình nh v các m t ña giác l i hi n rõ và gây ra c m giác không ñư c trơn m n. Ngư c l i, khi ta thu nh thì n u s ña giác x p x l n thì s d n ñ n tình tr ng các ña giác quá nh , ch ng ch t lên nhau không c n thi t. 110
  • 115.
    Chương VIII. To bóng v t th 3D 200 m t 450 m t Hình 8.3 16200 m t ð gi i quy t v n ñ trên, chúng ta có th ti n hành theo phương pháp tô bóng Gouraud. Mô hình bóng Gouraud t o cho ñ i tư ng m t cái nhìn gi ng như là nó có nhi u m t ña giác b ng cách v m i m t không ch v i m t cư ng ñ sáng mà v v i nhi u cư ng ñ sáng khác nhau trên các vùng khác nhau, làm cho m t ph ng nom như b cong. B i th c ch t ta c m nh n ñư c ñ cong c a các m t cong do hi u ng ánh sáng khi chi u lên m t, t i các ñi m trên m t cong s có pháp vector khác nhau nên s ñón nh n và ph n x ánh sáng khác nhau, t ñó chúng ta s c m nh n ñư c các ñ sáng khác nhau trên cùng m t m t cong. Tô bóng thư ng Tô bóng theo Gouraud Hình 8.4 Thư ng thì m i m t ña giác có m t vector pháp tuy n, và như ph n trên ñã trình bày, vector pháp tuy n ñó ñư c dùng ñ tính cư ng ñ c a ánh sáng ph n x trên b m t c a ña giác t ñó suy ra cư ng ñ sáng c a m t. Tuy nhiên mô hình Gouraud l i xem m t ña giác không ch có m t vector pháp tuy n, mà m i ñ nh c a m t ña giác l i có m t vector pháp tuy n khác nhau, và t vector pháp tuy n c a các ñ nh chúng ta s n i suy ra ñư c vector pháp tuy n c a t ng ñi m trên m t ña giác, t ñó tính ñư c cư ng ñ sáng c a ñi m. Như th , các ñi m trên cùng m t m t c a ña giác s có cư ng ñ sáng khác nhau và cho ta c m giác m t ña giác không ph i là m t ph ng mà là m t cong. 111
  • 116.
    Chương VIII. To bóng v t th 3D Vector trung bình c ng b ng trung bình c ng c a các vector pháp tuy n l n c n Hình 8.5 Th c ch t thì m i m t ña giác ch có m t vector pháp tuy n, song phương pháp Gouraud tính toán vector trung bình t i m i ñ nh c a ña giác b ng cách: l y trung bình c ng các vector pháp tuy n c a các ña giác có ch a ñ nh ñang xét. Vi c n i suy vector pháp tuy n c a t ng ñi m trên m t ña giác ñư c th c hi n tương t như vi c n i suy ñ sâu trong gi i thu t “vùng ñ m ñ sâu” ñã ñư c trình bày trong chương trư c. Cài ñ t thu t toán Dư i ñây là ph n trình bày các th t c ph c v cho vi c v ñ i tư ng 3D ñ c l i và cong, theo thu t toán ch n l c m t sau có tính ñ n v n ñ chi u sáng c a ngu n sáng xung quanh và ngu n sáng ñ nh hư ng, song m i ña giác s ñư c tô bóng theo phương pháp Gouraud. {B t ñ u ph n khai báo ph c v cho gi i thu t tô ña giác theo phương pháp Gouraud} Type NutPolyGourand=record {1 ñ nh c a ña giác chi u (là nh c a m t ña giác xu ng m t ph ng OXY} N:Vector3D; x,y:Integer; {Pháp vector t i 1 ñ nh c a ña giác} {To ñ c a ñ nh} end; 112
  • 117.
    Chương VIII. To bóng v t th 3D PolygonGourand =array of NutPolyGourand; {m ng ñ ng dùng ñ ch a các ñ nh c a ña giác chi u} CanhCat=record {M t c nh c a ña giác ñư c t o ra nh m ph c v cho quá trình tính giao ñi m nhanh} y1,y2:Integer; xGiao:real; XStep:real; NGiao:Vector3D; {Pháp vector t i ñ nh, song nó s ñư c ch a pháp vector tai giao ñi m v i ñư ng quét} NStep:Vector3D; {ñ bi n thiên c a Pháp vector khi di chuy n d c theo c nh, m i l n y thay ñ i 1 ñơn v thì pháp vector thay ñ i m t lư ng là NStep} end; DanhSachCanhCat=array of CanhCat; GiaoDiem=record {C u trúc ch a giao ñi m c a ñư ng quét ngang v i c nh ña giác chi u } x,y:Integer; NGiao:Vector3D; {To ñ giao ñi m} {Pháp vector t i giao ñi m} ChiSoCanh:integer; {Ch s c nh ñã t o ra giao ñi m} 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 tư ng 3D ñ c l i và cong} Var i,j,k,Dem,P,Q,cx,cy:integer; Poly:PolygonGourand; DinhLinkMat:array of Record {Ch a Danh sách các m t có liên k t ñ n m t ñinh} SoMat:Integer; 113
  • 118.
    Chương VIII. To bóng v t th 3D A:array of integer; end; {S m t có liên k t v i ñ nh th i} CMLD:array of integer; begin cx:=Width div 2;cy:=Height div 2; Setlength(DinhLinkMat,Obj.Sodinh); Setlength(CMLD,Obj.Sodinh); For i:=0 to obj.Sodinh-1 do CMLD[i]:=0; {Xác ñ nh m i ñ nh có bao nhiêu m t liên k t ñ 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 m t liên k t ñ n ñ nh th k ñư c tăng lên khi có m t m t có liên k t ñ n nó } end; {Thi t l p danh sách các măt liên k t ñ n t ng ñ nh c a ñ i tư ng} For i:=0 to obj.Sodinh-1 do begin setlength(DinhLinkMat[i].A,CMLD[i]);{S m t liên k t v i ñ nh i là CMLD[i]} DinhLinkMat[i].SoMat:=0; end; {Quá trình xác ñ nh rõ nh ng m t nào liên k t v i ñ 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; 114
  • 119.
    Chương VIII. To bóng v t th 3D 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 {thi t l p các thu c tính c a ñ nh th i c a Poly (ña giác chi u) } 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; {Tính Vector pháp tuy n t i ñ nh Poly b ng cách tính t ng c a các vector pháp tuy n c a các m t có liên k t v i ñ 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 giác Poly theo thu t toán tô ña giác theo dòng quét, song có n i suy vector pháp tuy n cho m i ñi m, và tính cư ng ñ sáng c a m i ñi m trong ña giác d a vào vector pháp tuy n t i ñi m ñó.} end; setlength(poly,0); For i:=0 to obj.Sodinh-1 do setlength(DinhLinkMat[i].A,0); Setlength(DinhLinkMat,0); 115
  • 120.
    Chương VIII. To bóng v t th 3D end; Procedure FillPolygonGourand(Poly:PolygonGourand; Vector_Chieu_Sang:Vector3D; Anh_Sang_Nen,Anh_Sang_Chieu:real; Canvas:TCanvas;Color:RGBColor); {Tô ña giác Poly theo thu t toán tô ña giác theo dòng quét, song có n i suy vector pháp tuy n cho m i ñi m, và tính cư ng ñ sáng c a m i ñi m trong ña giác d a vào vector pháp tuy n t i ñi m ñó. Th t c này tương t như th t c tô ña giác theo thu t toán Z-Buffer song thay vì n i suy ñ sâu z c a m i ñi m, thì th t c này s n i suy pháp vector c a m i ñi m, r i d a vào pháp vector c a ñi m ñó mà tính ra cư ng ñ sáng mà nó có ñư c do ngu n sáng ñ nh hư ng cung c p.} 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; 116
  • 121.
    Chương VIII. To bóng v t th 3D 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; 117
  • 122.
    Chương VIII. To bóng v t th 3D 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 118
  • 123.
    Chương VIII. To bóng v t th 3D 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 119
  • 124.
    Chương VIII. To bóng v t th 3D 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); {Cư ng ñ sáng t i m i ñi m ñư c tính b ng t ng c a cư ng ñ ánh sáng n n c ng v i cư ng ñ có ñư c t ngu n sáng ñ nh hư ng, song ñ tính ñư c cư ng ñ sáng có ñư c t ngu n ñ ng hư ng cung c p thì chúng ta d a vào tia t i (Vector_Chieu_Sang) và pháp vector c a ñi m G[i].Ngiao.} Cd:=round(255*CuongDoSang); Canvas.Pixels[x,G[i].y]:=rgb(Cd*Re,Cd*Gr,Cd*Bl); {N i suy pháp vector c a ñi m ti p theo và gán vào 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 120
  • 125.
    Chương VIII. To bóng v t th 3D begin TaoDanhSachGiaoDiem; SapXepVaLoc; ToMauCacDoan; end; Setlength(D,0); Setlength(G,0); end; BÀI T P 1. Xây d ng m t chương trình cho phép quan sát v t th 3D ñ c l i. Chương trình cho phép thay ñ i v trí quan sát, cho phép th hi n tác ñ ng c a các ngu n sáng xung quanh và ñ nh hư ng lên ñ i tư ng. Nâng cao: Cho thép thay ñ i cư ng ñ c a các ngu n sáng, cũng như thay ñ i hư ng chi u c a ngu n sáng ñ nh hư ng. 2. Hãy xây d ng chương trình v i các ch c năng như Bài 1 song s d ng phương pháp tô bóng Gouraud. 3. Hãy t ng h p các ki n th c ñã bi t ñ xây d ng m t chương trình mô ph ng th gi i th c trong ñó có nhi u ñ i tư ng khác nhau v n ñ ng. 121
  • 126.
    PH L C MTS CHƯƠNG TRÌNH MINH H A I. CÁC THU T TOÁN TÔ MÀU 1. Thu t toán tô màu theo lo t 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);
  • 127.
    Ph l c.M t s chương trình minh h a 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; 123
  • 128.
    Ph l c.M t s chương trình minh h a End; Procedure ThietLapDoHoa; var Gd,Gm:Integer; Begin Gd:=0; InitGraph(Gd,Gm,’C:BPBGI’); 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 if miny>a[i].y if maxx<a[i].x if maxy<a[i].x end; ThietLapDoHoa; vedagiac(a,n); Tomau(a,n); readln; closegraph; end. then then then then minx:=a[i].x; miny:=a[i].y; maxx:=a[i].x; maxy:=a[i].y; 2. Thu t toán 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); 124
  • 129.
    Ph l c.M t s chương trình minh h a 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].xa[j].x)+a[j].y then dem:=dem+1; end; if dem mod 2=1 then KiemTra:=True else KiemTra:=False; 125
  • 130.
    Ph l c.M t s chương trình minh h a 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:TPBGI'); Vedagiac(n,4); Toloang(x,y,14); readln; closegraph; END. 3. Thu t toán 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 { Nhap vao dau danh sach } Var p:DanhSach; Begin new(p); p^.Data:=a; p^.next:=nil; p^.next:=Stack; Stack:DanhSach); 126
  • 131.
    Ph l c.M t s chương trình minh h a 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; 127
  • 132.
    Ph l c.M t s chương trình minh h a 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 128
  • 133.
    Ph l c.M t s chương trình minh h a 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) 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) 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) 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) PUSHStack(C,Stack); End; End; End; then then then then BEGIN KhoiTaoStack; Nhapdagiac(n,a); Gd:=Detect; InitGraph(Gd,Gm,'D:TPBGI'); Vedagiac(n,4); Toloang(x,y,14); readln; closegraph; END. II. CÁC THU T TOÁN XÉN HÌNH 1. Thu t toán 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; 129
  • 134.
    Ph l c.M t s chương trình minh h a 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 if P.x>Duoi.x then s:=s OR if P.y<Tren.y then s:=s OR if P.y>Duoi.y then s:=s OR Ma:=s; end; Left; Right; Above; Below; 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 130
  • 135.
    Ph l c.M t s chương trình minh h a 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; 131
  • 136.
    Ph l c.M t s chương trình minh h a 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:TPBGI'); repeat NhapDinhHCN; VeHCN; Clipping(A,B,Tren,Duoi); until ch=#27; closegraph; END. 2. Thu t toán chia nh phân 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; 132
  • 137.
    Ph l c.M t s chương trình minh h a 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 if P.x>Duoi.x then s:=s OR if P.y<Tren.y then s:=s OR if P.y>Duoi.y then s:=s OR Ma:=s; end; Left; Right; Above; Below; 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; 133
  • 138.
    Ph l c.M t s chương trình minh h a end; End; BEGIN NhapDinhHCN; gd:=detect; Initgraph(gd,gm,'D:TPBGI'); VeHCN; Clipping(A,B,Tren,Duoi); readln; closegraph; END. 3. Thu t toán 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; 134
  • 139.
    Ph l c.M t s chương trình minh h a 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:TPBGI'); VeHCN; LiangBaskyClip(a,b,PTop,PBottom); readln; closegraph; 135
  • 140.
    Ph l c.M t s chương trình minh h a END. III. V CÁC ð I TƯ NG 3D 1. V m t yên ng a 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) + END ; c2*cos(u)*sin(v) + d*v ; 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} 136
  • 141.
    Ph l c.M t s chương trình minh h a 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; 137
  • 142.
    Ph l c.M t s chương trình minh h a END. 2. V các ñ i tư ng 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 138
  • 143.
    Ph l c.M t s chương trình minh h a 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 m t khu t theo gi i thu t 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); 139
  • 144.
    Ph l c.M t s chương trình minh h a 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} 140
  • 145.
    Ph l c.M t s chương trình minh h a 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); 141
  • 146.
    Ph l c.M t s chương trình minh h a 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. 142