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                 CƠ S        C Að             H A

1.1. T NG QUAN V ð         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                           MaxX
                  Y                                    Y




                  O          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;       IncY = ∆y/Step; {bư c tăng khi v }
           x = x1;   y = y1;                        {Ch n ñi m v ñ u tiên}
           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)
                                            yi+
   Phương trình ñư ng th ng qua 2 ñi m:     1
    x − x1     y − y1                       y
            =            (*)
   x 2 − x1   y 2 − y1
                                            yi
   ð t    ∆x = x2 - x1
          ∆y = y2 - y1                                 xi             xi+1

                  ∆y            ∆y
   (*) ⇔ y = x.      + y1 - x1.                             Hình 1.2
                  ∆x            ∆x
                ∆y
   Suy ra m =        nên       ∆y = m. ∆x                       (2)
                ∆x
                         b = y1 - m.x1                          (3)
   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
                     ∆y
              = 2.      .(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.          (d1<d2)
   . N u pi ≥ 0: Ch n yi+1 = yi + 1        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.    v trí xi +1, ta tính:
   pi+1 = pi + 2∆y      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:
                                    1
       pi = F(M) = F(xi + 1,yi +      )
                                    2
            N u pi < 0 ⇒ M n m trên ño n
            th ng ⇒ Q n m dư i M ⇒ Ch n S                                      P
            N u pi ≥ 0 ⇒ M n m dư i ño n              yi+
                                                        1                      Q
            th ng ⇒ Q n m trên M ⇒ Ch n P                                      M

   M t khác:
                                                        yi                     S
                            1
       pi    = F(xi + 1,yi + )
                            2
                                  1                             xi
       pi+1 = F(xi+1 + 1,yi+1 +     )                           xi+1
                                  2                               Hình 1.3
   nên
                                        1                  1
       pi+1 - pi = F(xi+1 + 1,yi+1 +      ) - F(xi + 1,yi + )
                                        2                  2


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

                                             1                         1
                 = A(xi+1+1) + B(yi+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ó:
                               1                     1
       p1 = F(x1 + 1,y1 +        ) = A(x1+1) + B(y1 + ) + C
                               2                     2
                                        B     B
             = Ax1 + Bx1 + C + A +        =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
Phương trình t ng quát c a ñư ng tròn có d ng:                        y,x)           )
       (x - xc)2 + (y - yc)2 = R2      (*)                     (-                        (x,y
                                                               x,y)                      )
   ⇔ y = yc ±      R2 − ( x − xC ) 2   (1)
                                                              (-x,-                        (x,-
   ð ñơn gi n thu t toán, ñ u tiên ta xét ñư ng               y)                           y)
                                                                  (-y,-             (
tròn có tâm     g c t a ñ (xc=0 và yc=0).                         x)                y,-
* Ý tư ng:                                                                  Hình
   Do tính ñ i x ng c a ñư ng tròn nên n u ñi m                             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
ð t:     d1 = yi2 - y2 = yi2 - R2 + (xi + 1)2
         d2 = y2 - (yi - 1)2 = R2 - (xi + 1)2 - (yi - 1)2             yi
                                                                       y
Suy ra:                                                              yi-
   pi = d1 - d2 = 2.(xi + 1)2 + yi2 + (yi - 1)2 - 2R2       (2)        1

⇒ pi+1 = 2.(xi+1 + 1)2 + y2i+1 + (yi+1 - 1)2 - 2R2          (3)
T (2) và (3) ta có:                                                           xi
                                                                              xi+1
   pi+1 - pi = 4xi + 6 + 2.(y2i+1 - yi2) - 2.(yi+1 - yi)                      Hình
                                                                               1.5
⇒ pi+1 = pi + 4xi + 6 + 2.(y2i+1 - yi2) - 2.(yi+1 - yi)
   (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                                          S
                  2    2   2                             yi
   ð t F(x,y) = x + y - R ,ta có:
                                                                                    M
               < 0 n u (x,y)   trong ñư ng tròn                                     Q
                                                         yi-                        P
   F(x,y)      = 0 n u (x,y)   trên ñư ng tròn           1
               > 0 n u (x,y)   ngoàiñư ng tròn
   Lúc này, vi c ch n các ñi m S(xi+1,yi) hay                    xi          xi+1

P(xi+1,yi-1) ñư c ñưa v vi c xét d u c a:                             Hình
                                                                      1.6
                                  1
      pi = F(M) = F(xi + 1,yi -     ) (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:
                               1
       pi    = F(xi + 1,yi -     )
                               2
                                     1
       pi+1 = F(xi+1 + 1,yi+1 -        )
                                     2
   nên
                                           1                  1
       pi+1 - pi = F(xi+1 + 1,yi+1 -         ) - F(xi + 1,yi - )
                                           2                  2
                                             1 2                         1
                 = [(xi+1+1)2 + (yi+1 -        ) - R2] - [(xi+1)2 + (yi - )2 - R2]
                                             2                           2
                                           1 2                         1
                 = [(xi+2)2 + (yi+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ó:
                               1            1            1         5
       p1 = F(x1 + 1,y1 -        ) = F(1,R - ) = 1 + (R - )2 - R2 = - R
                               2            2            2         4

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:
                               x2   y2
                                  + 2 =1
                               a2  b

                                     b2 2
   Ta có th vi t l i:      y2 = -      2
                                         .x + b2      (*)
                                     a
   *Ý tư ng: Gi ng như thu t toán v ñư ng tròn.                          Hình
                                                                         1.7
Ch có s khác bi t          ñâ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

                                 x        y
                         x0 .     2
                                    + y0. 2 = 1
                                a        b
                                                                   x 0 .b 2
   Suy ra, h s góc c a ti p tuy n t i ñi m ñó là: -                         .
                                                                   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)
                                                 b2
   Thay (xi +1) vào (*):                y2 = -     2
                                                     .(xi +1)2 + b2
                                                 a
   ð t:
                                  b2
       d1= yi2 - y2 = yi2 +         2
                                      .(xi +1)2 -b2
                                  a

                                   b2
       d2= y2 - (yi -1)2 = -         2
                                       .(xi +1)2 + b2 - (yi -1)2
                                   a

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

                                b2
       pi+1         = 2.[         2
                                    .(xi+1 +1)2 - b2] + 2.(yi+12 + yi+1) -1
                                a
   Suy ra:
                        b2
       pi+1 - pi = 2.     2
                            .[(xi+1 +1)2 - (xi +1)2] + 2.( yi+12 - yi2 + yi+1 - yi)   (**)
                        a
   *Nh n xét:
   • pi < 0: Ch n yi+1 = yi
                                            b2
               (**) ⇒ pi+1 = pi + 2.           .(2x + 3)
                                            a2
   • pi ≥ 0: Ch n yi+1 = yi -1
                                            b2
               (**) ⇒ pi+1 = pi + 2.           .(2x + 3) - 4yi
                                            a2
       V i ñi m ñ u tiên (0,b), ta có:
                                    b2
                          p1 = 2       - 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 ý:
                                    x2   y2
   Phương trình Ellipse:               + 2 =1
                                    a2  b
   Nhánh 1:
                             1 2
         p1 = b2 - a 2 b +     .a
                             4
         If pi < 0 Then pi+1 = pi + b2 + 2b2xi+1
         else pi+1 = pi + b2 + 2b2xi+1 - 2a2yi+1
   Nhánh 2:
                        1 2
         p1 = b2(xi +     ) + 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
        ax + b           ax 2 + bx + c
   y=          ,   y=                  .
        cx + d               dx + e
12. V các ñư ng cong sau:
                   x2   y2                 x2   y2
    2
   y = 2px            + 2 =1                  - 2 = ±1
                   a2  b                   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



                                       Blue                    Cyan

                             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




                                                                                        26
Chương II. Tô màu

                         Y  0.299 0.587       0.114   R 
                          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
                                  Green                      Yellow
                                             1.0
                          Cyan                       White            Red

                                    Blue                     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




                                  Green                      Yellow

                           Cyan             0.5                       Red

                                     Blue                    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,
..., Pn. Hãy tô màu mi n S.                                      W
                                                                P1                     P3
* Phương pháp t ng quát :                                             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.                                       P4
N u P ∈ S thì tô màu ñi m P.                                         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                x0        xi
th    t tăng d n ñ i v i yi (ñi m ñ u               x
                                                            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
     Xét các ñi m lân c n c a P (Hình 2.6).                        X      O       X
                                                                   O
     N u các ñi m lân c n ñó v n còn thu c S và chưa                      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:

                                      X min ≤ x ≤ X max 
               D = ( x, y ) ∈ R 2 |                     
                                      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
                                                     t ∈ [0,1]
                      y = y1 + ( y 2 − y1). t

   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à
                                                                     A
nghi m c a h b t phương trình (theo t):                         y           P
                                                             yMax
    Xmin ≤ x1+ (x2 - x1). t ≤ Xmax
                                                                                      Q
     Ymin ≤ y1+ (y2 - y1). t ≤ Ymax                         yMin
              0≤ t ≤1
                                                                                            B

   G i N là t p nghi m c a h phương trình                           xMin            xMax X
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:
Chương III. Xén hình

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

thì:      ClipD(F) = PQ             (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           100       101
                                                                    1             0         0
       Bit 2: Qui ñ nh vùng n m bên ph i c a s
                                                                     000          000       001
       Bit 3: Qui ñ nh vùng n m bên dư i c a s                       1            0         0

       Bit 4: Qui ñ nh vùng n m bên trên c a s                       010          010       011
                                                                     1            0         0
• Xét ñi m P ∈ R2 :                                                              Hình 3.2

                           1        nãúuPx < X min
          Pleft       = 
                           0        Ngæåüclaûi

                           1        nãúuP > X max
                                          x
          PRight      = 
                           0        Ngæåüc laûi

                           1        nãúuPy < Y min
          PBelow = 
                           0        Ngæåüclaûi

                           1        nãúuPy > Y max
          PAbove =         
                           0        Ngæåüclaûi

• 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

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

          p1 = - ∆x                 q1 = x1 - xMin

          p2 = ∆x                   q2 = xMax - x1

          p3 = - ∆y                 q3 = y1 - yMin

          p4 = ∆y                   q4 = yMax - y1

thì h 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 }

                          Qk
            u1 = Max({       | k ∈ K2} ∪ {0})
                          Pk

                         Qk
            u2 = Min({      | 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 
                                                        O                      x
               cos(α ) sin(α ) 
v i      R=                                                 Hình 3.3
               − sin(α ) cos(α )




                                                                              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).λ            (2)
                                 0 ≤ λ ≤1
                           

                                          − a ± a 2 − bc
   ◊ Thay (2) vào (1) ta suy ra: λ =
                                                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}
                                                                  Hình
   *Trư c h t, ta ki m tra các trư ng h p ñ c bi t sau:           3.5

     i/   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
                                                             Hình
                                                             3.6
      thì ClipD(F) = ∅ (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

  i/    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
        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
             (x’ y’) = (x y). 
                                 + (trx try)
                                 
                             C D

   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
       M= 
                  - ma tr n bi n ñ i.
                  
              C D

4.1.1.1. Phép ñ ng d ng

   Ma tr n c a phép ñ ng d ng là:

               A 0               x ' = Ax
       M=                 ⇔
               0 D               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
                          ñ i x ng qua Oy
              0 1
Chương IV. Các phép bi n ñ i

            1 0 
                         ñ i x ng qua Ox
             0 −1

             −1 0 
                         ñ i x ng qua g c t a ñ
             0 −1

4.1.1.3. Phép quay

                                                    Cos (α ) Sin(α ) 
   Ma tr n t ng quát c a phép quay là          R= 
                                                                       
                                                                        
                                                    − Sin(α ) Cos (α ) 

   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     0    0
                                 
            (x y 1).  0    1    0 = (x + M      y+N        1)
                                 
                     M    N     1

4.1.1.5. Phép bi n d ng

   Ma tr n t ng quát là: M =  1 g 
                                  
                                  h    
                                      1
                                        
   Trong ñó:

      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   0  Cos(α ) Sin (α ) 0  1         0   0
                                                           
           0     1   0 .  − Sin (α ) Cos(α ) 0 .  0   1   0
                                                           
          −M    −N   1        0        0     1  M     N   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(x,y,z)                                      P(R,θ,φ)
                                                                            R
                                             Y                                  φ          Y
                      O                                             O

                                                                        θ



            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
                                                   x ' = A. x
                0 B 0 0                           
            M=                          ⇔            y ' = B. y
                0 0 C 0
                                                   z ' = C. z
                                                    
                0 0 0 1


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

4.2.2.2. Phép ñ i x ng

               1     0    0
                           0
                           
                 0    1    0
                           0
          Mz =                        ñ i x ng qua m t (XY)
               0     0 −1 0
                           
               0     0 0 1

              1 0         0 0
                             
                0 −1       0 0
          My=                      ñ i x ng qua m t (XZ)
              0 0         1 0
                             
              0 0         0 1

                −1       0 0 0
                              
                 0        1 0 0
          Mx =                        ñ i x ng qua m t (YZ)
               0         0 1 0
                              
               0         0 0 1

4.2.2.3. Phép t nh ti n

             1       0     0 0
                                           x ' = x + M
               0      1     0 0             
          M=                          ⇔      y' = y + N
             0       0     1 0
                                            z' = z + P
                                             
             M       N     P 1

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(θ )      0 0
                                     
            − Sin(θ ) Cos (θ )    0 0
      RZ = 
                0        0         1 0
                                     
                                  0 1
               0        0            

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




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

            Cos (θ )    0   Sin(θ )0
                                     
                0       1   0      0
      RY = 
             − Sin(θ )   0 Cos (θ ) 0 
                                     
                                   1
                0       0   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)
                            Maét
                    X                                                                    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.

                                                                                    1
   Do thành ph n x’ c a tia r là E.(1-t) + x.t = 0 nên t =                                . Thay t vào (*) ta
                                                                                 1− x / E
tính ñư c:

                       y                z
             y’ =            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            X0
                      Z


                                                                 Z0            O'

                                      YE     XE



                                  φ                                                      Y
                     O

                          θ



           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'

                                                   φ                  Y
                                      O

                                          θ
                                              X1


                           X
                                               Hình 4.6

         Ma tr n c a phép t nh ti n (L y ngh ch ñ o):

    1       0     0  0            1                       0                 0         0
                                                                                       
     0       1     0  0             0                       1                 0         0
A=                      =
    0       0     1 0             0                       0                 1         0
                                                                                       
   −M      −N    − P 1   − R. Cos(θ ). Cos(φ ) − R. Sin (θ ). Cos(φ ) − R. Sin (φ )   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 )     0 0                  Cos( a ) − Sin ( a )    0 0
                                                                                
          − Sin ( a ) Cos( a )   0 0                  Sin ( a ) Cos( a )      0 0
   Rz =                                          -1
                                                 R z=
         0             0        1 0                  0            0          1 0
                                                                                
         0             0        0 1                  0            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(θ )         0 0
                                   
        − Cos(θ ) Sin (θ )       0 0
   B=                                và h (X1,Y1,Z1) bi n ñ i thành h (X2,Y2,Z2).
          0         0           1 0
                                   
          0         0           0 1

   Bư c   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ó:

        1     0        0          0
                                   
         0 Cos (a ) Sin(a )       0
   Rx = 
          0 − Sin(a ) Cos (a )     0
                                   
        0                         1
              0        0           




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

                                              Z



                                                             Y3


                                                                       O'
                                                        Z3
                                                    φ                              Y
                                                                  X3
                                          O
                                                             θ'
                                              θ



                            X
                                                  Hình 4.8

          1     0         0         0
                                     
            0 Cos( a ) − Sin ( a )   0
   R-1x = 
           0 Sin ( a ) Cos( a )     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:

      1      0         0            0
                                     
        0 − Sin (φ ) − Cos(φ )       0
   C= 
       0 Cos(φ ) − Sin (φ )         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 0 0
                   
        0      1 0 0
   D= 
      0       0 1 0
                   
      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



                                                 Z0        O'

                                             φ                             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(φ )         0
                                                                
       Cos(θ ) − Sin (θ ). Sin (φ ) − Sin (θ ). Cos(φ )         0
  T= 
      0             Cos(φ )             − Sin (φ )             0
                                                                
      0                0                    R                  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




                    X0                          Maøn hình
                               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



                            P6                  P7

                       P5
                                           P8

                                                       Y
                                     P1
                                                P2

                          P4              P3


                  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
                                                      Z
      Vector   x       y         z                                    P4
        1      0       0         0
        2      0       1         0
                                                                 P9
                                                     P5                         P3
        3      0       1         1
        4      0      0.5        1.5
                                               P10
        5      0       0         1                                    P8

        6      1       0         0                                                   Y
                                                          P1
        7      1       1         0
                                                                                P2
        8      1       1         1
                                               P6
        9      1      0.5        1.5                                       P7
       10      1       0         1         X

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

WireFrame.     ñây, chúng ta dùng c u trúc record d a trên 2 m ng:

   Const       MaxDinh = 50; { S          ñ nh t i ña}
               MaxCanh = 100; {S          c nh t i ña}
   Type        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ư           Danh sách các c nh
sau:
                                                     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
      canh[1, 1]:=1;        {S ñ nh th nh t c a        9          9          10
                             c nh s 1}                 10        10          6
      canh[1, 2]:=2; {S ñ nh th hai c a                11         1          6
                             c nh s 1}                 12         2          7
      ...                                              13         3          8
end;                                                   14         4          9

5.2. V      MÔ HÌNH WIREFRAME V I CÁC                  15         5          10

      PHÉP CHI U                                       16         2          5
                                                       17         1          3
      ð 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)                   (c)
                                     Hình 5.2

     • 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π         -π/2 ≤ v ≤ π/2

   •   M t   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
                                 x = R. cos( )
                                             u
             P1(u): ñư ng tròn                 u,v ∈ [0,1]
                                 y = R. sin(u)

   • 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)   (3’)
        r = 0,1,...,L    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:
                                               L!
                            BkL(t) =                   (1-t)L-k.tk         v iL≥k
                                         k !( L − 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
                            P(u,v) =     ∑ ∑ Pi,k.BiM(u).BkL(v)
                                         i =0   i =0


  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              (tích vô hư ng)
  hay           P(t) = BL(t).PT      (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              0
                                             
                           −3 3 0            0
                   Bez = 
                      3
                          3 −6 3            0
                                             
                          −1 3 −3           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


                                    L!
   trong ñó: BkL(0) =                       (1-0)L-k.0k   ∀k ≠ 0 và k ≠ L
                              k !( L − k )!
                                    L!
                        =                   .0 = 0
                              k !( L − k )!
   Vì v y,     P(0)     = P0.B0L(0)         + PL.BLL(0)
                        = P0                + 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
   Khai tri n (*) ta có:     ∑ Pk.N.BkL(t) +        ∑ tr.BkL(t)
                             k=0                    k=0

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

                                               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

                                                                           L
   Do P(t) là t h p l i c a các ñi m ki m soát ∀t ∈ [0,1] và               ∑ 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           t t c các giá tr t ∈ [0,1]. Do ñó, hi u
ch nh b t kỳ m t ñi m ki m soát nào cũng s         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                       coï mang[0,1]
                                                              giaï
                          
                                 3       3
                   g(t) = b(t) = - (t - )2                 coï mang[1,2]
                                                              giaï
                                 4       2
                                  1
                          c(t) = (3 - t)2
                                                            coï mang[2,3]
                                                              giaï
                          
                                 2

   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 B-
Spline, 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                            tk + m − t 
          Nk,m(t) =                       .Nk,m-1(t) +                     .Nk+1,m-1(t) v i k=0..L
                        t k + m − 1 − tk                  tk + m − tk + 1 

                                                            1 tk π t ≤ tk + 1
  ðây là m t công th c ñ quy v i Nk,L(t) = 
                                                             0 ngæåüc   laûi

                                           (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
          P(u,v) =     ∑ ∑ Pi,k.Ni,m(u).Nk,m(v)
                       i =0   k=0


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              nh ng giá tr
u khác nhau thì các ñi m ki m soát cũng n m           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        L
             P(u,v) =        ∑ ∑ Pi,k.BiM(u).BkL(v)              (**)
                             i =0    k=0


  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                   biên. Có th th y ñư c ñi u này khi thay u=0 vào
trong phương trình (*)              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
          P(u,v) =    ∑ ∑ Pi,k.Ni,m(u).Nk,m(v)
                      i =0   k=0


  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à
                                                         3
                                                                              M t4
   chi u    sáng.Trong     chương
                                     M t3
   này chúng ta s        t p trung
                                                                         5
   nghiên c u v n ñ kh m t
   khu t.                                     4

Ví d : Mô t v t th như trong                                         M t2
hình 7.1.                                                    6
- 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
                      end;                  ñư c tư ng minh}
      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.   ñây ta dùng m ng ñ ng}
                   Color:RGBColor;                 {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     g n sau, như th thì các m t     g n s không b
che khu t b i các m t     xa, mà ch có các m t      xa m i có th b các m t    g n che
khu t, do các m t    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 z-
buffer ñ 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;            {To ñ giao ñi m}
     z:real;               {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    1    ñơn     v   thì   rõ   ràng       to    ñ   giao    ñi m       s   là
(D[dem].y1+1,D[dem].xGiao+D[dem].xStep)             và   ñ       sâu    s       là
(D[dem].zGiao+D[dem].zStep)}
            end
        else
             begin
               D[dem].xStep:=0;
               D[dem].zStep:=0;
             end;
        Dem:=Dem+1;
  end;
end;
Procedure TaoDanhSachGiaoDiem;
{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       Ánh sáng t i
 x                                                                   Á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           Vector pháp tuy n c a m t

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




                   (a)                                  (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:

                                          a.n
                             Cos (θ ) =             (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 (x0-
plx, 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                   16200 m t
                                     Hình 8.3

  ð 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;            {Pháp vector t i 1 ñ nh c a ña giác}
          x,y:Integer;              {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;              {To ñ giao ñi m}
         NGiao:Vector3D;             {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;
  CMLD:array of integer;               {S m t có liên k t v i ñ nh th i}
begin
cx:=Width div 2;cy:=Height div 2;
Setlength(DinhLinkMat,Obj.Sodinh);
Setlength(CMLD,Obj.Sodinh);
For i:=0 to obj.Sodinh-1 do CMLD[i]:=0;
{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         then   minx:=a[i].x;
          if miny>a[i].y         then   miny:=a[i].y;
          if maxx<a[i].x         then   maxx:=a[i].x;
          if maxy<a[i].x         then   maxy:=a[i].y;
        end;
     ThietLapDoHoa;
      vedagiac(a,n);
      Tomau(a,n);
      readln;
      closegraph;
end.
2. 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].x-
                         a[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        Stack:DanhSach);
{ Nhap vao dau danh sach }
 Var p:DanhSach;
 Begin
     new(p);
     p^.Data:=a; p^.next:=nil;
     p^.next:=Stack;
                                                                   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)       then
         PUSHStack(C,Stack);
         C.x:=B.x-1; C.y:=B.y;
         if KiemTra(C.x,C.y,a) and
                  (GetPixel(C.x,C.y)<>color)       then
         PUSHStack(C,Stack);
         C.x:=B.x; C.y:=B.y+1;
         if KiemTra(C.x,C.y,a) and
                  (GetPixel(C.x,C.y)<>color)       then
         PUSHStack(C,Stack);
         C.x:=B.x; C.y:=B.y-1;
         if KiemTra(C.x,C.y,a) and
                  (GetPixel(C.x,C.y)<>color)       then
         PUSHStack(C,Stack);
       End;
    End;
 End;
BEGIN
  KhoiTaoStack;
  Nhapdagiac(n,a);
  Gd:=Detect;
  InitGraph(Gd,Gm,'D: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   Left;
   if P.x>Duoi.x then s:=s OR   Right;
   if P.y<Tren.y then s:=s OR   Above;
   if P.y>Duoi.y then s:=s OR   Below;
   Ma:=s;
end;
Procedure Swap(Var A,B:ToaDo2D);
var t:ToaDo2D;
 Begin
   t:=a; a:=b; b:=t;
 End;
Procedure Clipping(A,B,Tren,Duoi:ToaDo2D);
Var stop,draw:Boolean;
    m:Real;
Begin
  stop:=False; draw:=False;
  While not stop do
   Begin

                                                               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   Left;
   if P.x>Duoi.x then s:=s OR   Right;
   if P.y<Tren.y then s:=s OR   Above;
   if P.y>Duoi.y then s:=s OR   Below;
   Ma:=s;
end;
PROCEDURE XuLyATrongBNgoai(A,B:ToaDo2D);
 Var C,D,M:ToaDo2D;
   begin
    c:=a;d:=b;
    While abs(C.x-D.x)+abs(C.y-D.y)>2 do
      begin
       M.x:=round((C.x+D.x)/2);
       M.y:=round((C.y+D.y)/2);
       if ma(M)<>0 then D:=M else C:=M;
      end;
    line(A.x,A.y,C.x,C.y);
 end;
PROCEDURE Clipping(A,B,Tren,Duoi:ToaDo2D);
Var C,D,M:ToaDo2D;
Begin
  if (ma(a)=0) and (ma(b)=0) then line(a.x,a.y,b.x,b.y);
  if (ma(a)=0) and (ma(b)<>0) then XulyATrongBNgoai(A,B);
  if (ma(a)<>0) and (ma(b)=0) then XulyATrongBNgoai(B,A);
  if (ma(A)<>0) and (ma(B)<>0) and ((ma(A) and ma(B))=0)
then
   begin
      C:=A; D:=B;
      M.x:=(C.x+D.x)div 2;
      M.y:=(C.y+D.y)div 2;
      while (ma(M)<>0)and(abs(C.x-D.x)+abs(C.y-D.y)>2) do
        begin
           if (ma(C) and ma(M))<>0 then C:=M else D:=M;
           M.x:=(C.x+D.x)div 2;
           M.y:=(C.y+D.y)div 2;
        end;
     if ma(M)=0 then
      begin
       XulyATrongBNgoai(M,A);
       XulyATrongBNgoai(M,B);
      end;

                                                               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) +      c2*cos(u)*sin(v) + d*v ;
END ;
FUNCTION fz(u,v:real): real;
BEGIN
  fz := a2*sin(u) +b2*sin(v) + d*u*u - d*v*v        ;
END ;
PROCEDURE ho_duong_cong_u ;
VAR P :ToaDo3D;
BEGIN
  u := uMin;    {Mat cat U ban dau}
  WHILE u<=uMax DO
    BEGIN
      v :=vMin;    {Mat cat V ban dau}
      P.x :=fx(u,v);
      P.y :=fy(u,v);
      P.z :=fz(u,v);
      DiDen(P); {Move to point (x,y,z) ban dau}
      WHILE v <= vMax DO {Thay doi mat cat V}

                                                               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

Ly thuyetdohoa

  • 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ÁC Y U T CƠ S C Að H A 1.1. T NG QUAN V ð 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 MaxX Y Y O 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; IncY = ∆y/Step; {bư c tăng khi v } x = x1; y = y1; {Ch n ñi m v ñ u tiên} 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) yi+ Phương trình ñư ng th ng qua 2 ñi m: 1 x − x1 y − y1 y = (*) x 2 − x1 y 2 − y1 yi ð t ∆x = x2 - x1 ∆y = y2 - y1 xi xi+1 ∆y ∆y (*) ⇔ y = x. + y1 - x1. Hình 1.2 ∆x ∆x ∆y Suy ra m = nên ∆y = m. ∆x (2) ∆x b = y1 - m.x1 (3) 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 ∆y = 2. .(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. (d1<d2) . N u pi ≥ 0: Ch n yi+1 = yi + 1 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. v trí xi +1, ta tính: pi+1 = pi + 2∆y 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: 1 pi = F(M) = F(xi + 1,yi + ) 2 N u pi < 0 ⇒ M n m trên ño n th ng ⇒ Q n m dư i M ⇒ Ch n S P N u pi ≥ 0 ⇒ M n m dư i ño n yi+ 1 Q th ng ⇒ Q n m trên M ⇒ Ch n P M M t khác: yi S 1 pi = F(xi + 1,yi + ) 2 1 xi pi+1 = F(xi+1 + 1,yi+1 + ) xi+1 2 Hình 1.3 nên 1 1 pi+1 - pi = F(xi+1 + 1,yi+1 + ) - F(xi + 1,yi + ) 2 2 12
  • 18.
    Chương I. Cácy u t cơ s c a ñ h a 1 1 = A(xi+1+1) + B(yi+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ó: 1 1 p1 = F(x1 + 1,y1 + ) = A(x1+1) + B(y1 + ) + C 2 2 B B = Ax1 + Bx1 + C + A + =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 Phương trình t ng quát c a ñư ng tròn có d ng: y,x) ) (x - xc)2 + (y - yc)2 = R2 (*) (- (x,y x,y) ) ⇔ y = yc ± R2 − ( x − xC ) 2 (1) (-x,- (x,- ð ñơn gi n thu t toán, ñ u tiên ta xét ñư ng y) y) (-y,- ( tròn có tâm g c t a ñ (xc=0 và yc=0). x) y,- * Ý tư ng: Hình Do tính ñ i x ng c a ñư ng tròn nên n u ñi m 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 ð t: d1 = yi2 - y2 = yi2 - R2 + (xi + 1)2 d2 = y2 - (yi - 1)2 = R2 - (xi + 1)2 - (yi - 1)2 yi y Suy ra: yi- pi = d1 - d2 = 2.(xi + 1)2 + yi2 + (yi - 1)2 - 2R2 (2) 1 ⇒ pi+1 = 2.(xi+1 + 1)2 + y2i+1 + (yi+1 - 1)2 - 2R2 (3) T (2) và (3) ta có: xi xi+1 pi+1 - pi = 4xi + 6 + 2.(y2i+1 - yi2) - 2.(yi+1 - yi) Hình 1.5 ⇒ pi+1 = pi + 4xi + 6 + 2.(y2i+1 - yi2) - 2.(yi+1 - yi) (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 S 2 2 2 yi ð t F(x,y) = x + y - R ,ta có: M < 0 n u (x,y) trong ñư ng tròn Q yi- P F(x,y) = 0 n u (x,y) trên ñư ng tròn 1 > 0 n u (x,y) ngoàiñư ng tròn Lúc này, vi c ch n các ñi m S(xi+1,yi) hay xi xi+1 P(xi+1,yi-1) ñư c ñưa v vi c xét d u c a: Hình 1.6 1 pi = F(M) = F(xi + 1,yi - ) (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: 1 pi = F(xi + 1,yi - ) 2 1 pi+1 = F(xi+1 + 1,yi+1 - ) 2 nên 1 1 pi+1 - pi = F(xi+1 + 1,yi+1 - ) - F(xi + 1,yi - ) 2 2 1 2 1 = [(xi+1+1)2 + (yi+1 - ) - R2] - [(xi+1)2 + (yi - )2 - R2] 2 2 1 2 1 = [(xi+2)2 + (yi+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ó: 1 1 1 5 p1 = F(x1 + 1,y1 - ) = F(1,R - ) = 1 + (R - )2 - R2 = - R 2 2 2 4 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: x2 y2 + 2 =1 a2 b b2 2 Ta có th vi t l i: y2 = - 2 .x + b2 (*) a *Ý tư ng: Gi ng như thu t toán v ñư ng tròn. Hình 1.7 Ch có s khác bi t ñâ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 x y x0 . 2 + y0. 2 = 1 a b x 0 .b 2 Suy ra, h s góc c a ti p tuy n t i ñi m ñó là: - . 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) b2 Thay (xi +1) vào (*): y2 = - 2 .(xi +1)2 + b2 a ð t: b2 d1= yi2 - y2 = yi2 + 2 .(xi +1)2 -b2 a b2 d2= y2 - (yi -1)2 = - 2 .(xi +1)2 + b2 - (yi -1)2 a b2 ⇒ pi = d1 - d2 = 2.[ 2 .(xi +1)2 - b2] + 2.(yi2 + yi) -1 a b2 pi+1 = 2.[ 2 .(xi+1 +1)2 - b2] + 2.(yi+12 + yi+1) -1 a Suy ra: b2 pi+1 - pi = 2. 2 .[(xi+1 +1)2 - (xi +1)2] + 2.( yi+12 - yi2 + yi+1 - yi) (**) a *Nh n xét: • pi < 0: Ch n yi+1 = yi b2 (**) ⇒ pi+1 = pi + 2. .(2x + 3) a2 • pi ≥ 0: Ch n yi+1 = yi -1 b2 (**) ⇒ pi+1 = pi + 2. .(2x + 3) - 4yi a2 V i ñi m ñ u tiên (0,b), ta có: b2 p1 = 2 - 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 ý: x2 y2 Phương trình Ellipse: + 2 =1 a2 b Nhánh 1: 1 2 p1 = b2 - a 2 b + .a 4 If pi < 0 Then pi+1 = pi + b2 + 2b2xi+1 else pi+1 = pi + b2 + 2b2xi+1 - 2a2yi+1 Nhánh 2: 1 2 p1 = b2(xi + ) + 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 ax + b ax 2 + bx + c y= , y= . cx + d dx + e 12. V các ñư ng cong sau: x2 y2 x2 y2 2 y = 2px + 2 =1 - 2 = ±1 a2 b 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 Blue Cyan 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 26
  • 31.
    Chương II. Tômàu Y  0.299 0.587 0.114   R   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 Green Yellow 1.0 Cyan White Red Blue 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 Green Yellow Cyan 0.5 Red Blue 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, ..., Pn. Hãy tô màu mi n S. W P1 P3 * Phương pháp t ng quát : 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. P4 N u P ∈ S thì tô màu ñi m P. 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 x0 xi th t tăng d n ñ i v i yi (ñi m ñ u x 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 Xét các ñi m lân c n c a P (Hình 2.6). X O X O N u các ñi m lân c n ñó v n còn thu c S và chưa 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:  X min ≤ x ≤ X max  D = ( x, y ) ∈ R 2 |   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  t ∈ [0,1]  y = y1 + ( y 2 − y1). t 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à A nghi m c a h b t phương trình (theo t): y P yMax Xmin ≤ x1+ (x2 - x1). t ≤ Xmax  Q  Ymin ≤ y1+ (y2 - y1). t ≤ Ymax yMin  0≤ t ≤1  B G i N là t p nghi m c a h phương trình xMin xMax X 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:
  • 37.
    Chương III. Xénhình  Px = x1 + ( x 2 − x1). t 1  Qx = x1 + ( x 2 − x1). t 2    Py = y1 + ( y 2 − y1). t 1 Qy = y1 + ( y 2 − y1). t 2 thì: ClipD(F) = PQ (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 100 101 1 0 0 Bit 2: Qui ñ nh vùng n m bên ph i c a s 000 000 001 Bit 3: Qui ñ nh vùng n m bên dư i c a s 1 0 0 Bit 4: Qui ñ nh vùng n m bên trên c a s 010 010 011 1 0 0 • Xét ñi m P ∈ R2 : Hình 3.2 1 nãúuPx < X min Pleft =  0 Ngæåüclaûi 1 nãúuP > X max x PRight =  0 Ngæåüc laûi 1 nãúuPy < Y min PBelow =  0 Ngæåüclaûi 1 nãúuPy > Y max PAbove =  0 Ngæåüclaûi • 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 ð t ∆x = x2 - x1 ∆y = y2 - y1 p1 = - ∆x q1 = x1 - xMin p2 = ∆x q2 = xMax - x1 p3 = - ∆y q3 = y1 - yMin p4 = ∆y q4 = yMax - y1 thì h 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 } Qk u1 = Max({ | k ∈ K2} ∪ {0}) Pk Qk u2 = Min({ | 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  O x  cos(α ) sin(α )  v i R=   Hình 3.3  − sin(α ) cos(α ) 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).λ (2)  0 ≤ λ ≤1  − a ± a 2 − bc ◊ Thay (2) vào (1) ta suy ra: λ = 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} Hình *Trư c h t, ta ki m tra các trư ng h p ñ c bi t sau: 3.5 i/ 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 Hình 3.6 thì ClipD(F) = ∅ (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 i/ 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 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É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 (x’ y’) = (x y).    + (trx try)  C D 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 M=    - ma tr n bi n ñ i.  C D 4.1.1.1. Phép ñ ng d ng Ma tr n c a phép ñ ng d ng là:  A 0  x ' = Ax M=   ⇔  0 D  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   ñ i x ng qua Oy  0 1
  • 46.
    Chương IV. Cácphép bi n ñ i 1 0    ñ i x ng qua Ox  0 −1  −1 0    ñ i x ng qua g c t a ñ  0 −1 4.1.1.3. Phép quay  Cos (α ) Sin(α )  Ma tr n t ng quát c a phép quay là R=      − Sin(α ) Cos (α )  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 0 0   (x y 1).  0 1 0 = (x + M y+N 1)   M N 1 4.1.1.5. Phép bi n d ng Ma tr n t ng quát là: M =  1 g   h   1  Trong ñó: 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 0  Cos(α ) Sin (α ) 0  1 0 0        0 1 0 .  − Sin (α ) Cos(α ) 0 .  0 1 0       −M −N 1  0 0 1  M N 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(x,y,z) P(R,θ,φ) R Y φ Y O O θ 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    x ' = A. x  0 B 0 0  M= ⇔  y ' = B. y  0 0 C 0    z ' = C. z   0 0 0 1 .46
  • 51.
    Chương IV. Cácphép bi n ñ i 4.2.2.2. Phép ñ i x ng 1 0 0 0   0 1 0 0 Mz =  ñ i x ng qua m t (XY) 0 0 −1 0   0 0 0 1 1 0 0 0   0 −1 0 0 My=  ñ i x ng qua m t (XZ) 0 0 1 0   0 0 0 1  −1 0 0 0   0 1 0 0 Mx =  ñ i x ng qua m t (YZ) 0 0 1 0   0 0 0 1 4.2.2.3. Phép t nh ti n 1 0 0 0   x ' = x + M 0 1 0 0  M=  ⇔  y' = y + N 0 0 1 0    z' = z + P  M N P 1 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(θ ) 0 0    − Sin(θ ) Cos (θ ) 0 0 RZ =  0 0 1 0    0 1  0 0  1 0 0 0    0 Cos (θ ) Sin(θ ) 0 RX =  0 − Sin(θ ) Cos (θ ) 0   0 1  0 0  .47
  • 52.
    Chương IV. Cácphép bi n ñ i  Cos (θ ) 0 Sin(θ )0    0 1 0 0 RY =  − Sin(θ ) 0 Cos (θ ) 0     1  0 0 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) Maét X 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. 1 Do thành ph n x’ c a tia r là E.(1-t) + x.t = 0 nên t = . Thay t vào (*) ta 1− x / E tính ñư c: y z y’ = 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 X0 Z Z0 O' YE XE φ Y O θ 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' φ Y O θ X1 X Hình 4.6 Ma tr n c a phép t nh ti n (L y ngh ch ñ o):  1 0 0 0  1 0 0 0     0 1 0 0 0 1 0 0 A=  =  0 0 1 0  0 0 1 0     −M −N − P 1  − R. Cos(θ ). Cos(φ ) − R. Sin (θ ). Cos(φ ) − R. Sin (φ ) 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 ) 0 0  Cos( a ) − Sin ( a ) 0 0     − Sin ( a ) Cos( a ) 0 0  Sin ( a ) Cos( a ) 0 0 Rz =  -1 R z=  0 0 1 0  0 0 1 0      0 0 0 1  0 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(θ ) 0 0   − Cos(θ ) Sin (θ ) 0 0 B=  và h (X1,Y1,Z1) bi n ñ i thành h (X2,Y2,Z2).  0 0 1 0    0 0 0 1 Bư c 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ó: 1 0 0 0    0 Cos (a ) Sin(a ) 0 Rx =  0 − Sin(a ) Cos (a ) 0   0 1  0 0  .52
  • 57.
    Chương IV. Cácphép bi n ñ i Z Y3 O' Z3 φ Y X3 O θ' θ X Hình 4.8 1 0 0 0   0 Cos( a ) − Sin ( a ) 0 R-1x =   0 Sin ( a ) Cos( a ) 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: 1 0 0 0   0 − Sin (φ ) − Cos(φ ) 0 C=   0 Cos(φ ) − Sin (φ ) 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 0 0   0 1 0 0 D=  0 0 1 0   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 Z0 O' φ 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(φ ) 0   Cos(θ ) − Sin (θ ). Sin (φ ) − Sin (θ ). Cos(φ ) 0 T=   0 Cos(φ ) − Sin (φ ) 0    0 0 R 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 X0 Maøn hình 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 P6 P7 P5 P8 Y P1 P2 P4 P3 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 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 Z Vector x y z P4 1 0 0 0 2 0 1 0 P9 P5 P3 3 0 1 1 4 0 0.5 1.5 P10 5 0 0 1 P8 6 1 0 0 Y P1 7 1 1 0 P2 8 1 1 1 P6 9 1 0.5 1.5 P7 10 1 0 1 X Có nhi u cách ñ lưu gi mô hình Hình 5.1 WireFrame. ñây, chúng ta dùng c u trúc record d a trên 2 m ng: Const MaxDinh = 50; { S ñ nh t i ña} MaxCanh = 100; {S c nh t i ña} Type 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ư Danh sách các c nh sau: 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 canh[1, 1]:=1; {S ñ nh th nh t c a 9 9 10 c nh s 1} 10 10 6 canh[1, 2]:=2; {S ñ nh th hai c a 11 1 6 c nh s 1} 12 2 7 ... 13 3 8 end; 14 4 9 5.2. V MÔ HÌNH WIREFRAME V I CÁC 15 5 10 PHÉP CHI U 16 2 5 17 1 3 ð 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) (c) Hình 5.2 • 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π -π/2 ≤ v ≤ π/2 • M t 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  x = R. cos( ) u P1(u): ñư ng tròn  u,v ∈ [0,1]  y = R. sin(u) • 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 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
  • 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) (3’) r = 0,1,...,L 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: L! BkL(t) = (1-t)L-k.tk v iL≥k k !( L − 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 P(u,v) = ∑ ∑ Pi,k.BiM(u).BkL(v) i =0 i =0 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 (tích vô hư ng) hay P(t) = BL(t).PT (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 0   −3 3 0 0 Bez =  3  3 −6 3 0    −1 3 −3 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 L! trong ñó: BkL(0) = (1-0)L-k.0k ∀k ≠ 0 và k ≠ L k !( L − k )! L! = .0 = 0 k !( L − k )! Vì v y, P(0) = P0.B0L(0) + PL.BLL(0) = P0 + 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 Khai tri n (*) ta có: ∑ Pk.N.BkL(t) + ∑ tr.BkL(t) k=0 k=0 L L = ∑ Pk.N.BkL(t) + tr. ∑ BkL(t) (**) k=0 k=0 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 L Do P(t) là t h p l i c a các ñi m ki m soát ∀t ∈ [0,1] và ∑ 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 t t c các giá tr t ∈ [0,1]. Do ñó, hi u ch nh b t kỳ m t ñi m ki m soát nào cũng s 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 coï mang[0,1] giaï   3 3 g(t) = b(t) = - (t - )2 coï mang[1,2] giaï  4 2 1 c(t) = (3 - t)2 coï mang[2,3] giaï   2 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 B- Spline, 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   tk + m − t  Nk,m(t) =   .Nk,m-1(t) +   .Nk+1,m-1(t) v i k=0..L  t k + m − 1 − tk   tk + m − tk + 1  1 tk π t ≤ tk + 1 ðây là m t công th c ñ quy v i Nk,L(t) =   0 ngæåüc laûi (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 P(u,v) = ∑ ∑ Pi,k.Ni,m(u).Nk,m(v) i =0 k=0 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 nh ng giá tr u khác nhau thì các ñi m ki m soát cũng n m 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 L P(u,v) = ∑ ∑ Pi,k.BiM(u).BkL(v) (**) i =0 k=0 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 biên. Có th th y ñư c ñi u này khi thay u=0 vào trong phương trình (*) 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 P(u,v) = ∑ ∑ Pi,k.Ni,m(u).Nk,m(v) i =0 k=0 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 ðƯ 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à 3 M t4 chi u sáng.Trong chương M t3 này chúng ta s t p trung 5 nghiên c u v n ñ kh m t khu t. 4 Ví d : Mô t v t th như trong M t2 hình 7.1. 6 - 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 end; ñư c tư ng minh} 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. ñây ta dùng m ng ñ ng} Color:RGBColor; {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 g n sau, như th thì các m t g n s không b che khu t b i các m t xa, mà ch có các m t xa m i có th b các m t g n che khu t, do các m t 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 z- buffer ñ 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; {To ñ giao ñi m} z:real; {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 1 ñơn v thì rõ ràng to ñ giao ñi m s là (D[dem].y1+1,D[dem].xGiao+D[dem].xStep) và ñ sâu s là (D[dem].zGiao+D[dem].zStep)} end else begin D[dem].xStep:=0; D[dem].zStep:=0; end; Dem:=Dem+1; end; end; Procedure TaoDanhSachGiaoDiem; {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 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 Ánh sáng t i x Á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 Vector pháp tuy n c a m t Ánh sáng ph n Ánh sáng t i x Ánh sáng ph n x Ánh sáng t i (a) (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: a.n Cos (θ ) = (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 (x0- plx, 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 16200 m t Hình 8.3 ð 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; {Pháp vector t i 1 ñ nh c a ña giác} x,y:Integer; {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; {To ñ giao ñi m} NGiao:Vector3D; {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; CMLD:array of integer; {S m t có liên k t v i ñ nh th i} begin cx:=Width div 2;cy:=Height div 2; Setlength(DinhLinkMat,Obj.Sodinh); Setlength(CMLD,Obj.Sodinh); For i:=0 to obj.Sodinh-1 do CMLD[i]:=0; {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 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);
  • 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 then minx:=a[i].x; if miny>a[i].y then miny:=a[i].y; if maxx<a[i].x then maxx:=a[i].x; if maxy<a[i].x then maxy:=a[i].y; end; ThietLapDoHoa; vedagiac(a,n); Tomau(a,n); readln; closegraph; end. 2. 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].x- a[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 Stack:DanhSach); { Nhap vao dau danh sach } Var p:DanhSach; Begin new(p); p^.Data:=a; p^.next:=nil; p^.next:=Stack; 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) then PUSHStack(C,Stack); C.x:=B.x-1; C.y:=B.y; if KiemTra(C.x,C.y,a) and (GetPixel(C.x,C.y)<>color) then PUSHStack(C,Stack); C.x:=B.x; C.y:=B.y+1; if KiemTra(C.x,C.y,a) and (GetPixel(C.x,C.y)<>color) then PUSHStack(C,Stack); C.x:=B.x; C.y:=B.y-1; if KiemTra(C.x,C.y,a) and (GetPixel(C.x,C.y)<>color) then PUSHStack(C,Stack); End; End; End; BEGIN KhoiTaoStack; Nhapdagiac(n,a); Gd:=Detect; InitGraph(Gd,Gm,'D: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 Left; if P.x>Duoi.x then s:=s OR Right; if P.y<Tren.y then s:=s OR Above; if P.y>Duoi.y then s:=s OR Below; Ma:=s; end; Procedure Swap(Var A,B:ToaDo2D); var t:ToaDo2D; Begin t:=a; a:=b; b:=t; End; Procedure Clipping(A,B,Tren,Duoi:ToaDo2D); Var stop,draw:Boolean; m:Real; Begin stop:=False; draw:=False; While not stop do Begin 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 Left; if P.x>Duoi.x then s:=s OR Right; if P.y<Tren.y then s:=s OR Above; if P.y>Duoi.y then s:=s OR Below; Ma:=s; end; PROCEDURE XuLyATrongBNgoai(A,B:ToaDo2D); Var C,D,M:ToaDo2D; begin c:=a;d:=b; While abs(C.x-D.x)+abs(C.y-D.y)>2 do begin M.x:=round((C.x+D.x)/2); M.y:=round((C.y+D.y)/2); if ma(M)<>0 then D:=M else C:=M; end; line(A.x,A.y,C.x,C.y); end; PROCEDURE Clipping(A,B,Tren,Duoi:ToaDo2D); Var C,D,M:ToaDo2D; Begin if (ma(a)=0) and (ma(b)=0) then line(a.x,a.y,b.x,b.y); if (ma(a)=0) and (ma(b)<>0) then XulyATrongBNgoai(A,B); if (ma(a)<>0) and (ma(b)=0) then XulyATrongBNgoai(B,A); if (ma(A)<>0) and (ma(B)<>0) and ((ma(A) and ma(B))=0) then begin C:=A; D:=B; M.x:=(C.x+D.x)div 2; M.y:=(C.y+D.y)div 2; while (ma(M)<>0)and(abs(C.x-D.x)+abs(C.y-D.y)>2) do begin if (ma(C) and ma(M))<>0 then C:=M else D:=M; M.x:=(C.x+D.x)div 2; M.y:=(C.y+D.y)div 2; end; if ma(M)=0 then begin XulyATrongBNgoai(M,A); XulyATrongBNgoai(M,B); end; 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) + c2*cos(u)*sin(v) + d*v ; END ; FUNCTION fz(u,v:real): real; BEGIN fz := a2*sin(u) +b2*sin(v) + d*u*u - d*v*v ; END ; PROCEDURE ho_duong_cong_u ; VAR P :ToaDo3D; BEGIN u := uMin; {Mat cat U ban dau} WHILE u<=uMax DO BEGIN v :=vMin; {Mat cat V ban dau} P.x :=fx(u,v); P.y :=fy(u,v); P.z :=fz(u,v); DiDen(P); {Move to point (x,y,z) ban dau} WHILE v <= vMax DO {Thay doi mat cat V} 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