You are on page 1of 185

LӠI NÓI ĈҪU

Ĉӗ hoҥ máy tính (Computer Graphics) là mӝt lƭnh vӵc lý thú và có nhiӅu ӭng dөng
trong thӵc tӃ, nó góp phҫn làm cho giao tiӃp giӳa con ngѭӡi và máy tính trӣ nên thân
thiӋn hѫn. Giao diӋn kiӇu văn bҧn (text) ÿã ÿѭӧc thay thӃ hoàn toàn bҵng giao diӋn ÿӗ
hoҥ. Tuy nhiên, viӋc dҥy và hӑc kӻ thuұt ÿӗ hӑa thì không ÿѫn giҧn do chӫ ÿӅ này có
nhiӅu phӭc tҥp. Kӻ thuұt ÿӗ hӑa liên quan ÿӃn tin hӑc và toán hӑc bӣi vì hҫu hӃt các giҧi
thuұt vӁ, tô cùng các phép biӃn hình ÿӅu ÿѭӧc xây dӵng dӵa trên nӅn tҧng cӫa hình hӑc
không gian hai chiӅu và ba chiӅu. HiӋn nay, Kӻ thuұt ÿӗ hӑa là mӝt môn hӑc ÿѭӧc giҧng
dҥy cho sinh viên chuyên ngành Công NghӋ Thông Tin.
Trong cuӕn giáo trình này, tôi muӕn mang lҥi cho bҥn ÿӑc các cѫ sӣ lý thuyӃt vӅ ÿӗ
hoҥ máy tính tӯ ÿѫn giҧn nhҩt nhѭ các thuұt toán vӁ ÿѭӡng thҷng, ÿѭӡng tròn, ÿa giác, ký
tӵ... TiӃp ÿӃn các kӻ thuұt xén tӍa, các phép biӃn ÿәi ÿӗ hoҥ trong không gian 2D và
3D...Chúng ta lҫn lѭӧt làm quen vӟi thӃ giӟi màu sҳc thông qua các hӋ màu: RGB,
CMYK, HSV.... Phӭc tҥp hѫn nӳa là các phép chiӃu, các phѭѫng pháp xây dӵng ÿѭӡng
cong và mһt cong cho ÿӕi tѭӧng. Cuӕi chúng ta tìm hiӇu vӅ ánh sáng và hình hӑc fractal.
Giáo trình gӗm chín chѭѫng, trong ÿó chѭѫng mӝt giúp bҥn ÿӑc có cái nhìn tәng
quan vӅ kӻ thuұt ÿӗ hoҥ tӯ trѭӟc ÿӃn giӡ cùng ÿӏnh hѭӟng tѭѫng lai cho lƭnh vӵc này. Các
chѭѫng tiӃp theo, mӛi chѭѫng sӁ là mӝt vҩn ÿӅ tӯ ÿѫn giҧn ÿӃn phӭc tҥp vӅ cѫ sӣ nӅn tҧng
cho ngành kӻ thuұt ÿӗ hoҥ. Cuӕi mӛi chѭѫng ÿӅu có phҫn bài tұp ÿӇ kiӇm tra lҥi kiӃn thӭc
vӯa ÿӑc ÿѭӧc. Bài tұp gӗm hai dҥng: dҥng tính toán và dҥng lұp trình, ÿӕi vӟi dҥng lұp
trình bҥn có thӇ viӃt bҵng C/C++ hay BC thұm chí bҵng VB ÿӅu ÿѭӧc. Cuӕi cùng là phҫn
phө lөc gӗm các hѭӟng dүn làm bài tұp lұp trình, ngôn ngӳ hay dùng ӣ ÿây là C/C++ hay
BC.
Bӕ cөc rõ ràng, hình ҧnh phong phú, ÿa dҥng. Tôi hy vӑng rҵng giáo trình là mӝt bӝ
tham khҧo ÿҫy ÿӫ các thông tin hӳu ích và có tính thӵc tiӉn cao cho môn kӻ thuұt ÿӗ hoҥ.
Trong quá trình biên soҥn mһc dù ÿã cӕ gҳng hӃt sӭc nhѭng vүn không tránh khӓi
nhӳng sai sót, rҩt mong nhұn ÿѭӧc sӵ ÿóng góp chân thành tӯ quý bҥn ÿӑc.
Xin chân thành cám ѫn.

Tác giҧ
Mөc lөc

MӨC LӨC
LӠI NÓI ĈҪU........................................................................................................................ 1
MӨC LӨC .............................................................................................................................. 2
CHѬѪNG 1: TӘNG QUAN Vӄ KӺ THUҰT ĈӖ HOҤ ...................................................... 7
1.1. CÁC KHÁI NIӊM TӘNG QUAN CӪA KӺ THUҰT ĈӖ HOҤ MÁY TÍNH
(COMPUTER GRAPHICS)......................................................................................................... 7
1.1.1. L ӏch sӱ phát triӇn ................................................................................................. 7
1.1.2. Kӻ thuұt ÿӗ hӑa vi tính. ...................................................................................... 8
1.2. CÁC KӺ THUҰT ĈӖ HOҤ ....................................................................................... 8
1.2.1. Kӻ thuұt ÿӗ hoҥ ÿiӇm (Sample based-Graphics) ................................................. 8
1.2.2. Kӻ thuұt ÿӗ hoҥ vector.......................................................................................... 9
1.2.3. Phân loҥi cӫa ÿӗ hoҥ máy tính........................................................................... 10
1.2.4. Các ӭng dөng tiêu biӇu cӫa kӻ thuұt ÿӗ hӑa....................................................... 11
1.2.5. Các chuҭn giao diӋn cӫa hӋ ÿӗ hoҥ..................................................................... 13
1.3. PHҪN CӬNG ĈӖ HOҤ (GRAPHICS HARDWARE)............................................ 13
1.3.1. Các thành phҫn phҫn cӭng cӫa hӋ ÿӗ hoҥ tѭѫng tác........................................... 13
1.3.2. Máy in................................................................................................................. 14
1.3.3. Màn hình CRT .................................................................................................... 14
1.3.4. Màn hình tinh thӇ lӓng (Liquid Crystal Display –– LCD) ................................... 16
Tóm tҳt chѭѫng: ............................................................................................................... 17
Bài tұp:.............................................................................................................................. 18
CHѬѪNG 2: CÁC GIҦI THUҰT SINH THӴC THӆ CѪ SӢ............................................ 19
2.1. CÁC Hӊ THӔNG TOҤ ĈӜ TRONG ĈӖ HOҤ....................................................... 19
2.1.1. HӋ toҥ ÿӝ thӵc (WCS –– World Coordinate System)........................................... 19
2.1.2. HӋ toҥ ÿӝ thiӃt bӏ (DCS –– Device Coordinate System) ...................................... 19
2.1.3. toҥ ÿӝ thiӃt bӏ chuҭn (NDCS –– Normalized Device Coordinate System)........... 20
2.2. ĈIӆM VÀ ĈOҤN THҶNG....................................................................................... 20
2.2.1. ĈiӇm ................................................................................................................... 20
2.2.2. Ĉoҥn thҷng.......................................................................................................... 20
2.3. CÁC GIҦI THUҰT XÂY DӴNG THӴC THӆ CѪ SӢ ........................................... 21
2.3.1. Giҧi thuұt vӁ ÿoҥn thҷng thông thѭӡng .............................................................. 21
2.3.2. Giҧi thuұt Bresenham ......................................................................................... 22
2.3.3. Giҧi thuұt trung ÿiӇm-Midpoint.......................................................................... 23
2.3.3. Giҧi thuұt sinh ÿѭӡng tròn (Scan Converting Circles)(Bresenham)................... 25
2.3.5. Giҧi thuұt sinh ÿѭӡng tròn Midpoint .................................................................. 28
2.3.6. Giҧi thuұt sinh ÿѭӡng ellipse ............................................................................. 30
2.3.7. Giҧi thuұt sinh ký tӵ .......................................................................................... 33
2.3.8. Giҧi thuұt sinh ÿa giác (Polygon) ....................................................................... 34
2
Mөc lөc
Tóm tҳt chѭѫng: ............................................................................................................... 39
Bài tұp:.............................................................................................................................. 39
CHѬѪNG 3: CÁC PHÉP BIӂN ĈӘI ĈӖ HOҤ.................................................................. 41
3.1. CÁC PHÉP BIӂN ĈӘI HÌNH HӐC HAI CHIӄU .................................................... 41
3.1.1. Phép biӃn ÿәi Affine (Affine Transformations) ................................................. 41
3.1.2. Các phép biӃn ÿәi ÿӕi tѭӧng............................................................................... 41
3.2. TӐA ĈӜ ĈӖNG NHҨT VÀ CÁC PHÉP BIӂN ĈӘI ............................................. 45
3.2.1. Toҥ ÿӝ ÿӗng nhҩt ................................................................................................ 45
3.2.2. Phép biӃn ÿәi vӟi toҥ ÿӝ ÿӗng nhҩt .................................................................... 46
3.2.3. Cài ÿһt c/c++ cho phép quay tam giác quanh 1 ÿiӇm (xq,yq): ........................... 47
3.3. CÁC PHÉP BIӂN ĈӘI HÌNH HӐC BA CHIӄU...................................................... 48
3.3.1.BiӇu diӉn ÿiӇm trong không gian 3 chiӅu............................................................ 48
3.3.2. Phép tӏnh tiӃn ...................................................................................................... 48
3.3.3. Phép tӍ lӋ ............................................................................................................. 48
3.3.4. Phép biӃn dҥng.................................................................................................... 49
3.3.5. Phép lҩy ÿӕi xӭng ............................................................................................... 49
3.3.6. Phép quay 3 chiӅu............................................................................................... 49
3.3.7. Cài ÿһt bҵng c/c++ nhѭ sau: ............................................................................... 53
Tóm tҳt: ............................................................................................................................ 54
Bài tұp:.............................................................................................................................. 54
CHѬѪNG 4: CÁC GIҦI THUҰT ĈӖ HOҤ CѪ SӢ .......................................................... 57
4.1. MÔ HÌNH CHUYӆN ĈӘI GIӲA BA Hӊ THӔNG TOҤ ĈӜ ................................. 57
4.1.1. Mô hình chuyӇn ÿәi............................................................................................ 57
4.1.2. Phép ánh xҥ tӯ cӱa sә vào khung nhìn ............................................................... 57
4.2. CÁC GIҦI THUҰT XÉN TIҦ (CLIPPING) ............................................................ 59
4.2.1. Khái niӋm ........................................................................................................... 59
4.2.2. Clipping ÿiӇm ..................................................................................................... 59
4.2.3. Xén tӍa ÿoҥn thҷng.............................................................................................. 59
4.2.4. Giҧi thuұt xén tӍa ÿa giác (Sutherland Hodgman) .............................................. 66
Tóm tҳt chѭѫng: ............................................................................................................... 70
Bài tұp:.............................................................................................................................. 70
CHѬѪNG 5: PHÉP CHIӂU ––PROJECTION...................................................................... 71
5.1. KHÁI NIӊM CHUNG............................................................................................... 71
5.1.1.Nguyên lý vӅ 3D (three-Dimension) ................................................................... 71
5.1.2. Ĉһc ÿiӇm cӫa kӻ thuұt ÿӗ hoҥ 3D....................................................................... 71
5.1.3.Các phѭѫng pháp hiӇn thӏ 3D .............................................................................. 71
5.2.PHÉP CHIӂU ............................................................................................................. 72
5.3. PHÉP CHIӂU SONG SONG (Parallel Projections )................................................. 74

3
Mөc lөc
5.3.1.Phép chiӃu trӵc giao (Orthographic projection) .................................................. 74
5.3.2. Phép chiӃu trөc luӧng (Axonometric) ................................................................ 75
5.3.3. Phép chiӃu xiên - Oblique .................................................................................. 78
5.4. PHÉP CHIӂU PHӔI CҦNH (Perspective Projection) .............................................. 79
5.4.1. Phép chiӃu phӕi cҧnh mӝt tâm chiӃu .................................................................. 80
5.4.2. Phép chiӃu phӕi cҧnh hai tâm chiӃu ................................................................... 81
5.4.3. Phép chiӃu phӕi cҧnh ba tâm chiӃu .................................................................... 83
Tóm tҳt chѭѫng: ............................................................................................................... 83
Bài tұp:.............................................................................................................................. 83
CHѬѪNG 6: MÀU SҲC TRONG ĈӖ HOҤ ...................................................................... 85
6.1. ÁNH SÁNG VÀ MÀU SҲC (light and color).......................................................... 85
6.1.1. Quan niӋm vӅ ánh sáng....................................................................................... 85
6.1.2. YӃu tӕ vұt lý ....................................................................................................... 85
6.1.3. Cҧm nhұn màu sҳc cӫa con ngѭӡi (Physiology - Sinh lý - Human Vision) ....... 87
6.1.4. Các ÿһc trѭng cѫ bҧn cӫa ánh sáng..................................................................... 89
6.2. ÁNH SÁNG ĈѪN SҲC ............................................................................................ 89
6.2.1. Cѭӡng ÿӝ sáng và cách tính................................................................................ 90
6.2.2. Phép hiӋu chӍnh gama......................................................................................... 90
6.2.3. Xҩp xӍ bán tông - halftone .................................................................................. 91
6.2.4. Ma trұn Dither và phép lҩy xҩp xӍ bán tông ....................................................... 93
6.3. CÁC Hӊ MÀU TRONG MÀN HÌNH ĈӖ HӐA...................................................... 93
6.3.1. Mô hình màu RGB (Red, Green, Blue - ÿӓ, lөc, lam)........................................ 94
6.3.2. Mô hình màu CMY (Cyan, Magenta, Yellow - xanh tím, Ĉӓ tѭѫi, vàng) ......... 94
6.3.3. Mô hình màu YIQ.............................................................................................. 95
3.4. Mô hình màu HSV (Hue, Saturation,Value) - Mӻ thuұt........................................ 96
6.3.5. BiӇu ÿӗ màu CIE (1931 –– Commission Internationale de l’’Eclairage) .............. 97
6.4. CHUYӆN ĈӘI GIӲA CÁC Hӊ MÀU ................................................................... 100
6.4.1. ChuyӇn ÿәi HSV - RGB ................................................................................... 100
6.4.2. ChuyӇn ÿәi RGB sang XYZ............................................................................. 101
Tóm tҳt: .......................................................................................................................... 102
Bài tұp:............................................................................................................................ 102
CHѬѪNG 7: ĈѬӠNG CONG VÀ MҺT CONG TRONG 3D ......................................... 104
7.1. ĈѬӠNG CONG - CURVE ..................................................................................... 104
7.1.1. ĈiӇm biӇu diӉn ÿѭӡng cong (curve represents points ) .................................. 104
7.1.2. Ĉѭӡng cong ÿa thӭc bұc ba tham biӃn ............................................................. 104
7.1.3. Ĉѭӡng cong Hermite ........................................................................................ 105
7.1.4. Ĉѭӡng cong Bezier........................................................................................... 106
7.1.5. Ĉѭӡng cong B-spline........................................................................................ 108

4
Mөc lөc
7.2. MÔ HÌNH Bӄ MҺT (Surface) VÀ CÁC PHѬѪNG PHÁP XÂY DӴNG ............ 114
7.2.1. Các khái niӋm cѫ bҧn ....................................................................................... 114
7.2.2. BiӇu diӉn mҧnh tӭ giác ..................................................................................... 115
7.2.3. Mô hình hoá các mһt cong (Surface Patches)................................................... 117
7.2.4. Mһt tӯ các ÿѭӡng cong ..................................................................................... 120
Tóm tҳt: .......................................................................................................................... 125
Bài tұp:............................................................................................................................ 125
CHѬѪNG 8: ÁNH SÁNG ................................................................................................. 127
8.1. GIӞI THIӊU............................................................................................................ 127
8.1.1. Mөc tiêu chính trong ÿӗ hӑa máy tính.............................................................. 127
8.1.2. Các giҧi pháp trong ÿӗ hӑa máy tính ................................................................ 127
8.2. CÁC KӺ THUҰT CHIӂU SÁNG TRONG ĈӖ HӐA MÁY TÍNH....................... 129
8.2.1. Ĉánh giá vӅ cѭӡng ÿӝ ánh sáng........................................................................ 129
8.2.2. Cѭӡng ÿӝ ánh sáng ........................................................................................... 130
8.2.3. Nhӳng thuӝc tính bao quanh cӫa vұt chҩt ........................................................ 131
8.2.4. Thuӝc tính khuӃch tán cӫa vұt chҩt .................................................................. 132
8.2.5. Sӵ tѭѫng tác bӅ mһt/ánh sáng........................................................................... 133
8.2.6. Sӵ khúc xҥ và sӵ truyӅn sáng ........................................................................... 133
8.3. CÁC CÔNG NGHӊ................................................................................................. 134
8.3.1. Raytracing......................................................................................................... 134
8.3.2. Radiosity........................................................................................................... 138
8.3.3. Photon Mapping ............................................................................................... 143
8.4. SӴ SO SÁNH GIӲA CÁC KӺ THUҰT (COMPARISON OF TECHNIQUES) .. 147
8.4.1. Raytracing......................................................................................................... 148
8.4.2. Radiosity........................................................................................................... 148
8.4.3. Photon mapping................................................................................................ 148
Tóm tҳt……………………………………………………………………………………………………………………………………………………………….148
CHѬѪNG 9: HÌNH HӐC FRACTAL ............................................................................... 150
9.1. SӴ RA ĈӠI VÀ CÁC ӬNG DӨNG CӪA HÌNH HӐC PHÂN HÌNH .................. 150
9.1.1. Sӵ ra ÿӡi cӫa lý thuyӃt hình hӑc phân hình ...................................................... 150
9.1.2. Các ӭng dөng tәng quát cӫa hình hӑc phân hình.............................................. 151
9.2. MӜT SӔ KӺ THUҰT CÀI ĈҺT HÌNH HӐC PHÂN HÌNH................................. 151
9.2.1 Hӑ ÿѭӡng VONKOCK ...................................................................................... 151
9.2.2. Ĉѭӡng SIERPINSKI ........................................................................................ 154
9.3. CÂY FRACTAL...................................................................................................... 155
9.3.1. CÁC CÂY THӴC Tӂ: ..................................................................................... 155
9.3.2. BIӆN DIӈN TOÁN HӐC CӪA CÂY:............................................................. 156
9.4. TҰP MANDELBROT............................................................................................. 159

5
Mөc lөc
9.4.1. Ĉһt vҩn ÿӅ......................................................................................................... 159
9.4.2. CÔNG THӬC TOÁN HӐC ............................................................................. 159
9.4.3. THUҰT TOÁN THӆ HIӊN TҰP MANDELBROT ........................................ 160
9.5. TҰP JULIA.............................................................................................................. 161
9.5.1. Ĉһt vҩn ÿӅ:........................................................................................................ 161
9.5.2. Công thӭc toán hӑc:.......................................................................................... 161
9.5.3. Thuұt toán thӇ hiӋn tұp Julia............................................................................. 161
9.6. HӐ CÁC ĈѬӠNG CONG PHOENIX.................................................................... 163
Bài tұp............................................................................................................................. 165
PHӨ LӨC ........................................................................................................................... 166
1. Yêu cҫu ....................................................................................................................... 166
2. Khӣi tҥo và ÿóng chӃ ÿӝ ÿӗ hoҥ ................................................................................. 166
3. Các hàm cѫ bҧn .......................................................................................................... 167
3.1. Bҧng màu cӫa màn hình ÿӗ hoҥ........................................................................... 167
3.2. ĈiӇm .................................................................................................................... 168
3.3. Ĉѭӡng .................................................................................................................. 168
3.4. Hình chӳ nhұt ...................................................................................................... 168
3.5. Hình tròn.............................................................................................................. 168
3.6. Ĉa giác................................................................................................................. 169
3.7. Văn bҧn................................................................................................................ 169
3.8. Cӱa sә (viewport) ................................................................................................ 170
3.9. Tҥo hình ҧnh chuyӇn ÿӝng................................................................................... 170
Các code chѭѫng trình ví dө cho bài tұp lұp trình.......................................................... 172
Bài 1: quay ÿӕi tѭӧng ................................................................................................. 172
Bài 2: xén tӍa............................................................................................................... 179
Bài 3: Phép chiӃu........................................................................................................ 180
TÀI LIӊU THAM KHҦO .................................................................................................. 185

6
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ

CHѬѪNG 1: TӘNG QUAN Vӄ KӺ THUҰT ĈӖ HOҤ

1.1. CÁC KHÁI NIӊM TӘNG QUAN CӪA KӺ THUҰT ĈӖ HOҤ MÁY
TÍNH (COMPUTER GRAPHICS)
1.1.1. L ӏch sӱ phát triӇn
Lӏch sӱ cӫa ÿӗ hӑa máy tính là vào thұp niên 1960 ÿѭӧc ÿánh dҩu bӣi dӵ án SketchPad
ÿѭӧc phát triӇn tҥi Hӑc viӋn Công nghӋ Massachusetts (MIT) bӣi Ivan Sutherland. Các
thành tӵu thu ÿѭӧc ÿã ÿѭӧc báo cáo tҥi hӝi nghӏ Fall Joint Computer và ÿây cNJng chính là
sӵ kiӋn lҫn ÿҫu tiên ngѭӡi ta có thӇ tҥo mӟi, hiӇn thӏ và thay ÿәi ÿѭӧc dӳ liӋu hình ҧnh
trӵc tiӃp trên màn hình máy tính trong thӡi gian thӵc. HӋ thӕng Sketchpad này ÿѭӧc dùng
ÿӇ thiӃt kӃ hӋ thӕng mҥch ÿiӋn và bao gӗm nhӳng thành phҫn sau:
ƒ CRT màn hình
ƒ Bút sáng và mӝt bàn phím bao gӗm các phím chӭc năng
ƒ Máy tính chӭa chѭѫng trình xӱ lý các thông tin
Vӟi hӋ thӕng này, ngѭӡi sӱ dөng có thӇ vӁ trӵc tiӃp các sѫ ÿӗ mҥch ÿiӋn lên màn
hình thông qua bút sáng, chѭѫng trình sӁ phân tích và tính toán các thông sӕ cҫn thiӃt cӫa
mҥch ÿiӋn do ngѭӡi dùng vӁ nên.
CNJng trong năm 1960 này, William Fetter nhà khoa hӑc ngѭӡi Mӻ. Ô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ӫa Mӻ. Ông dӵa trên
hình ҧnh ba chiӅu cӫa mô hình ngѭӡi phi công trong buӗng lái cӫa máy bay ÿӇ xây dӵng
nên mӝt mô hình tӕi ѭu cho buӗng lái máy bay. Phѭѫng pháp này cho phép các nhà thiӃt
kӃ quan sát mӝt cách trӵc quan vӏ trí cӫa ngѭӡi lái trong khoang. Ông ÿһt tên cho phѭѫng
pháp này là ÿӗ hoҥ máy tính (Computer Graphics) .
Màn hình là thiӃt bӏ thông dөng nhҩt trong hӋ ÿӗ hoҥ, các thao tác cӫa hҫu hӃt các
màn hình ÿӅu dӵa trên thiӃt kӃ ӕng tia âm cӵc CRT (Cathode ray tube).
Kӻ thuұt ÿӗ hӑa ÿѭӧc liên tөc hoàn thiӋn vào thұp niên 1970 vӟi sӵ xuҩt hiӋn cӫa
các chuҭn ÿӗ hӑa làm tăng cѭӡng khҧ năng giao tiӃp và tái sӱ dөng cӫa phҫn mӅm cNJng
nhѭ các thѭ viӋn ÿӗ hӑa.
Sӵ phát triӇn vѭӧt bұc cӫa công nghӋ vi ÿiӋn tӱ và phҫn cӭng máy tính vào thұp
niên 1980 làm xuҩt hiӋn hàng loҥt các vӍ mҥch hӛ trӧ cho viӋc truy xuҩt ÿӗ hӑa ÿi cùng
vӟi sӵ giҧm giá ÿáng kӇ cӫa máy tính cá nhân làm ÿӗ hӑa ngày càng ÿi sâu vào cuӝc sӕng
thӵc tӃ.
Nhӳng năm 1980 có raster graphics (ÿӗ hoҥ ÿiӇm). Bҳt ÿҫu chuҭn ÿӗ hoҥ ví dө nhѭ:
GKS(Graphics Kernel System): European effort (kӃt quҧ cӫa châu âu), Becomes ISO 2D
standard.
Thұp niên 90 phát triӇn ÿһc biӋt vӅ phҫn cӭng, thiӃt bӏ hình hӑc ÿӗ hoҥ Silicon. Xuҩt
hiӋn các chuҭn công nghiӋp: PHIGS (Programmers Hierarchical Interactive Graphics
Standard) xác ÿӏnh các phѭѫng pháp chuҭn cho các mô hình thӡi gian thӵc và lұp trình
hѭӟng ÿӕi tѭӧng. Giao diӋn ngѭӡi máy Human-Computer Interface (HCI).

7
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ
Ngày nay xuҩt hiӋn ҧnh hiӋn thӵc, cҥc ÿӗ hoҥ cho máy tính (Graphics cards for
PCs), game boxes và game players. Công nghiӋp phim ҧnh nhӡ vào ÿӗ hoҥ máy tính
(Computer graphics becoming routine in movie industry), Maya (thӃ giӟi vұt chҩt tri giác
ÿѭӧc)…….
1.1.2. Kӻ thuұt ÿӗ hӑa vi tính.
Ĉӗ hӑa máy tính là mӝt lƭnh vӵc cӫa khoa hӑc máy tính nghiên cӭu vӅ cѫ sӣ toán hӑc, các
thuұt toán cNJng nhѭ các kӻ thuұt ÿӇ cho phép tҥo, hiӇn thӏ và ÿiӅu khiӇn hình ҧnh trên màn
hình máy tính. Ĉӗ hӑa máy tính có liên quan ít nhiӅu ÿӃn mӝt sӕ lƭnh vӵc nhѭ ÿҥi sӕ, hình
hӑc giҧi tích, hình hӑc hӑa hình, quang hӑc,... và kӻ thuұt máy tính, ÿһc biӋt là chӃ tҥo
phҫn cӭng (các loҥi màn hình, các thiӃt bӏ xuҩt, nhұp, các vӍ mҥch ÿӗ hӑa...).
Theo nghƭa rӝng hѫn, ÿӗ hӑa máy tính là phѭѫng pháp và công nghӋ dùng trong viӋc
chuyӇn ÿәi qua lҥi giӳa dӳ liӋu và hình ҧnh trên màn hình bҵng máy tính. Ĉӗ hӑa máy
tính hay kӻ thuұt ÿӗ hӑa máy tính còn ÿѭӧc hiӇu dѭӟi dҥng phѭѫng pháp và kӻ thuұt tҥo
hình ҧnh tӯ các mô hình toán hӑc mô tҧ các ÿӕi tѭӧng hay dӳ liӋu lҩy ÿѭӧc tӯ các ÿӕi
tѭӧng trong thӵc tӃ.
1.2. CÁC KӺ THUҰT ĈӖ HOҤ
1.2.1. Kӻ thuұt ÿӗ hoҥ ÿiӇm (Sample based-Graphics)
ƒ Các mô hình, hình ҧnh cӫa các ÿӕi tѭӧng ÿѭӧc hiӇn thӏ thông qua tӯng pixel (tӯng
mүu rӡi rҥc)
ƒ Ĉһc ÿiӇm:Có thӇ thay ÿәi thuӝc tính cӫa tӯng ÿiӇm ҧnh rӡi rҥc
o Xoá ÿi tӯng pixel cӫa mô hình và hình ҧnh các ÿӕi tѭӧng.
o Các mô hình hình ҧnh ÿѭӧc hiӇn thӏ nhѭ mӝt lѭӟi ÿiӇm (grid) các pixel rӡi
rҥc,
o Tӯng pixel ÿӅu có vӏ trí xác ÿӏnh, ÿѭӧc hiӇn thӏ vӟi mӝt giá trӏ rӡi rҥc (sӕ
nguyên) các thông sӕ hiӇn thӏ (màu sҳc hoһc ÿӝ sáng)
ƒ Tұp hӧp tҩt cҧ các pixel cӫa grid cho chúng ta mô hình, hình ҧnh ÿӕi tѭӧng mà
chúng ta muӕn hiӇn thӏ.

Hình 1.1 Ҧnh ÿӗ hoҥ ÿiӇm


Phѭѫng pháp ÿӇ tҥo ra các pixel
ƒ Phѭѫng pháp dùng phҫn mӅm ÿӇ vӁ trӵc tiӃp tӯng pixel mӝt.
ƒ Dӵa trên các lý thuyӃt mô phӓng (lý thuyӃt Fractal, v.v) ÿӇ xây dӵng nên hình ҧnh
mô phӓng cӫa sӵ vұt.
8
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ
ƒ Phѭѫng pháp rӡi rҥc hoá (sӕ hoá) hình ҧnh thӵc cӫa ÿӕi tѭӧng.
ƒ Có thӇ sӱa ÿәi (image editing) hoһc xӱ lý (image processing) mҧng các pixel thu
ÿѭӧc theo nhӳng phѭѫng pháp khác nhau ÿӇ thu ÿѭӧc hình ҧnh ÿһc trѭng cӫa ÿӕi
tѭӧng.
1.2.2. Kӻ thuұt ÿӗ hoҥ vector
Mô hình Các tham
ÿӗ hӑa sӕ tô trát

Tô trát

ThiӃt bӏ ra

Hình 1.2 Mô hình ÿӗ hoҥ vector


ƒ Mô hình hình hӑc (geometrical model) cӫa ÿӕi tѭӧng
ƒ Xác ÿӏnh các thuӝc tính cӫa mô hình hình hӑc này,
ƒ Quá trình tô trát (rendering) ÿӇ hiӇn thӏ tӯng ÿiӇm cӫa mô hình, hình ҧnh thӵc cӫa
ÿӕi tѭӧng
Ví dө vӅ hình ҧnh ÿӗ hoҥ Vector

Wireframe Model Skeletal Model Muscle Model

Skin Model Hair Model Render and Touch up

Hình 1.3 Ví dө vӅ ÿӗ hoҥ vector


Có thӇ ÿӏnh nghƭa ÿӗ hoҥ vector: Ĉӗ hoҥ vector = geometrical model + rendering

9
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ
So sánh giӳa Raster và Vector Graphics
Ĉӗ hoҥ ÿiӇm(Raster Graphics) Ĉӗ hoҥ vector(Vector Graphics)
- Hình ҧnh và mô hình cӫa các vұt thӇ ÿѭӧc - Không thay ÿәi thuӝc tính cӫa tӯng ÿiӇm
biӇu diӉn bӣi tұp hӧp các ÿiӇm cӫa lѭӟi (grid) trӵc tiӃp
- Thay ÿәi thuӝc tính cӫa các pixel => thay - Xӱ lý vӟi tӯng thành phҫn hình hӑc cѫ sӣ
ÿәi tӯng phҫn và tӯng vùng cӫa hình ҧnh. cӫa nó và thӵc hiӋn quá trình tô trát và hiӇn thӏ
- Copy ÿѭӧc các pixel tӯ mӝt hình ҧnh này lҥi.
sang hình ҧnh khác. - Quan sát hình ҧnh và mô hình cӫa hình ҧnh
và sӵ vұt ӣ nhiӅu góc ÿӝ khác nhau bҵng cách
thay ÿәi ÿiӇm nhìn và góc nhìn.
1.2.3. Phân loҥi cӫa ÿӗ hoҥ máy tính
Phân lo̩i theo các lƭnh v͹c cͯa ÿ͛ ho̩ máy tính
CAD/CAM System

KiӃn tҥo ÿӗ
ÿӗ hoҥ minh hoҥ
hoҥ

Ĉӗ hoҥ hoҥt hình và nghӋ thuұt


Kӻ thuұt ÿӗ hoҥ

Xӱ lý ҧnh
Xӱ lý ÿӗ
hoҥ Kӻ thuұt nhұn dҥng

Kӻ thuұt phân tích và tҥo ҧnh

Phân lo̩i theo h͏ to̩ ÿ͡


Kӻ thuұt ÿӗ hoҥ 2 chiӅu
Kӻ thuұt ÿӗ hoҥ
Kӻ thuұt ÿӗ hoҥ 3 chiӅu
ƒ KͿ thu̵t ÿ͛ ho̩ hai chi͉u: là kӻ thuұt ÿӗ hoҥ máy tính sӱ dөng hӋ toҥ ÿӝ hai chiӅu
(hӋ toҥ ÿӝ phҷng), sӱ dөng rҩt nhiӅu trong kӻ thuұt xӱ lý bҧn ÿӗ, ÿӗ thӏ.
ƒ KͿ thu̵t ÿ͛ ho̩ ba chi͉u: là kӻ thuұt ÿӗ hoҥ máy tính sӱ dөng hӋ toҥ ÿӝ ba chiӅu,
ÿòi hӓi rҩt nhiӅu tính toán và phӭc tҥp hѫn nhiӅu so vӟi kӻ thuұt ÿӗ hoҥ hai chiӅu.
Các lƭnh v͹c cͯa ÿ͛ ho̩ máy tính:
Kӻ thuұt xӱ lý ҧnh (Computer Imaging): sau quá trình xӱ lý ҧnh cho ta ҧnh sӕ cӫa
ÿӕi tѭӧng. Trong quá trình xӱ lý ҧnh sӱ dөng rҩt nhiӅu các kӻ thuұt phӭc tҥp: kӻ thuұt
khôi phөc ҧnh, kӻ thuұt làm nәi ҧnh, kӻ thuұt xác ÿӏnh biên ҧnh.
Kӻ thuұt nhұn dҥng (Pattern Recognition): tӯ nhӳng ҧnh mүu có sҹn ta phân loҥi
theo cҩu trúc, hoһc theo các tiêu trí ÿѭӧc xác ÿӏnh tӯ trѭӟc 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

10
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ
này ÿѭӧc lѭu trong mӝt thѭ viӋn và căn cӭ vào thѭ viӋn này ta xây dӵng ÿѭӧc các thuұt
giҧi phân tích và tә hӧp ҧnh.
Kӻ thuұt tәng hӧp ҧnh (Image Synthesis): là lƭnh vӵc xây dӵng mô hình và hình ҧnh
cӫa các vұt thӇ dӵa trên các ÿӕi tѭӧng và mӕi quan hӋ giӳa chúng.
Các hӋ CAD/CAM (Computer Aided Design/Computer Aided Manufacture
System): kӻ thuұt ÿӗ hoҥ tұp hӧp các công cө, các kӻ thuұt trӧ giúp cho thiӃt kӃ các chi
tiӃt và các hӋ thӕng khác nhau: hӋ thӕng cѫ, hӋ thӕng ÿiӋn, hӋ thӕng ÿiӋn tӱ…….
Ĉӗ hoҥ trình bày (Presentation Graphics): gӗm các công cө giúp hiӇn thӏ các sӕ liӋu
thí nghiӋm mӝt cách trӵc quan, dӵa trên các mүu ÿӗ thӏ hoһc các thuұt toán có sҹn.
Ĉӗ hoҥ hoҥt hình và nghӋ thuұt: bao gӗm các công cө giúp cho các hoҥ sƭ, các nhà
thiӃt kӃ phim hoҥt hình chuyên nghiӋp làm các kӻ xҧo hoҥt hình, vӁ tranh... Ví dө: phҫn
mӅm 3D Studio, 3D Animation, 3D Studio Max.
1.2.4. Các ӭng dөng tiêu biӇu cӫa kӻ thuұt ÿӗ hӑa
Ĉӗ hoҥ máy tính là mӝt trong nhӳng lƭnh vӵc lý thú nhҩt và phát triӇn nhanh nhҩt cӫa tin
hӑc. Ngay tӯ khi xuҩt hiӋn nó ÿã có sӭc lôi cuӕn mãnh liӋt, cuӕn hút rҩt nhiӅu ngѭӡi ӣ
nhiӅu lƭnh vӵc khác nhau nhѭ khoa hӑc, nghӋ thuұt, kinh doanh, quҧn lý...Tính hҩp dүn
cӫa nó có thӇ ÿѭӧc minh hoҥ rҩt trӵc quan thông qua các ӭng dөng cӫa nó.
ƒ Xây d͹ng giao di͏n ng˱ͥi dùng (User Interface)
Giao diӋn ÿӗ hoҥ thӵc sӵ là cuӝc cách mҥng mang lҥi sӵ thuұn tiӋn và thoҧi mái cho
ngѭӡi dùng ӭng dөng. Giao diӋn WYSIWYG và WIMP ÿang ÿѭӧc ÿa sӕ ngѭӡi dùng ѭu
thích nhӡ tính thân thiӋn, dӉ sӱ dөng cӫa nó.
ƒ T̩o các bi͋u ÿ͛ trong th˱˯ng m̩i, khoa h͕c, kͿ thu̵t
Các ӭng dөng này thѭӡng ÿѭӧc dùng ÿӇ tóm lѭӧc các dӳ liӋu vӅ tài chính, thӕng kê,
kinh tӃ, khoa hӑc, toán hӑc... giúp cho nghiên cӭu, quҧn lý... mӝt cách có hiӋu quҧ.
ƒ T͹ ÿ͡ng hoá văn phòng và ch͇ b̫n ÿi͏n t͵
ƒ Thi͇t k͇ vͣi s͹ trͫ giúp cͯa máy tính (CAD_CAM)
ƒ Lƭnh v͹c gi̫i trí, ngh͏ thu̵t và mô ph͗ng
ƒ Ĉi͉u khi͋n các quá trình s̫n xṷt (Process Control)
ƒ Lƭnh v͹c b̫n ÿ͛ (Cartography)
ƒ Giáo dͭc và ÿào t̩o

11
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ
Mӝt sӕ ví dө cӫa ӭng dөng kӻ thuұt ÿӗ hoҥ:

Hình 1.4 Các ӭng dөng cӫa kӻ thuұt ÿӗ hoҥ

Hình 1.5 HӋ ӭng dөng CAD - CAM

12
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ
1.2.5. Các chuҭn giao diӋn cӫa hӋ ÿӗ hoҥ
Mөc tiêu căn bҧn cӫa các chuҭn cho phҫn mӅm ÿӗ hoҥ là ÿҧm bҧo tính tѭѫng thích. Khi
các công cө ÿѭӧc thiӃt kӃ vӟi hàm ÿӗ hoҥ chuҭn, phҫn mӅm có thӇ ÿѭӧc di chuyӇn mӝt
cách dӉ dàng tӯ hӋ phҫn cӭng này sang hӋ phҫn cӭng khác và ÿѭӧc dùng trong nhiӅu cài
ÿһt và ӭng dөng khác nhau.
GKS (Graphics Kernel System): chuҭn xác ÿӏnh các hàm ÿӗ hoҥ chuҭn, ÿѭӧc thiӃt
kӃ nhѭ mӝt tұp hӧp các công cө ÿӗ hoҥ hai chiӅu và ba chiӅu.
GKS Functional Description, ANSI X3.124 - 1985.GKS - 3D Functional
Description, ISO Doc #8805:1988.
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.
CGM (Computer Graphics Metafile): xác ÿӏnh các chuҭn cho viӋc lѭu trӳ và chuyӇn
ÿәi hình ҧnh.
VRML (Virtual Reality Modeling Language): ngôn ngӳ thӵc tҥi ҧo, mӝt hѭӟng phát
triӇn trong công nghӋ hiӇn thӏ ÿѭӧc ÿӅ xuҩt bӣi hãng Silicon Graphics, sau ÿó ÿã ÿѭӧc
chuҭn hóa nhѭ mӝt chuҭn công nghiӋp.
PHIGS (Programmers Hierarchical Interactive Graphics Standard): xác ÿӏnh các
phѭѫng pháp chuҭn cho các mô hình thӡi gian thӵc và lұp trình hѭӟng ÿӕi tѭӧng.
PHIGS Functional Description, ANSI X3.144 - 1985.+ Functional Description,
1988, 1992.
OPENGL thѭ viӋn ÿӗ hӑa cӫa hãng Silicon Graphics, ÿѭӧc xây dӵng theo ÿúng
chuҭn cӫa mӝt hӋ ÿӗ hӑa năm 1993.
DIRECTX thѭ viӋn ÿӗ hoҥ cӫa hãng Microsoft, Direct X/Direct3D 1997
1.3. PHҪN CӬNG ĈӖ HOҤ (GRAPHICS HARDWARE)
1.3.1. Các thành phҫn phҫn cӭng cӫa hӋ ÿӗ hoҥ tѭѫng tác
CPU:thӵc hiӋn các chѭѫng trình ӭng dөng.
Bӝ xӱ lý hiӇn thӏ (Display Processor): thӵc hiӋn công viӋc hiӇn thӏ dӳ liӋu ÿӗ hoҥ.
Bӝ nhӟ hӋ thӕng (System Memory): chӭa các chѭѫng trình và dӳ liӋu ÿang thӵc
hiӋn.
Gói phҫn mӅm ÿӗ hoҥ (Graphics Package): cung cҩp các hàm ÿӗ hoҥ cho chѭѫng
trình ӭng dөng
Phҫn mӅm ӭng dөng (Application Program): phҫn mӅm ÿӗ hoҥ ӭng dөng.
Bӝ ÿӋm ( Frame buffer): có nhiӋm vө chӭa các hình ҧnh hiӇn thӏ.
Bӝ ÿiӅu khiӇn màn hình (Video Controller): ÿiӅu khiӇn màn hình, chuyӇn dӳ liӋu
dҥng sӕ ӣ frame buffer thành các ÿiӇm sáng trên màn hình.

13
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ

Hình 1.6 Các thành phҫn cӭng cӫa hӋ ÿӗ hoҥ tѭѫng tác
1.3.2. Máy in
Dot size: ÿѭӡng kính cӫa mӝt ÿiӇm in bé nhҩt mà máy in có thӇ in ÿѭӧc
Addressability: khҧ năng ÿӏa chӍ hoá các ÿiӇm in có thӇ có trên mӝt ÿѫn vӏ ÿӝ dài (dot per
inch)
Dot size Point per inch
8 - 20/ 100 inch 200, 600
5/1000 inch 1500
Máy vӁ 6,15/1000 inch 1000, 2000
1.3.3. Màn hình CRT
Mӝt chùm các tia ÿiӋn tӱ (tia âm cӵc) phát ra tӯ mӝt súng ÿiӋn tӱ, vѭӧt qua cuӝn lái tia dүn ÿӃn vӏ
trí xác ÿӏnh trên màn hình ÿѭӧc phӫ mӝt lӟp phosphor. Tҥi mӛi vӏ trí tѭѫng tác vӟi tia ÿiӋn tӱ hҥt
phosphor sӁ phát lên mӝt chҩm sáng nhӓ. Nhѭng chҩm sáng sӁ mӡ dҫn rҩt nhanh nên cҫn có cách
nào nó duy trì ҧnh trên màn hình. Mӝt trong các cách là: lһp ÿi lһp lҥi nhiӅu lҫn viӋc vӁ lҥi ҧnh
thұt nhanh bҵng cách hѭӟng các tia ÿiӋn tӱ trӣ lҥi ví trí cNJ. Gӑi là làm tѭѫi (refresh CRT).
Sӕ lѭӧng tӕi ÿa các ÿiӇm có thӇ hiӇn thӏ trên mӝt CRT ÿѭӧc gӑi là ÿӝ phân giҧi
(Resolution). Hay ÿӝ phân giҧi là sӕ lѭӧng các ÿiӇm có thӇ ÿѭӧc vӁ theo chiӅu ngang và
chiӅu dӑc (ÿѭӧc xem nhѭ tәng sӕ ÿiӇm theo mӛi hѭӟng) cӫa màn hình.
Kích thѭӟc vұt lý cӫa màn hình ÿӗ hoҥ ÿѭӧc tính tӯ ÿӝ dài cӫa ÿѭӡng chéo màn
hình. Thѭӡng dao ÿӝng tӯ 12-27 inch, hoһc lӟn hѫn.
Thuӝc tính khác cӫa màn hình là tӹ sӕ phѭѫng (aspect ratio). Nó là tӹ lӋ cӫa các
ÿiӇm dӑc và các ÿiӇm ngang cҫn ÿӇ phát sinh các ÿoҥn thҷng có ÿӝ dài ÿѫn vӏ theo cҧ hai
hѭӟng trên màn hình. Màn hình có tӹ sӕ phѭѫng khác mӝt, thì hình vuông hiӇn thӏ trên ÿó
thành hình chӳ nhұt còn hình tròn thành hình ellipse.

14
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ

NEC Hybrid Hitachi EDP Standard Dot-trio SONY Trinitron


Hình 1.7 Công nghӋ màn hình CRT
Màn hình dҥng ÿiӇm (Raster Display): thѭӡng gһp nhҩt trong sӕ các dҥng màn hình
sӱ dөng CRT trên công nghӋ truyӅn hình. Mӛi ÿiӇm trên màn hình ÿѭӧc gӑi là pixel. Các
thông tin vӅ ҧnh hiӇn thӏ trên màn hình ÿѭӧc lѭu trӳ trong mӝt vùng bӝ nhӟ gӑi là vùng
ÿӋm làm tѭѫi (Refresh buffer) hay là vùng ÿӋm khung (Frame Buffer). Vùng lѭu trӳ tұp
các giá trӏ cѭӡng ÿӝ sáng cӫa toàn bӝ các ÿiӇm trên màn hình và luôn tӗn tҥi mӝt cách
song ánh giӳa mӛi ÿiӇm trên màn hình và mӛi phҫn tӱ trong vùng này.
ĈӇ tҥo ra hình ҧnh ÿen trҳng, ÿѫn giҧn chӍ cҫn lѭu thông tin cӫa mӛi Pixel là mӝt bít
(0,1) (xem hình 1.8). Trong trѭӡng hӧp ҧnh nhiӅu màu thì cҫn nhiӅu bít hѫn, nӃu thông tin
mӛi pixel ÿѭӧc lѭu bҵng b bít thì ta có thӇ có 2b giá trӏ màu phân biӋt cho pixel ÿó.

15
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ
Ví dө mô hình ÿӗ hoҥ ÿiӇm ngôi nhà và ngôi sao.
Interface to
host computer (interaction data)
(Display
commands)
Display Keyboard
processo Data input
00000000000000
00000000000100
0000 CRT

Bitmap refresh buffer


(the 1’’s are accentuated
for contrast)

Hình 1.8 Song ánh giӳa vùng ÿӋm khung và màn hình
Trong các màn hình màu, ngѭӡi ta ÿӏnh nghƭa tұp các màu làm viӋc trong mӝt bҧng
tra (LookUp Table - LUT). Mӛi phҫn tӱ cӫa LUT ÿѭӧc ÿӏnh nghƭa mӝt bӝ ba giá trӏ
(RGB) mô tҧ mӝt màu nào ÿó. Khi cҫn sӱ dөng mӝt màu, ta chӍ cҫn chӍ ÿӏnh sӕ thӭ tӵ
(index) tѭѫng ӭng cӫa màu ÿó trong LUT, sӕ phҫn tӱ trong bҧng LUT chính là sӕ màu có
thӇ ÿѭӧc hiӇn thӏ cùng mӝt lúc trên màn hình.
X: 0 ¸ Xmax2 màu/ 1 bit 640 x 480 x 16 o Video RAM = 2MB
Y: 0 ¸ Ymax16 màu/ 4 bit ;256 màu/ 8bit 1024 x 1024 x 24 o Video RAM = 24MB
16 24
2 màu/ 16 bit ; 2 màu/ 24 bit

ViӋc làm tѭѫi trên màn hình dҥng này ÿѭӧc thӵc hiӋn ӣ tӕc ÿӝ 60 - 80 khung/giây.
Ĉôi khi tӕc ÿӝ làm tѭѫi còn ÿѭӧc biӇu diӉn bҵng ÿѫn vӏ Hertz (Hz - sӕ chu kǤ trên/giây),
trong ÿó mӝt chu kǤ tѭѫng ӭng vӟi mӝt khung (frame). Vұy tӕc ÿӝ làm tѭѫi 60
khung/giây ÿѫn giҧn là 60 Hz. Khi ÿҥt ÿӃn cuӕi mӛi dòng quét, tia ÿiӋn tӱ quay trӣ lҥi
bên trái cӫa màn hình ÿӇ bҳt ÿҫu dòng quét kӃ tiӃp. ViӋc quay trӣ vӅ bên trái màn hình sau
khi làm tѭѫi mӛi dòng quét ÿѭӧc gӑi là tia hӗi ngang (Horizontal retrace). Và tӟi cuӕi mӛi
frame, tia ÿiӋn tӱ (tia hӗi dӑc - Vertical retrace) quay trӣ lҥi góc bên trái cӫa màn hình ÿӇ
chuҭn bӏ bҳt ÿҫu frame kӃ tiӃp.

Hình 1.9 Quét mành và quét dòng cӫa màn hình CRT
1.3.4. Màn hình tinh thӇ lӓng (Liquid Crystal Display –– LCD)
Dӵa vào công nghӋ truyӅn ánh sáng qua ÿiӋn cӵc mà ÿһt giӳa là cuӝn dây xoҳn. Khi chѭa
có tӯ trѭӡng (chѭa có dòng ÿiӋn) ӣ cuӝn dây thì ánh sáng truyӅn thҷng, khi có tӯ trѭӡng
thì ánh sáng truyӅn ÿәi chiӅu.
16
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ

Hình 1.10 Công nghӋ truyӅn ánh sáng trong màn hình tinh thӇ lӓng
CRT Displays (màn hình CRT)
Advantages (ѭu ÿiӇm) Disadvantages (nhѭӧc ÿiӇm)
Ĉáp ӭng nhanh (có ÿӝ phân giҧi cao) Lӟn và nһng (typ. 70x70 cm, 15 kg)
Màu sҳc ÿa dҥng (Có ÿӝ sâu và rӝng) Tiêu tӕn nguӗn ÿiӋn cao (typ. 140W)
Màu sҳc bão hoà và tӵ nhiên Có hҥi cho sӭc khoҿ vì trѭӡng ÿiӋn tӯ và tӯ tính
Công nghӋ không quá ÿҳt và hoàn thiӋn Màn hình nhҩp nháy (at 50-80 Hz)
Góc nhìn rӝng, tѭѫng phҧn và ÿӝ sáng cao Hình hay bӏ méo tҥi 4 góc
LCD Displays (màn hình tinh thӇ lӓng)
Advantages (ѭu ÿiӇm) Disadvantages (nhѭӧc ÿiӇm)
Hình dáng nhӓ, trӑng lѭӧng nhҽ (approx 1/6 of Giá thành cao (presently 3x CRT)
CRT, typ. 1/5 of CRT) Góc nhìn hҽp hѫn (typ. +/- 50 degrees)
Tiêu tӕn nguӗn thҩp (typ. 1/4 of CRT) ÿӝ tѭѫng phҧn thҩp (typ. 1:100)
Màn hình phҷng tuyӋt ÿӕi nên không méo tҥi ÿӝ chói (ÿӝ ngӡi) thҩp hѫn (typ. 200 cd/m2)
các góc
Màu sҳc ÿӅu, ҧnh sinh ÿӝng
Không bӏ hiӋu ӭng ÿiӋn tӯ trѭӡng
Có thӇ màn hình vӯa lӟn vӯa rӝng (>20 inch)

Tóm tҳt chѭѫng:


Sӵ ra ÿӡi cӫa ÿӗ hoҥ máy tính thӵc sӵ là cuӝc cách mҥng trong giao tiӃp giӳa ngѭӡi dùng
và máy tính. Vӟi lѭӧng thông tin trӵc quan, ÿa dҥng và phong phú ÿѭӧc truyӅn tҧi qua
hình ҧnh. Các ӭng dөng ÿӗ hoҥ máy tính ÿã lôi cuӕn nhiӅu ngѭӡi nhӡ tính thân thiӋn, dӉ
dùng, kích thích khҧ năng sáng tҥo và tăng ÿáng kӇ hiӋu suҩt làm viӋc.
17
Chѭѫng 1: Tәng quan vӅ kӻ thuұt ÿӗ hoҥ
Ĉӗ hoҥ máy tính ngày nay ÿѭӧc ÿѭӧc ӭng dөng rҩt rӝng rãi trong nhiӅu lƭnh vӵc
khoa hӑc, kӻ thuұt, nghӋ thuұt, kinh doanh, quҧn lý……Các ӭng dөng ÿӗ hoҥ rҩt ÿa dҥng,
phong phú và phát triӇn liên tөc không ngӯng. Ngày nay, hҫu nhѭ không có chѭѫng trình
ӭng dөng nào mà không sӱ dөng kӻ thuұt ÿӗ hoҥ ÿӇ làm tăng tính hҩp dүn cho mình.
Mӝt hӋ thӕng ÿӗ hoҥ bao giӡ cNJng gӗm hai phҫn chính ÿó là phҫn cӭng và phҫn
mӅm. Phҫn cӭng bao gӗm các thiӃt bӏ hiӇn thӏ (thiӃt bӏ xuҩt) và các thiӃt bӏ nhұp. Tiêu
biӇu nhҩt là màn hình, có hai loҥi màn hình thông dөng là CRT và LCD.
Bài tұp:
1. Cҩu tҥo và nguyên lý hoҥt ÿӝng cӫa màn hình dҥng ÿiӇm. Nêu các khái niӋm
vùng ÿӋm khung, ÿӝ phân giҧi, tӹ sӕ phѭѫng.... cӫa màn hình loҥi này?
2. Ý nghƭa và hoҥt ÿӝng cӫa bҧng tra LUT?
3. Tính Video Ram cӫa các màn hình lҫn lѭӧt có ÿӝ phân giҧi là 640x480,
1024x768, 1280x1024 mà có mӛi pixel ÿѭӧc mô tҧ lҫn lѭӧt là 8bít, 12 bit, 24
bit.
4. NӃu chúng ta dùng các giá trӏ 12bit cho mӛi pixel trong mӝt bҧng tham chiӃu
lookup table, có bao nhiêu hҥng mөc mà lookup table có ÿѭӧc?
5. Tҥi sao phҧi chuҭn hoá các phҫn mӅm ÿӗ hoҥ? LiӋt kê các chuҭn hóa ÿó.

18
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ

CHѬѪNG 2: CÁC GIҦI THUҰT SINH THӴC THӆ CѪ SӢ

2.1. CÁC Hӊ THӔNG TOҤ ĈӜ TRONG ĈӖ HOҤ


Trong lƭnh vӵc kӻ thuұt ÿӗ hӑa, chúng ta phҧi hiӇu ÿѭӧc rҵng thӵc chҩt cӫa ÿӗ hӑa là làm
thӃ nào ÿӇ có thӇ mô tҧ và biӃn ÿәi ÿѭӧc các ÿӕi tѭӧng trong thӃ giӟi thӵc trên máy tính.
Bӣi vì, các ÿӕi tѭӧng trong thӃ giӟi thӵc ÿѭӧc mô tҧ bҵng tӑa ÿӝ thӵc. Trong khi ÿó, hӋ
tӑa ÿӝ thiӃt bӏ lҥi sӱ dөng hӋ tӑa ÿӝ nguyên ÿӇ hiӇn thӏ các hình ҧnh. Ĉây chính là vҩn ÿӅ
cѫ bҧn cҫn giҧi quyӃt. Ngoài ra, còn có mӝt khó khăn khác nӳa là vӟi các thiӃt bӏ khác
nhau thì có các ÿӏnh nghƭa khác nhau. Do ÿó, cҫn có mӝt phѭѫng pháp chuyӇn ÿәi tѭѫng
ӭng giӳa các hӋ tӑa ÿӝ và ÿӕi tѭӧng phҧi ÿѭӧc ÿӏnh nghƭa bӣi các thành phҫn ÿѫn giҧn
nhѭ thӃ nào ÿӇ có thӇ mô tҧ gҫn ÿúng vӟi hình ҧnh thӵc bên ngoài.
Hai mô hình cѫ bҧn cӫa ӭng dөng ÿӗ hӑa là dӵa trên mүu sӕ hóa và dӵa trên ÿһc
trѭng hình hӑc. Trong ӭng dөng ÿӗ hӑa dӵa trên mүu sӕ hóa thì các ÿӕi tѭӧng ÿӗ hӑa
ÿѭӧc tҥo ra bӣi lѭӟi các pixel rӡi rҥc. Các pixel này có thӇ ÿuӧc tҥo ra bҵng các chѭѫng
trình vӁ, máy quét, ... Các pixel này mô tҧ tӑa ÿӝ xác ÿӏnh vӏ trí và giá trӏ mүu. Thuұn lӧi
cӫa ӭng dөng này là dӇ dàng thay ÿәi ҧnh bҵng cách thay ÿәi màu sҳc hay vӏ trí cӫa các
pixel, hoһc di chuyӇn vùng ҧnh tӯ nѫi này sang nѫi khác. Tuy nhiên, ÿiӅu bҩt lӧi là không
thӇ xem xét ÿӕi tѭӧng tӯ các góc nhìn khác nhau. Ӭng dөng ÿӗ hӑa dӵa trên ÿһc trѭng
hình hӑc bao gӗm các ÿӕi tѭӧng ÿӗ hӑa cѫ sӣ nhѭ ÿoҥn thҷng, ÿa giác,.... Chúng ÿѭӧc lѭu
trӳ bҵng các mô hình và các thuӝc tính. Ví dө : ÿoҥn thҷng ÿѭӧc mô hình bҵng hai ÿiӇm
ÿҫu và cuӕi, có thuӝc tính nhѭ màu sҳc, ÿӝ dày. Ngѭӡi sӱ dөng không thao tác trӵc tiӃp
trên các pixel mà thao tác trên các thành phҫn hình hӑc cӫa ÿӕi tѭӧng.
2.1.1. HӋ toҥ ÿӝ thӵc (WCS –– World Coordinate System)
Mӝt trong nhӳng hӋ tӑa ÿӝ thӵc thѭӡng ÿѭӧc dùng ÿӇ mô tҧ các ÿӕi tѭӧng trong thӃ giӟi
thӵc là hӋ tӑa ÿӝ Descartes. Vӟi hӋ tӑa ÿӝ này, mӛi ÿiӇm P ÿѭӧc biӇu diӉn bҵng mӝt cһp
tӑa ÿӝ P(xp,yp,zp) vӟi xp, yp,zp  R

Hình 2.1 HӋ tӑa ÿӝ thӵc.


Ox,Oy, Oz là trөc toҥ ÿӝ
xp ,yp,zp : toҥ ÿӝ cӫa P
2.1.2. HӋ toҥ ÿӝ thiӃt bӏ (DCS –– Device Coordinate System)
HӋ tӑa ÿӝ thiӃt bӏ (device coordinates) ÿѭӧc dùng cho mӝt thiӃt bӏ xuҩt cө thӇ nào ÿó, ví
dө nhѭ máy in, màn hình,.. Trong hӋ tӑa ÿӝ thiӃt bӏ thì các ÿiӇm cNJng ÿѭӧc mô tҧ bӣi cһp
19
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
tӑa ÿӝ (x,y). Tuy nhiên, khác vӟi hӋ tӑa ÿӝ thӵc là x, y  N. ĈiӅu này có nghƭa là các
ÿiӇm trong hӋ tӑa ÿӝ thӵc ÿѭӧc ÿӏnh nghƭa liên tөc, còn các ÿiӇm trong hӋ tӑa ÿӝ thiӃt bӏ
là rӡi rҥc. Ngoài ra, các tӑa ÿӝ x, y cӫa hӋ tӑa ÿӝ thiӃt bӏ chӍ biӇu diӉn ÿѭӧc trong mӝt giӟi
hҥn nào ÿó cӫa N. Ví dө : Ĉӝ phân giҧi cӫa màn hình trong chӃ ÿӝ ÿӗ hӑa là 640x480. Khi
ÿó, x(0,639) và y(0,479) (xem hình 2.2).

Hình 2.2 HӋ tӑa ÿӝ trên màn hình


2.1.3. toҥ ÿӝ thiӃt bӏ chuҭn (NDCS –– Normalized Device Coordinate System)
Do cách ÿӏnh nghƭa các hӋ tӑa ÿӝ thiӃt bӏ khác nhau nên mӝt hình ҧnh hiӇn thӏ ÿѭӧc trên
thiӃt bӏ này là chính xác thì chѭa chҳc hiӇn thӏ chính xác trên thiӃt bӏ khác. Ngѭӡi ta xây
dӵng mӝt hӋ tӑa ÿӝ thiӃt bӏ chuҭn ÿҥi diӋn chung cho tҩt cҧ các thiӃt bӏ ÿӇ có thӇ mô tҧ các
hình ҧnh mà không phө thuӝc vào bҩt kǤ thiӃt bӏ nào.
Trong hӋ tӑa ÿӝ chuҭn, các tӑa ÿӝ x, y sӁ ÿѭӧc gán các giá trӏ trong ÿoҥn tӯ [0,1].
Nhѭ vұy, vùng không gian cӫa hӋ tӑa ÿӝ chuҭn chính là hình vuông ÿѫn vӏ có góc trái
dѭӟi (0, 0) và góc phҧi trên là (1, 1).
Quá trình mô tҧ các ÿӕi tѭӧng thӵc nhѭ sau (xem hình 2.3):

Hình 2.3 HӋ tӑa ÿӝ trên màn hình.


2.2. ĈIӆM VÀ ĈOҤN THҶNG
2.2.1. ĈiӇm
Trong hӋ toҥ ÿӝ hai chiӅu (mһt phҷng) thì ÿiӇm ÿѭӧc biӇu diӉn P(x,y), ngoài ra nó còn có tính
chҩt màu sҳc. Ví dө ÿӇ vӁ mӝt ÿiӇm ta có hàm putpixel(x,y,color).
2.2.2. Ĉoҥn thҷng
ƒ BiӇu diӉn tѭӡng minh: y = f(x)
Mӝt ÿoҥn thҷng ÿѭӧc xác ÿӏnh nӃu biӃt 2 ÿiӇm thuӝc nó. Phѭѫng trình ÿoҥn thҷng ÿi
qua 2 ÿiӇm P (x1,y1) và Q(x2,y2) nhѭ sau:

20
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ

(y-y1)/( x-x1) = ( y2-y1)/( x2-x1)


Q(x2 , y2)
(y-y1)(x2-x1)=(x-x1)(y2-y1)
(x2-x1)y=(y2-y1)x + y1(x2-x1) - x1(y2-y1)
y = ((y2-y1)/(x2-x1))x + y1 - ((y2-y1)/(x2-x1))x1
P(x1, y1)
y = kx + b
k = (y2-y1)/(x2-x1) Ĉӝ dӕc hay hӋ sӕ góc cӫa ÿѭӡng
b = y1- kx1 Ĉoҥn chҳn trên trөc y b
'y = k'x (tӭc là khi x thay ÿәi thì y thay ÿәi theo)
Hình 2.4 VӁ ÿoҥn thҷng PQ
ƒ BiӇu diӉn không tѭӡng minh: ax+by+c=0
Ta có : (y2-y1)x - (x2-x1)y + (x2-x1)y1 - (y2-y1)x1 = 0
(y2-y1)x - (x2-x1)y + x2y1 - x1y2 = 0
hay ax + by + c = 0
Trong ÿó a = (y2-y1), b = -(x2-x1 ) và c = x2y1 - x1y2
ƒ BiӇu diӉn thông qua tham sӕ:
P(u) = P1 + u(P2 - P1) có u [0,1]
x(u) = x1 + u( x2 - x1 )
y (u)= y1 + u( y2 - y1 )
2.3. CÁC GIҦI THUҰT XÂY DӴNG THӴC THӆ CѪ SӢ
2.3.1. Giҧi thuұt vӁ ÿoҥn thҷng thông thѭӡng
Nguyên lý chung: cho mӝt thành phҫn toҥ ÿӝ x hay y biӃn ÿәi theo tӯng ÿѫn vӏ và tính ÿӝ
nguyên còn lҥi sao cho gҫn vӟi toҥ ÿӝ thӵc nhҩt.
y2  y1
Ta có y x  x1  y1
x2  x1
Cho x thay ÿәi tìm y, trong bài này cho x1 thay ÿәi tiӃn tӟi x2 ta chӑn ÿѫn vӏ nhӓ
nhҩt cӫa màn hình 'x=1.
Giҧi thuұt thông thѭӡng:
void dline(int x1,int y1, int x2,int y2, int color) {
float y; int x;
for (x=x1; x<=x2; x++) {
y = y1 + (x-x1)*(y2-y1)/(x2-x1) ;
putpixel(x, Round(y), color );
} }

21
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
2.3.2. Giҧi thuұt Bresenham
1960 Bresenham thuӝc IBM tìm ra các ÿiӇm gҫn vӟi ÿѭӡng thҷng dӵa trên ÿӝ phân giҧi
hӳu hҥn. Giҧi thuұt này loҥi bӓ ÿѭӧc các phép toán chia và phép toán làm tròn nhѭ ta ÿã
thҩy trong giҧi thuұt trên.
Xét ÿoҥn thҷng vӟi 0 < k < 1

Hình 2.5 Mô tҧ giҧi thuұt Bresenham (0<k<1)


Gӑi (xi+1,yi+1) là ÿiӇm thuӝc ÿoҥn thҷng, ta có yi+1=k(xi+1)+b
d1 = yi+1 - yi = k(xi +1) + b - yi
d2 = yi+1 –– yi+1 = yi+1 - k(xi + 1) - b
- NӃu d1 <= d2 => yi+1 = yi
- Ngѭӧc lҥi d1 > d2 => yi+1 = yi +1
Ĉһt D = d1 - d2= 2k(xi + 1) - 2yi + 2b - 1
Có k='y/'x và ÿһt Pi = 'xD = 'x (d1 - d2)
Pi = 'x(2'y/'x(xi +1)- 2yi +2b-1) = 2'yxi +2'y -2'xyi + 2b'x -'x
Ta tính bѭӟc tiӃp:
Pi+1 = 2'yxi+1 +2'y -2'xyi+1 + 2b'x -'x
Pi+1 - Pi = -2'x(yi+1 -yi) + 2'y(xi+1 -xi)
Có xi+1 =xi+1 nên:
Pi+1 - Pi = - 2'x(yi+1 -yi) + 2'y = 2'y - 2'x(yi+1 -yi)
NӃu Pi <= 0 thì yi +1 = yi o Pi+1 = Pi + 2'y
NӃu Pi > 0 thì yi+1 = yi +1 o Pi+1 = Pi + 2'y - 2'x
Tính giá trӏ ÿҫu: P1?
P1 = 'x(d1 - d2) = 'x(2'y/'x(x1 +1)- 2y1 +2b-1)
= 2'yx1 +2'y -2'xy1 + 2b'x -'x
Có y1=kx1 + b = 'y/'x x1 +b
P1 = 2'yx1 +2'y -2'x(('y/'x)x1 +b) + 2b'x -'x
= 2'yx1 +2'y -2'yx1 - 2b'x + 2b'x -'x
P1 = 2'y - 'x

22
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
void Bre_line(int x1, int y1,
B¾t ®Çu
int x2, int y2, int c){
int x, y, dx, dy,p;
y = y1;
x = x1 ;
x=x1;y=y1; dx = x2 - x1;
y = y1;
dx = x2dx=x2-x1;
- x1; dy = y2 - y1;
dy = y2 - y1;
P = dx -dy=y2-y1;
2dy; p = 2*dy - dx;
for (x=x1; x<=x2; x++) {
putpixel(x, y, c);
Putpixel (x ,y);
if (p <= 0)
p+=2*dy; //p=p+2dy
No
p<=0
P >0 else {
p=
P = Pp+2dy-2dx
- 2dy + 2dx p+=2*(dy-dx);//p=p+2dy-2dx
x=x+1
yes y++;
}
p=p+2dy
P = P - 2dy y=y+1
}
}
yes x < x2

no

KÕt thóc

Hình 2.6 Sѫ ÿӗ khӕi thuұt toán


Bresenham cho ÿѭӡng thҷng
Xét 4 trѭӡng hӧp cӫa k :
0<k<1 k>1 -1<k<0 k<-1
int p=2*dy-dx; int p=dy-2*dx; int p=2*dy+dx; int p=-dy-2*dx;
if(p>=0) { if(p<=0){ if(p<=0) { if(p>=0) {
p+=2*dy-2*dx; p+=2*dy-2*dx; p+=2*dy+2*dx; p+=-2*dy-2*dx;
y++; x++; y--; x--;
} else } else } else } else
p+=2*dy; p+=-2*dx; p+=2*dy; p+=-2*dx;
2.3.3. Giҧi thuұt trung ÿiӇm-Midpoint
Jack Bresenham 1965/Pitteway 1967, áp dөng cho viӋc sinh các ÿѭӡng thҷng và ÿѭӡng
tròn 1985. Xét trung ÿiӇm cӫa ÿoҥn AB (M)
NӃu M ӣ trên ÿoҥn thҷng AB thì chӑn B còn
M ӣ dѭӟi ÿoҥn thҷng AB chӑn A
Công thӭc ÿѫn giҧn hѫn, tҥo ÿѭӧc các ÿiӇm tѭѫng tӵ nhѭ vӟi Bresenham
d = f(xi + 1, yi + 1/2) là trung ÿiӇm cӫa ÿoҥn AB

23
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
d<0 d>0

A A

Hình 2.7 Mô tҧ giҧi thuұt Midpoint


So sánh hay kiӇm tra M sӁ ÿѭӧc thay bҵng viӋc xét giá trӏ d.
ƒ d > 0 ÿiӇm B ÿѭӧc chӑn khi ÿó yi+1 = yi
ƒ d < 0 ÿiӇm A ÿѭӧc chӑn khi ÿó yi+1 = yi + 1
Trѭӡng hӧp d = 0 chúng ta có thӇ chӑn ÿiӇm bҩt kǤ hoһc A, hoһc B.
Sӱ dөng phѭѫng pháp biӇu diӉn không tѭӡng minh
f(x,y)= ax +by +c =0 (1) dx =x2-x1 dy =y2-y1
BiӇu diӉn tѭӡng minh:
y= (dy/dx)x +B hay f(x,y)=0= xdy - ydx +Bdx (2)
So sánh (1) và (2) ta có a=dy, b=-dx và c= Bdx
Có f(x,y)=0 vӟi mӑi (x,y) thuӝc ÿѭӡng thҷng
Ĉһt di=f(xi+1,yi+1/2) = a(xi+1) +b(yi +1/2) +c
ƒ NӃu chӑn A (d<0) thì M sӁ tăng theo 2 hѭӟng x,y
di+1=f(xi+2,yi+3/2) = a(xi+2) +b(yi +3/2) +c
di+1 –– di = a+b Hay di+1 = di + dy - dx
ƒ NӃu chӑn B (d>0) thì M sӁ tăng theo x
di+1=f(xi+2,yi+1/2) = a(xi+2) +b(yi +1/2) +c
di+1 - di = a Hay di+1 = di + dy
Tính d1 ? d1 = f(x1+1,y1+1/2) = a(x1+1) +b(y1 +1/2) +c
= ax1 +by1 +c +a +1/2 b = f(x1,y1) +a +b/2
Có (x1,y1) là ÿiӇm bҳt ÿҫu, nҵm trên ÿoҥn thҷng nên f(x1,y1) = 0
Vұy d1 = a+ b/2 = dy - dx/2

24
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
/* Thuat toan Midpoint de ve
B¾t ®Çu doan thang (0<k<1) */
void Mid_line(int x1, int y1,
int x2, int y2, int c)
x = x1 ;
y = y1; { int x, y, dx, dy,d;
dx = x2 - x1; y = y1;
dy = y2 - y1;
dx = x2 - x1;
d = dy - dx/2;
dy = y2 - y1;
d= dy - dx/2;
Putpixel (x ,y); for (x=x1; x<=x2; x++) {
putpixel(x, y, c);
No if (d <= 0)
d <= 0
d = d + dy;
d = d + dy - dx else {
x=x+1
yes
y ++;
d = d + dy y=y+1 d = d + dy - dx;
}
}
yes x < x2 }

no

KÕt thóc

Hình 2.8 Sѫ ÿӗ khӕi giҧi thuұt Midpiont


cho ÿoҥn thҷng
2.3.3. Giҧi thuұt sinh ÿѭӡng tròn (Scan Converting Circles)(Bresenham)
ƒ Phѭѫng trình ÿѭӡng tròn ÿi qua tâm có toҥ ÿӝ (xc,yc) là:
(x - xc)2 + (y - yc)2 = r2
Hình tròn là hình ÿӕi xӭng tám cách

Hình 2.9 Hình tròn ÿӕi xӭng 8 phҫn


ĈӇ ÿѫn giҧn ta xét tâm trùng gӕc 0 thì phѭѫng trình ÿѫn giҧn : x2 + y2 = r2
Ta xét các ÿiӇm tҥo ra tӯ góc phҫn tѭ thӭ 2: tӯ 900 ÿӃn 450 , thӵc hiӋn theo hѭӟng
+x, -y

25
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ

Hình 2.10 Mô tҧ giҧi thuұt Bresenham


Giҧ sӱ bҳt ÿҫu xi vұy xi+1 = xi +1
y2 = r2 - (xi +1)2
d1 = yi2 - y2 = yi2 - r2 - (xi +1)2
d2 = y2 - (yi - 1)2 = r2 - (xi +1)2 - (yi - 1)2
pi = d1 - d2 = 2(xi +1 )2 + yi2 + (yi - 1)2 -2r2
Xét: pi <0 (d1<d2) chӑn ÿiӇm nҵm ngoài ÿѭӡng tròn yi+1 = yi
pi >=0 (d1>=d2) chӑn ÿiӇm nҵm trong ÿѭӡng tròn yi+1 = yi +1
pi = 2(xi +1 )2 + 2yi2 - 2yi 1 - 2r2
pi+1 = 2(xi +2 )2 + 2yi+12 - 2yi+1 + 1 - 2r2
pi+1 = pi + 4xi +6 + 2yi+12 - 2yi2- 2yi+1 + 2yi
pi+1 = pi + 4xi +6 + 2(yi+12 - yi2 )- 2(yi+1 - yi )
ƒ NӃu pi <0 hay yi+1 = yi
pi+1 = pi + 4xi +6
ƒ NӃu pi >=0 hay yi+1 = yi -1
pi+1 = pi + 4xi +6 - 4yi + 2 + 2
pi+1 = pi + 4(xi - yi ) + 10
ƒ Tính P1 ? khi ÿó ӭng vӟi x1=0 và y1 =r
p1 = 2(x1 +1)2 + y12 + (y1 - 1)2 -2r2
= 2 + r2 + (r-1)2 - 2r2= 3 - 2r
Giҧi thuұt là:

26
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
void Bre_circle(int xc, int yc,
Bҳt ÿҫu
int Radius, int color)
{
int x, y, p;
X=0; y=r;
x = 0;
p=3-2r;
y = Radius;
p = 3 - 2 * Radius;
Putpixel(x,y,c); while (x <= y)
{
putpixel(xc + x, yc + y,
X++ color);
p<0 if (p < 0)
p += 4 * x + 6;
p=p-4y+4x+10 else
p=p+4x+6; {
p += 4 * (x-y) + 10;
y--
y--;
}
X<r
x++;}
}

d2

Hình 2.11 Sѫ ÿӗ khӕi giҧi thuұt Bresemham


cho ÿѭӡng tròn
Câu hӓi: lúc sӱ dөng tính ÿӕi xӭng cho tám cách ÿӇ vӁ mӝt ÿѭӡng tròn ÿҫy ÿӫ tӯ các
toҥ ÿӝ pixel ÿѭӧc tҥo ӭng vӟi góc phҫn tѭ thӭ hai. Mӝt vài Pixel ÿѭӧc vӁ hai lҫn, hiӋn
tѭӧng này gӑi là Overstrike. Hãy chӍ ÿӏnh xem nѫi nào xҧy ra hiӋn tѭӧng ÿó?
Trҧ lӡi: Tҥi (r,0) hoһc (0,r) và vӏ trí ÿѭӡng chéo: (Dr, Dr) trong ÿó D = 1/—2 | 0.7071
/* Thuat toan Bresenham de ve duong tron */
#include <graphics.h>
#include <conio.h>
#define pc(xc,yc,x,y) {
putpixel(xc + x, yc + y, color);
putpixel(xc - x, yc - y, color);
putpixel(xc -y, yc +x, color);
putpixel(xc +y, yc -x, color);
}
void Bresenham_Circle(int xc, int yc, int Radius, int color){
int x, y, p;
x = 0;
y = Radius;
p = 3 - 2 * Radius;
pc(xc,yc, Radius,0); //ve 4 diem dac biet
while (x < y){
if (d < 0)
p += 4 * x + 6;
else{
p += 4 * (x-y) + 10;

27
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
y--;
}
x++;
pc(xc,yc, x,y);
pc(xc,yc, y,x);
}
pc(xc,yc, y,y); // ve 4 diem phan giac x=y
}
void main(){
int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "");
Bresenham_Circle(getmaxx() / 2, getmaxy() / 2, 150, 4);
getch();
closegraph();
}
2.3.5. Giҧi thuұt sinh ÿѭӡng tròn Midpoint
Phѭѫng trình ÿѭӡng tròn không tѭӡng minh:
f(x,y) = x2+y2-R2 =0

Hình 2.12 Mô tҧ giҧi thuұt Midpoint


NӃu f(x,y) = 0 thì nҵm trên ÿѭӡng tròn
f(x,y) > 0 thì nҵm bên ngoài ÿѭӡng tròn
f(x,y) < 0thì nҵm bên trong ÿѭӡng tròn
Thӵc hiӋn giҧi thuұt trên 1/8 ÿѭӡng tròn và lҩy ÿӕi xӭng cho các góc còn lҥi.
Vӟi M là ÿiӇm giӳa cӫa AB
Vӟi di là giá trӏ cӫa ÿѭӡng tròn tҥi mӝt ÿiӇm bҩt kǤ
Ta có: di = f(xi+1,yi - 1/2) = (xi +1 )2 + (yi - 1/2)2 - r2
ƒ di < 0 chӑn A thì ÿiӇm kӃ cұn sӁ dӏch chuyӇn theo x mӝt ÿѫn vӏ
di+1 = f(xi +2, yi -1/2)
= (xi +2)2 + (yi - 1/2)2 - r2
di+1 - di = (xi +2)2 - (xi +1 )2 = 2xi +3
di+1 = di + 2xi+3
ƒ di >= 0 chӑn B thì ÿiӇm kӃ cұn sӁ dӏch chuyӇn theo x 1 ÿѫn vӏ, theo y -1
ÿѫn vӏ
di+1 = f(xi +2, yi -3/2)

28
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
= (xi +2)2 + (yi - 3/2)2 - r2
di+1 - di = 2xi - 2yi +5
di+1 = di + 2xi - 2yi +5
Tính d1? tҥi ÿiӇm (0, r)
d1 =f(1,r-1/2)= 12 + (r-1/2)2 - r2
d1 = 5/4 -r
Thuұt toán nhѭ sau:
void Mid_circle(int xc, int yc,
Bҳt ÿҫu int Radius, int color)
{
int x, y, d;
X=0; y=r; d=1-r;
x = 0;
y = Radius;
d = 1- Radius;
while (x <= y){
Putpixel(x,y,c); putpixel(xc + x, yc + y, color);
if (d< 0)
d +=2 * x + 3;
X++ else{
d<0 d += 2 * (x-y) + 5;
y--;
d=d+2x-2y+5 }
d=d+2x+3; x++;
}
y-- }

X<r

End

Hình 2.13 Sѫ ÿӗ khӕi giҧi thuұt Midpiont vӁ


ÿѭӡng tròn
void Midpoint_Circle(int xc, int yc, int Radius, int color){
int x, y, d;
x = 0; y = Radius;
d = 5 / 4 - Radius;
while (x <= y) {
putpixel(xc + x, yc + y, color);
putpixel(xc - x, yc + y, color);
putpixel(xc + x, yc - y, color);
putpixel(xc - x, yc - y, color);
putpixel(xc + y, yc + x, color);
putpixel(xc - y, yc + x, color);
putpixel(xc + y, yc - x, color);
putpixel(xc - y, yc - x, color);
if (d < 0)

29
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
d += 2 * x + 3;
else {
d += 2 * (x-y) + 5;
y--;
}
x++; }}
2.3.6. Giҧi thuұt sinh ÿѭӡng ellipse
Tính ÿӕi xӭng ÿѭӧc thӵc hiӋn trên 4 cách
F ( x, y ) b 2 x 2  a 2 y 2  a 2 b 2 0
A
M tiep tuyen = -1
B gradient

B C
M
i

Hình 2.14 Mô tҧ giҧi thuұt sinh ÿѭӡng ellipse


Vector A vӟi tiӃp tuyӃn gradient =1
Ta có tiӃp tuyӃn vӟi cung tròn (ÿӝ dӕc) = -1= dy/dx = - fx/fy
Trong ÿó fx=2b2x ÿҥo hàm riêng phҫn cӫa f(x,y) vӟi x
Và fy=2a2y ÿҥo hàm riêng phҫn cӫa f(x,y) vӟi y
Giҧ sӱ ta chӍ xét trên góc phҫn tѭ thӭ nhҩt: giҧ sӱ ta chia cung tӯ (0,b) ÿӃn (a,0) tҥi
Q, có ÿӝ dӕc -1
Trên phҫn 1: x thay ÿәi thì y thay ÿәi theo
Trên phҫn 2: y thay ÿәi thì x thay ÿәi theo
Xét trên phҫn 1:
Bҳt ÿҫu tӯ (0,b), bѭӟc thӭ i (xi,yi) chӑn tiӃp
A(xi+1, yi)
B(xi+1,yi-1)
Tham sӕ quyӃt ÿӏnh:
Pi = f(xi+1,yi-1/2) = b2(xi+1)2 + a2(yi-1/2)2 -a2b2
Pi+1 = f(xi+1+1,yi+1-1/2) = b2(xi+1+1)2 + a2(yi+1-1/2)2 -a2b2
Pi+1 - Pi = b2((xi+1+1)2 - (xi+1)2 )+ a2((yi+1-1/2)2 - (yi-1/2)2 )
Pi+1 = Pi + 2b2xi+1+ b2 + a2((yi+1-1/2)2 - (yi-1/2)2 )
ƒ NӃu Pi <0 chӑn A
xi+1=xi+1
yi+1=yi
Pi+1 = Pi + 2b2xi(xi+1) +b2 = Pi + 2b2xi +3b2
Hay Pi+1 = Pi + b2(2xi +3)
30
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
ƒ NӃu Pi >=0 chӑn B
xi+1=xi+1
yi+1=yi -1
Pi+1 = Pi + 2b2xi(xi+1) +b2 + a2((yi-1 -1/2)2 - (yi-1/2)2 )
= Pi + 2b2xi +3b2 +a2(-3yi +9/4 +yi -1/4)
= Pi + 2b2xi +3b2 +a2(-2yi +2)
Hay Pi+1 = Pi + b2(2xi +3) + a2(-2yi +2)
ƒ Tính P1? tҥi (0,b)
P1 = f(x1+1,y1-1/2) = b2 + a2(b-1/2)2 -a2b2
P1 = b2 - a2b +a2/4
Xét trên phҫn 2:
Ta lҩy toҥ dӝ cӫa Pixel sau cùng trong phҫn 1 cӫa ÿѭӡng cong ÿӇ tính giá trӏ ban ÿҫu
cho phҫn 2.
Giҧ sӱ pixel (xk,yk) vӯa chuyӇn quét cuӕi cùng cӫa phҫn 1 nhұp vào bѭӟc j cho phҫn
2 (xj,yj).
Pixel kӃ tiӃp có thӇ là:
C(xj,yj-1)
D(xj+1, yj-1)
Tham sӕ quyӃt ÿӏnh:
qj = f(xj+1/2,yj-1) = b2(xj+1/2)2 + a2(yj-1)2 -a2b2
qj+1 = f(xj+1+1/2,yj+1-1) = b2(xj+1+1/2)2 + a2(yj+1-1)2 -a2b2
qj+1 - qj = b2((xj+1+1/2)2 - (xj+1/2)2 )+ a2((yj+1-1)2 - (yj-1)2 )
qj+1 = qj + b2((xj+1+1/2)2 - (xj+1/2)2 )+ a2- 2a2yj+1
ƒ NӃu qj <0 chӑn D
yj+1=yj-1
xj+1=xj +1
qj+1 = qj + b2((xj+3/2)2 - (xj+1/2)2 )+ a2- 2a2(yj -1)
qj+1 = qj + b2(3xj +9/4- xj -1/4) +3a2 -2a2yj
Hay qj+1 = qj + b2(2xj +2) +a2 (-2yj +3)
ƒ NӃu qj >=0 chӑn C
yj+1=yj -1
xj+1= xj
qj+1 = qj + a2- 2a2(yj-1)
Hay qj+1 = qj + a2(3 - 2yj )
ƒ Tính q1?
q1 = f(xk+1/2,yk -1) = b2(xk+1/2)2 + a2(yk-1)2 -a2b2

31
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
Câu hӓi: lúc lҩy ÿӕi xӭng 4 cách ÿӇ tìm 1 Ellipse hoàn chӍnh tӯ các toҥ ÿӝ pixel
ÿѭӧc tҥo ra vӟi cung phҫn tѭ thӭ 1. Có hiӋn tѭӧng overstrike xҧy ra hay không?
Trҧ lӡi: hiӋn tѭӧng overstrike xҧy ra tҥi:
(0,b); (0,-b); (a,0); (-a,0)
Thuұt toán
#include <graphics.h>
#include <conio.h>
#define ROUND(a) ((long)(a+0.5))
void plot(int xc, int yc, int x, int y, int color){
putpixel(xc+x, yc+y, color);
putpixel(xc-x, yc+y, color);
putpixel(xc+x, yc-y, color);
putpixel(xc-x, yc-y, color);
}
void Mid_ellipse(int xc, int yc, int a, int b, int color){
long x, y, fx, fy, a2, b2, p;
x = 0;
y = b;
a2 = a * a; //a2
b2 = b * b; // b2
fx = 0;
fy = 2 * a2 * y; // 2a2y
plot(xc, yc, x,y, color);
p = ROUND(b2-(a2*b)+(0.25*a)); // p=b2 - a2b + a2/4
while (fx < fy){
x++;
fx += 2*b2; //2b2
if (p<0)
p += b2*(2*x +3); // p=p + b2 (2x +3)
else{
y--;
p+= b2*(2*x +3) + a2*(-2*y +2); // p = p + b2(2x +3) + a2 (-2y +2)
2
fy -= 2*a2; // 2a
}
plot(xc, yc, x, y, color);
}
p=ROUND(b2*(x+0.5)*(x+0.5) + a2*(y-1)*(y-1) - a2*b2);//b2(x+1/2)2+a2(y-
1)2 - a2b2
while (y>0){
y--;
fy -= 2*a2; // 2a2
if (p>=0)
p+=a2*(3 - 2*y); //p =p + a2(3-2y)
else{
x++;
fx += 2*b2; // 2b2
p += b2*(2*x+2) + a2*(-2*y +3); //p=p + b2(2x +2) +a2(-2y +3)
}
plot(xc, yc, x, y, color);
}
}

32
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
void main(){
int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "");
Mid_Ellipse(getmaxx() / 2, getmaxy() / 2, 150, 80, 4);
getch();
closegraph();
}
2.3.7. Giҧi thuұt sinh ký tӵ
Trong màn hình text, truy xuҩt các ký tӵ trên màn hình ÿѭӧc hӛ trӧ bӣi phҫn cӭng. Các ký
tӵ ÿѭӧc lѭu trӳ trong bӝ nhӟ ROM, dѭӟi dҥng bitmap hay các ma trұn ҧnh. Phҫn cӭng sӁ
ÿѭa ký tӵ lên màn hình tҥi ví trí xác ÿӏnh, tính toán cuӕn trang và xuӕng dòng.
Trong ÿӗ hoҥ:
ƒ Vector: ÿӏnh nghƭa các ký tӵ theo nhӳng ÿѭӡng cong mӅm bao ngoài cӫa chúng,
tӕn kém vӅ mһt tính toán.
Ѭu nhѭӧc ÿiӇm:
- phӭc tҥp (tính toán phѭѫng trình)
- lѭu trӳ gӑn nhҽ
- các phép biӃn ÿәi dӵa vào công thӭc biӃn ÿәi
Hình 2.15 Ký tӵ vector - Kích thѭӟc phө thuӝc vào môi trѭӡng (không có kích
thѭӟc cӕ ÿӏnh)
ƒ Bitmap: ÿӏnh nghƭa mӛi ký tӵ vӟi 1 font chӳ cho trѭӟc là 1 ҧnh bitmap hình chӳ
nhұt nhӓ.
- Ĉѫn giҧn trong viӋc sinh ký tӵ
(copypixel)
- Lѭu trӳ lӟn
- Các phép biӃn ÿәi(I,B,U, scale) ÿòi hӓi
lѭu trӳ thêm

Hình 2.16 Ký tӵ bitmap - Kích thѭӟc không ÿәi

ƒ bitmap: sӱ dөng hàm copypixel (copy ÿiӇm ҧnh) ÿѭӧc lѭu trӳ trong bӝ nhӟ cӕ ÿӏnh
- Fontcache, ÿѭa vào bӝ nhӟ ÿӋm hiӇn thӏ. Mӛi 1 ký tӵ nhѭ 1 ma trұn 2 chiӅu cӫa
các ÿiӇm ҧnh - mһt nҥ.
Hàm_sinh_ki_tu (mask)
{xmax, ymax, xmin, ymin //các giͤi h̪n cͰa m̀t n̪
xo, yo //ÿi͌m g͚c trên b͢ ÿ͐m hi͌n th͔
for (i=ymin;i< ymax ;i++)
for (j=xmin; j< xmax ; j++)
if (mask(i,j) <> 0)
copypixel ((mask(i,j), pixel(xo+j, yo+i));
}

33
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
Ký tӵ fontcache bitmap ÿѫn giҧn cӫa SRGP lѭu trӳ các ký tӵ theo chuӛi liên tiӃp
nhau trong bӝ nhӟ. Nhѭng ÿӝ rӝng các ký tӵ khác nhau, truy nhұp các fontcache thông
qua bҧn ghi vӅ cҩu trúc cho tӯng kí tӵ.
Cҩu trúc font chӳ
typedef struct {
int leftx;
int width;
} Charlocation; //V͔ trí cͰa text
struct {
int CacheId;
int Height; // Ĉ͢ r͢ng ch͸
int CharSpace; // Kho̬ng cách gi͸a các ký tͺ
Charlocation Table [128]; //b̬ng ch͸ cái
} fontcache;
ƒ Ký tӵ vector
Xây dӵng theo phѭѫng pháp ÿӏnh nghƭa các ký tӵ bӣi ÿѭӡng cong mӅm bao ngoài
cӫa chúng dӉ dàng thay ÿәi kích thѭӟc cӫa kí tӵ cNJng nhѭ nӝi suy ra các dҥng cӫa kí tӵ.
Hoàn toàn ÿӝc lұp vӟi thiӃt bӏ.
ƒ Tӕi ѭu nhҩt: lѭu trӳ font dѭӟi dҥng ÿѭӡng bao. Khi các chѭѫng trình ӭng dөng sӱ
dөng là bitmap tѭѫng ӭng vӟi chúng.
2.3.8. Giҧi thuұt sinh ÿa giác (Polygon)
a. Thu̵t gi̫i vͅ ÿ˱ͥng bao ÿa giác
ViӋc biӇu diӉn ÿa giác thông qua:
ƒ Tұp các ÿoҥn thҷng
ƒ Tұp các ÿiӇm thuӝc ÿa giác
Các loҥi ÿa giác:

Tam giác lӗi lõm tӵ cҳt miӅn


Hình 2.17 Các loҥi ÿa giác
Ĉa giác lӗi: là ÿa giác có ÿѭӡng thҷng nӕi bҩt ký 2 ÿiӇm bên trong nào cӫa ÿa giác
ÿӅu nҵm trӑn trong ÿa giác. Ĉa giác không lӗi là ÿa giác lõm.
Các ÿѭӡng thҷng bao ÿa giác - cҥnh cӫa ÿa giác. Các ÿiӇm giao cӫa cҥnh - ÿӍnh cӫa
ÿa giác. Thông tin cҫn thiӃt ÿӇ xác ÿӏnh ÿa giác:
ƒ Sӕ cҥnh
ƒ Toҥ ÿӝ các ÿӍnh cӫa ÿa giác
Giҧi thuұt:
Polygon (arrayx, arrayy,n)

34
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
{ if (n<3 //không ph̬i ÿa giác
exit;
for (i=1 ; i<= n-1; i++)
line(arrayx[i],arrayy[i], arrayx[i+1], arrayy[i+1]);
line(arrayx[i+1],arrayy[i+1], arrayx[1], arrayy[1]); }
b. Các thu̵t toán tô mi͉n kín ÿa giác
Lӧi thӃ cӫa hiӇn thӏ raster là: khҧ năng lѭu trӳ, copy, tô màu mӝt vùng...Có hai dҥng
vùng tô thѭӡng gһp ÿó là: tô bҵng mӝt màu thuҫn nhҩt (solid fill), tô theo mүu tô (fill
pattern) nào ÿó.
Còn thiӃt bӏ vector thì hҥn chӃ do các vùng tô màu tҥo ra bӣi mӝt tұp các ÿoҥn thҷng
sát nhau - làm chұm quá trình làm tѭѫi.
Giҧi thuұt ÿѭӡng biên (Boundary - fill Algorithm)
ƒ Bҳt ÿҫu tӯ 1 ÿiӇm (x,y) trong vùng cҫn ÿѭӧc tô màu:
o Xác ÿӏnh màu ÿiӇm: getpixel(x,y,c)
o Tô màu putpixel(x,y,c)
ƒ Bѭӟc tiӃp: kiӇm tra thuӝc tính màu các ÿiӇm lân cұn
o ĈiӇm lân cұn ÿã tô màu (exit)
o Trùng vӟi màu ÿѭӡng biên(exit)
o NӃu không thì tô màu
Các phѭѫng pháp xác ÿӏnh ÿiӇm lân cұn

4-connected 8-connected

Hình 2.18 Phѭѫng pháp tӏnh tiӃn giҧi thuұt


Giҧi thuұt tô màu ÿѭӡng biên:
#include <graphics.h>
#include <conio.h>
void FloodFill (int x, int y, int in_color, int new_color){
if (getpixel(x, y) == in_color){
putpixel(x, y, new_color);
FloodFill(x-1, y, in_color, new_color);
FloodFill(x+1, y, in_color, new_color);
FloodFill(x, y-1, in_color, new_color);
FloodFill(x, y+1, in_color, new_color);
}}
void main(){
int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "");
circle(getmaxx() / 2, getmaxy() / 2, 15);
FloodFill(getmaxx() / 2, getmaxy() / 2, 0, 4);
getch();
closegraph();}

35
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
ƒ Giҧi thuұt dòng quét (scanline) cho viӋc tô màu vùng
Giҧi thuұt dӵa trên ý tѭӣng sӱ dөng mӝt ÿѭӡng quét trên trөc y cӫa màn hình ÿi tӯ
ymax ÿӃn ymin cӫa vùng cҫn ÿѭӧc tô màu.
Vӟi mӛi giá trӏ y = yi ÿѭӡng thҷng quét cҳt các ÿѭӡng biên cӫa vùng cҫn tô tҥo ra
ÿoҥn thҷng y = yi vӟi x [xmin, xmax]. Trên ÿoҥn thҷng ÿó chúng ta tô màu các ÿiӇm tѭѫng
ӭng ÿi tӯ xmin ÿӃn xmax có các ÿiӇm tô (xi, yi) y = yi.
ƒ Ĉѫn giҧn nhҩt ví dө tô màu hình chӳ nhұt:
void scanline_rectg(x1,y1,x2,y2,c){ int i,j;
for(i=y1; i>=y2; i--)
for(j=x1; j<= x2;j++)
putpixel(i,j,c); }
ƒ Phép tô màu 1 ÿa giác bҩt kǤ sӁ phӭc tұp hѫn rҩt nhiӅu so vӟi hình chӳ nhұt
Giҧ sӱ vùng tô ÿѭӧc cho bӣi 1 ÿa giác n ÿӍnh: pi (xi,yi), i=0,1,....,n-1. Ĉa giác này có
thӇ là ÿa giác lӗi, ÿa giác lõm hay ÿa giác tӵ cҳt....
Các bѭӟc tóm tҳt chính cӫa thuұt toán:
ƒ Tìm ytop, ybottom lҫn lѭӧt là giá trӏ lӟn nhҩt, nhӓ nhҩt cӫa tұp các tung ÿӝ cӫa
các ÿӍnh cӫa ÿa giác ÿã cho.
ytop = max{yi,(xi,yi) P},
ybottom = min{yi,(xi,yi) P}.
ƒ Ӭng vӟi mӛi dòng quét y=k, vӟi k thay ÿәi tӯ ybottom ÿӃn ytop lһp:
o Tìm tҩt cҧ các hoành ÿӝ giao ÿiӇm cӫa dòng quét y=k vӟi các cҥnh
cӫa ÿa giác
o Sҳp xӃp các hoành ÿӝ giao ÿiӇm theo thӭ tӵ tăng dҫn: xo,x1,....
o Tô màu các ÿoҥn thҷng trên ÿѭӡng thҷng y=k lҫn lѭӧt ÿѭӧc giӟi hҥn
bӣi các cһp (xo,x1), (x2,x3), ......, (x2k,x2k+1).
Chúng ta sӁ gһp 1 sӕ vҩn ÿӅ sau:
ƒ Ӭng vӟi mӛi dòng quét không phҧi lúc nào tҩt cҧ các cҥnh cӫa ÿa giác cNJng
tham gia cҳt dòng quét. Do ÿó ÿӇ cҧi thiӋn tӕc ÿӝ cҫn phҧi có mӝt cách nào
ÿó ÿӇ hҥn chӃ ÿѭӧc sӕ cҥnh cҫn tìm giao ÿiӇm ӭng vӟi mӛi dòng quét.
y
yqmax

yq
yq

yqmin

x
Hình 2.19 Giҧi thuұt scanline cho mӝt ÿa giác bҩt kǤ

36
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
ƒ NӃu sӕ giao ÿiӇm tìm ÿѭӧc giӳa các cҥnh ÿa giác và dòng quét là lҿ (ÿiӅu này
chӍ xҧy ra khi dòng quét sӁ ÿi qua các ÿӍnh cӫa ÿa giác) khi ÿó ta sӁ tính sӕ
ÿiӇm là 2 thì có thӇ tô không chính xác. Ngoài ra, viӋc tìm giao ÿiӇm cӫa
dòng quét vӟi các cҥnh nҵm ngang là trѭӡng hӧp ÿһt biӋt...
ĈӇ giҧi quyӃt các vҩn ÿӅ trên ta có các phѭѫng pháp sau:
ƒ Danh sách các cҥnh kích hoҥt (AET - Active Edge Table)
Mӛi cҥnh cӫa ÿa giác ÿѭӧc xây dӵng tӯ 2 ÿӍnh kӅ nhau Pi(xi,yi) và Pi+1(xi+1,yi+1) gӗm
các thông tin sau:
ymin: giá trӏ nhӓ nhҩt trong 2 ÿӍnh cӫa cҥnh
xIntersect: hoành ÿӝ giao ÿiӇm cӫa cҥnh vӟi dòng quét hiӋn ÿang xét
DxPerScan: giá trӏ 1/m (m là hӋ sӕ góc cӫa cҥnh)
DeltaY: khoҧng cách tӯ dòng quét hiӋn hành tӟi ÿӍnh ymax
Danh sách các cҥnh kích hoҥt AET: danh sách này dùng ÿӇ lѭu các tұp cҥnh cӫa ÿa
giác có thӇ cҳt ӭng vӟi dòng quét hiӋn hành và tұp các ÿiӇm giao tѭѫng ӭng. Nó có mӝt sӕ
ÿһc ÿiӇm:
Các cҥnh trong danh sách ÿѭӧc sҳp xӃp theo thӭ tӵ tăng dҫn cӫa các hoành ÿӝ giao
ÿiӇm ÿӇ có thӇ tô màu các ÿoҥn giao mӝt cách dӉ dàng.
Thay ÿәi ӭng vӟi mӛi dòng quét ÿang xét, do ÿó danh sách này sӁ ÿѭӧc cұp nhұt liên
tөc trong quá trình thӵc hiӋn thuұt toán. Ĉҫu tiên ta có danh dách chӭa toàn bӝ các cҥnh
cӫa ÿa giác gӑi là ET (Edge Table) ÿѭӧc sҳp xӃp theo thӭ tӵ tăng dҫn cӫa ymin, rӗi sau mӛi
lҫn dòng quét thay ÿәi sӁ di chuyӇn các cҥnh trong ET thoҧ ÿiӅu kiӋn sang AET.
Mӝt dòng quét y=k chӍ cҳt 1 cҥnh cӫa ÿa giác khi và chӍ khi k>=ymin và 'y>0. Chính
vì vұy mà vӟi các tә chӭc cӫa ET (sҳp theo thӭ tӵ tăng dҫn cӫa ymin) ÿiӅu kiӋn ÿӇ chuyӇn
các cҥnh tӯ ET sang AET sӁ là k>=ymin; và ÿiӅu kiӋn ÿӇ loҥi mӝt cҥnh ra khӓi AET là
'y<=0
ƒ Công thӭc tìm giao ÿiӇm nhanh
NӃu gӑi xk,xk+1 lҫn lѭӧt là các hoành ÿӝ giao ÿiӇm cӫa mӝt cҥnh nào ÿó vӟi các dòng
quét y=k và y=k+1 ta có:
xk+1 - xk = 1/m ((k+1) - k) = 1/m hay xk+1 = xk + 1/m
Nhѭ vұy nӃu lѭu hoành ÿӝ giao ÿiӇm ӭng vӟi dòng quét trѭӟc lҥi, cùng vӟi hӋ sӕ
góc cӫa cҥnh, ta xác ÿӏnh ÿѭӧc hoành ÿӝ giao ÿiӇm ӭng vӟi dòng quét kӃ tiӃp theo công
thӭc trên. Nên thông tin cӫa cҥnh có 2 biӃn: DxPerScan , xIntersect.
ƒ Trѭӡng hӧp dòng quét ÿi ngang qua mӝt ÿӍnh:
Tính 1 giao ÿiӇm nӃu chiӅu cӫa 2 cҥnh kӅ cӫa ÿӍnh ÿó có xu hѭӟng tăng hay giҧm
Tính 2 giao ÿiӇm nӃu chiӅu cӫa 2 cҥnh kӅ cӫa ÿӍnh ÿó có xu hѭӟng thay ÿәi, nghƭa
là tăng-giҧm hay giҧm-tăng.

37
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
Pi-1 Pi+1
Pi+1 Pi-1
Pi

Pi Pi Pi+1 Pi
Pi-1 Pi+1 Pi-1
A B
Hình 2.20 Qui tҳc tính: mӝt giao ÿiӇm (A) và hai giao ÿiӇm (B)

Hình 2.21 lѭu ÿӗ thuұt toán scan - line


ƒ Giҧi thuұt tô vùng kín theo mүu (Pattern filling)
² object (ҧnh mүu)
A[m,n]
Vҩn ÿӅ: xác ÿӏnh ÿiӇm ӣ mүu và nhiӅu ÿiӇm tѭѫng ӭng vӟi chúng trên màn hình.
Phѭѫng pháp 1:
Tìm ÿiӇm neo ӣ ÿҫu trái nhҩt hàng ÿҫu tiên cӫa ÿa giác.

38
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
Nhѭӧc ÿiӇm: không có ÿiӇm ÿӏnh vӏ trí phân biӋt mӝt cách rõ ràng cho mүu tô trong
mӝt ÿa giác bҩt kǤ.
Phѭѫng pháp 2: sӱ dөng cho SRGP
Lҩy ÿiӇm neo ӣ gӕc toҥ ÿӝ, giҧ sӱ ta coi cҧ màn hình ÿѭӧc lát bӣi màu tô các thӵc
thӇ là các ÿѭӡng biên cho các vùng tô, vұy nӃu ngoài các thӵc thӇ các màu tô không ÿѭӧc
phép thӇ hiӋn.
y
y

neo

neo
x x

Hình 2.22 Phѭѫng pháp lҩy ÿiӇm neo


Tóm tҳt chѭѫng:
ĈӇ có thӇ hiӇn thӏ các ÿӕi tѭӧng ÿӗ hoҥ trên thiӃt bӏ hiӇn thӏ dҥng ÿiӇm mà ÿiӇn hình là
màn hình, cҫn phҧi có mӝt quá trình chuyӇn các mô tҧ hình hӑc cӫa các ÿӕi tѭӧng này
trong hӋ toҥ ÿӝ thӃ giӟi thӵc vӅ dãy các pixel tѭѫng ӭng gҫn vӟi chúng nhҩt trên toҥ ÿӝ
thiӃt bӏ. Quá trình này còn ÿѭӧc gӑi là quá trình chuyӇn ÿәi bҵng dòng quét. Yêu cҫu quan
trӑng nhҩt ÿӕi vӟi quá trình này ngoài viӋc phҧi cho kӃt quҧ xҩp xӍ tӕt nhҩt còn phҧi cho
tӕc ÿӝ tӕi ѭu.
Ba cách tiӃp cұn ÿӇ vӁ ÿoҥn thҷng gӗm thuұt toán DDA, thuұt toán Bresenham, thuұt
toán Midpiont ÿӅu tұp trung vào viӋc ÿѭa ra cách chӑn mӝt trong hai ÿiӇm nguyên kӃ tiӃp
khi ÿã biӃt ÿiӇm nguyên ӣ bѭӟc trѭӟc. Thuұt toán DDA ÿѫn giҧn chӍ dùng thao tác làm
tròn nên phҧi dùng các phép toán trên sӕ thӵc, trong khi ÿó thuұt toán Bresenham và
Midpiont ÿѭa ra cách chӑn phӭc tҥp hѫn nhѭng cho kӃt quҧ tӕt hѫn. Tѭѫng tӵ dùng hai
giҧi thuұt Bresenham và Midpiont ÿӇ vӁ ÿѭӡng tròn và ellpise và mӝt sӕ ÿѭӡng cong
khác.
Các thuұt toán tô màu vùng gӗm thuұt toán loang (ÿӋ qui) hay thuұt toán dòng quét.
Có thӇ tô cùng mӝt màu hay tô theo mүu.
Bài tұp:
1. ChӍ ÿӏnh các vӏ trí mành nào sӁ ÿѭӧc chӑn bӣi thuұt toán Bresenham lúc chuyӇn
quét mӝt ÿѭӡng thҷng tӯ toҥ ÿӝ pixel (1,1) sang toҥ ÿӝ pixel (8,5).
2. Dùng giҧi thuұt Bresenham viӃt hàm sinh ÿoҥn thҷng (xét tҩt cҧ các trѭӡng hӧp cӫa
hӋ sӕ góc).
3. Dùng giҧi thuұt Midpiont viӃt hàm sinh ÿoҥn thҷng (xét tҩt cҧ các trѭӡng hӧp cӫa
hӋ sӕ góc).

39
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
4. Dùng giҧi thuұt Midpiont viӃt hàm sinh ÿѭӡng tròn (toҥ ÿӝ tâm (xc,yc) và bán kính
r).
5. Dùng giҧi thuұt Midpiont viӃt hàm sinh ÿѭӡng ellipse (toҥ ÿӝ tâm (xc,yc) và bán
kính rx và ry ).
6. Tӯ hàm vӁ ÿѭӡng thҷng thiӃt kӃ và cài ÿһt hàm vӁ các hình sau: hình chӳ nhұt, ÿa
giác, ngôi nhà....
7. ViӃt giҧi thuұt tìm giao ÿiӇm hai ÿoҥn thҷng.
8. ViӃt chѭѫng trình tô màu Floodfill (sӱ dөng ÿӋ qui vӟi 4-connected).
9. Ĉѭa ra lѭu ÿӗ thuұt toán tô màu theo dòng quét.ViӃt thuұt toán tô màu scan-line.

40
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ

CHѬѪNG 3: CÁC PHÉP BIӂN ĈӘI ĈӖ HOҤ

3.1. CÁC PHÉP BIӂN ĈӘI HÌNH HӐC HAI CHIӄU


3.1.1. Phép biӃn ÿәi Affine (Affine Transformations)
Phép biӃn ÿәi Affine là phép biӃn ÿәi tuyӃn tính tӑa ÿӝ ÿiӇm ÿһc trѭng cӫa ÿӕi tѭӧng
thành tұp tѭѫng ӭng các ÿiӇm mӟi ÿӇ tҥo ra các hiӋu ӭng cho toàn ÿӕi tѭӧng.
Ví dө: phép biӃn ÿәi tӑa ÿӝ vӟi chӍ 2 ÿiӇm ÿҫu cuӕi cӫa ÿoҥn thҷng tҥo thành 2 ÿiӇm
mӟi mà khi nӕi chúng vӟi nhau tҥo thành ÿoҥn thҷng mӟi. Các ÿiӇm nҵm trên ÿoҥn thҷng
sӁ có kӃt quҧ là ÿiӇm nҵm trên ÿoҥn thҷng mӟi vӟi cùng phép biӃn ÿәi thông qua phép nӝi
suy.
3.1.2. Các phép biӃn ÿәi ÿӕi tѭӧng
Các ÿӕi tѭӧng phҷng trong ÿӗ hoҥ 2 chiӅu mô tҧ tұp các ÿiӇm phҷng. ĈiӇm trong ÿӗ hoҥ 2
chiӅu biӇu diӉn thông qua toҥ ÿӝ, viӃt dѭӟi dҥng ma trұn gӑi là vectѫ vӏ trí.
Có 2 dҥng biӇu diӉn:
Mӝt hàng và 2 cӝt: >x y@
ª xº
Hai hàng và 1 cӝt: « »
¬ y¼
Trong giáo trình chúng ta chӑn biӇu diӉn ÿiӇm là ma trұn hàng (mӝt hàng và 2 cӝt).
Tұp các ÿiӇm ÿѭӧc lѭu trӳ trong máy tính sӁ ÿѭӧc viӃt dѭӟi dҥng ma trұn vӏ trí cӫa
chúng. Chúng có thӇ là ÿѭӡng thҷng, ÿѭӡng cong, ҧnh....thұt dӉ dàng kiӇm soát các ÿӕi
tѭӧng thông qua các phép biӃn ÿәi chúng, thӵc chҩt các phép biӃn ÿәi ÿӗ hoҥ này ÿѭӧc
mô tҧ dѭӟi dҥng các ma trұn.
3.1.2.1. Phép bi͇n ÿ͝i v͓ trí
Giҧ sӱ ta có ÿiӇm P = [ x y ] trong mһt phҷng vӟi [x y] là vectѫ vӏ trí cӫa P, kí hiӋu là
[P]. Gӑi ma trұn T là ma trұn biӃn ÿәi sӁ có dҥng:

ªa b º
T «c d »
¬ ¼ y

P P’’

x
Hình 3.1 Phép biӃn ÿәi vӏ trí
Ta có ÿiӇm P sau phép biӃn ÿәi thành P’’ có giá trӏ [x’’ y’’].
Thӵc thi phép biӃn ÿәi ÿúng trên 1 ÿiӇm ҧnh sӁ ÿúng vӟi toàn bӝ ÿӕi tѭӧng.

41
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ

>X @* >T @ >x y@* ª«


a bº
» > ax  cy bx  dy @ >x y @
' '

¬c d ¼
Hay ta có: x’’ = ax + cy
y’’ = bx + dy
Xét ma trұn biӃn ÿәi T:
c Phép bҩt biӃn:
Khi ÿó: a = d =1 và b = c = 0 và ma trұn cho phép bҩt biӃn là:
ª1 0 º
T «0 1 »
¬ ¼
ª1 0º
>X @* >T @ >x y @* « » >x y@ >x' y '@
¬0 1 ¼
Vұy x’’=x và y = y’’ hay là P’’ = P chӭng tӓ bҩt biӃn qua phép biӃn ÿәi.
d Phép biӃn ÿәi tӹ lӋ (scaling):
ƒ NӃu d=1 và b = c = 0 thì ma trұn biӃn ÿәi là:
ª a 0º
T « 0 1»
¬ ¼
x’’ = ax
y’’ = y

ªa 0º
>X @* >T @ >x y @* « » > ax y@ >x ' y '@
¬0 1¼
P’’ dӏch chuyӇn theo trөc x vӟi tӹ lӋ a xác ÿӏnh.
ƒ NӃu b = c =0 thì ma trұn biӃn ÿәi là:
ªa 0 º
T «0 d »
¬ ¼
ªa 0 º
>X @* >T @ >x y @* « » >ax dy @ >x' y '@
¬0 d ¼
Hay tәng quát hѫn gӑi Sx, Sy lҫn lѭӧt là tӹ lӋ theo trөc x và trөc y, thì ma trұn tӹ lӋ
sӁ là:
ª Sx 0 º
T « 0 Sy »
¬ ¼
Khi Sx , Sy >1 gӑi là phép phóng to
Khi Sx, Sy <1 gӑi là phép thu nhӓ
ƒ Các trѭӡng hӧp ÿһc biӋt:

42
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
Sy=-1 Sx=Sy=-1
Sx=-1
P P
P’’ P

P’’ P’’

Ĉӕi xӭng qua y Ĉӕi xӭng qua x Ĉӕi xӭng qua gӕc toҥ ÿӝ
Hình 3.2 Các phép ÿӕi xӭng trên 2D
e Phép biӃn dҥng
Khi a = d = 1 thì toҥ ÿӝ cӫa P’’ phө thuӝc vào thay ÿәi cӫa b và c
ƒ Xét c = 0

ª1 bº
>X @* >T @ >x y @* « » >x bx  y @ >x' y '@
¬0 1 ¼

P’’

y’’=bx+y
P

bx

Hình 3.3 Phép biӃn dҥng theo trөc oy


Có P’’ không thay ÿәi giá trӏ toҥ ÿӝ x, còn y’’ thay ÿәi phө thuӝc vào cҧ b và x
ƒ Xét b = 0
ª1 0º
>X@* >T @ >x y @* « » >x  cy y@ >x ' y '@
¬c 1 ¼

cy x’’=x+cy

P P’’

Hình 3.4 Phép biӃn dҥng theo trөc ox


Chú ý: ÿiӇm gӕc toҥ ÿӝ P[0 0] bҩt biӃn vӟi mӑi phép biӃn ÿәi
f Phép quay
Có D>0 ngѭӧc chiӅu kim ÿӗng hӗ

43
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ

Hình 3.5 Phép quay trên 2D


Ta có:
P[x y]= [rcosE rsinE]
P’’[x’’ y’’] = [rcos(D+E) rsin(D+E)]
P’’[x’’ y’’] = [r(cosDcosE - sinDsinE)r(cosDsinE + sinDcosE)]
= [(xcosD - ysinD)(xsinD + ycosD)]
Vұy: x’’ = xcosD - ysinD
y’’ = xsinD + ycosD
Ta có:
[X’’]= [X]* [T] = [(xcosD - ysinD) (xsinD + ycosD)]
Vұy T tәng quát khi quay ÿӕi tѭӧng quanh gӕc toҥ ÿӝ 1 góc D bҩt kǤ là:
ª cos D sin D º
>T @ « sin D
¬ cos D »¼
3.1.2.2. Phép bi͇n ÿ͝i t͝ng hͫp
Phѭѫng pháp biӃn ÿәi sӱ dөng phép nhân ma trұn vӟi toҥ ÿӝ ÿiӇm thông qua các vectѫ vӏ
trí thұt sӵ hiӋu quҧ và ÿem lҥi công cө mҥnh vӅ ÿӗ hoҥ cho ngѭӡi sӱ dөng. Nhѭng thӵc tӃ
các thao tác thѭӡng cҫn không chӍ mӝt mà nhiӅu phép biӃn ÿәi khác nhau. Ta có phép
hoán vӏ khi nhân ma trұn là không thӵc hiӋn nhѭng khҧ năng tә hӧp các phép nhân lҥi cho
phép tҥo ra mӝt ma trұn biӃn ÿәi duy nhҩt. Làm giҧm bӟt ÿáng kӇ khӕi lѭӧng tính toán
trong quá trình biӃn ÿәi, làm tăng tӕc các chѭѫng trình ӭng dөng và tҥo ÿiӅu kiӋn cho viӋc
quҧn lý các biӃn ÿәi trong ӭng dөng.
Giҧ sӱ ta có P vӟi [X] = [x y], có hai phép biӃn ÿәi [T1] quay quanh gӕc toҥ ÿӝ 900:
ª 0 1º
T1 « »
¬  1 0¼
Và [T2] lҩy ÿӕi xӭng P qua gӕc toҥ ÿӝ:
ª 1 0 º
T2 « 0  1»
¬ ¼
Ta có:

44
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
ª 0 1º
>X '@ >X @* >T1@ >x y @* « » > y x@
¬ 1 0¼
ª 1 0 º
>X "@ >X '@* >T 2@ > y x @* « » >y  x@
¬ 0  1¼
Giҧ sӱ [T3] là ma trұn tәng hӧp [T1] và [T2]
ª0  1º
>X *@ >X @* >T 3@ >x y @* « » >y  x@
¬1 0 ¼
KӃt luұn: biӃn ÿәi qua nhiӅu ma trұn thành phҫn sӁ tѭѫng ÿѭѫng vӟi phép biӃn ÿәi
qua ma trұn tәng hӧp tӯ các phép biӃn ÿәi ÿó.
3.2. TӐA ĈӜ ĈӖNG NHҨT VÀ CÁC PHÉP BIӂN ĈӘI
3.2.1. Toҥ ÿӝ ÿӗng nhҩt
Ta xét phép tӏnh tiӃn:
x’’= x + dx
y’’ = y + dy
Vұy P’’ = P + [T]
ª dx º
>T @ «dy »
¬ ¼
Vұy phép biӃn ÿәi tәng hӧp:
P’’’’=P’’*[T’’] + [T’’’’] = (P + [T]) [T’’] + [T’’’’]
Rõ ràng không thӇ biӇu diӉn thông qua ma trұn tәng hӧp 2 chiӅu 2x2 ÿѭӧc. Phép
tӏnh tiӃn ÿѭa ra ma trұn biӃn ÿәi tәng hӧp là không thӇ.
ThӃ nào là phѭѫng pháp biӇu diӉn toҥ ÿӝ ÿӗng nhҩt ? là phѭѫng pháp biӇu diӉn mӣ
rӝng thông qua toҥ ÿӝ ÿӗng nhҩt cӫa các vectѫ vӏ trí không ÿӗng nhҩt [x y] là ӭng dөng
cӫa phép biӃn ÿәi hình hӑc mà ӣ ÿó toҥ ÿӝ ÿiӇm ÿѭӧc mô tҧ dѭӟi ma trұn [x* y* h] vӟi
x=x*/h, y=y*/h có h là mӝt sӕ thӵc tuǤ ý. Vұy mӝt vectѫ vӏ trí [xy] bҩt kǤ trên mһt phҷng
xoy bҵng tұp vô sӕ các ÿiӇm ÿӗng nhҩt [hx hyh]. Ví dө: [2 5] sӁ biӇu diӉn bҵng [4102],
[6153]..... ÿѫn giҧn nhҩt là [251].
Vұy toҥ ÿӝ ÿӗng nhҩt cӫa vectѫ vӏ trí [X]= [ x y 1]. Khi ÿó ma trұn biӃn ÿәi sӁ là
3x3:
ª a b 0º
>T @ « c d 0»
« »
«¬dx dy 1»¼

ª a b 0º
P ' P.>T @ >x y 1@* «« c d 0»»
¬«dx dy 1»¼
x’’=ax + cy +dx

45
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
y’’=bx + dy + dy
[X’’]= [x’’ y’’1]
Trong ÿó dx, dy là khoҧng tӏnh tiӃn theo trөc x và y.
3.2.2. Phép biӃn ÿәi vӟi toҥ ÿӝ ÿӗng nhҩt

ª a b 0º
[T ] «« c d 0»»
«¬m n 1»¼
Ma trұn biӃn ÿәi ÿӗng nhҩt
c Phép tӏnh tiӃn
Có a=d=1 và b=c=0
ª 1 0 0º
>T @ « 0 1 0»
« »
¬«m n 1»¼

ª 1 0 0º
[ x' y ' 1] [ x y 1]«« 0 1 0»» [ x  m y  n 1]
¬«m n 1»¼
Chú ý: trong mһt phҷng toҥ ÿӝ, mӑi ÿiӇm kӇ cҧ gӕc toҥ ÿӝ ÿӅu có thӇ biӃn ÿәi.
Phép biӃn ÿәi tәng hӧp cӫa hai phép tӏnh tiӃn theo khoҧng [m1 n1] và [m2n2] bҵng
phép biӃn ÿәi duy nhҩt mӝt khoҧng có giá trӏ bҵng tәng cӫa hai phép biӃn ÿәi
[m1+m2n1+n2].
Thұt vұy:
ª 1 0 0º ª 1 0 0º ª 1 0 0º
>T1@* >T 2@ « 0 1 0» * « 0 1 0»» « 0 1 0»»
« » « «
«¬m1 n1 1»¼ «¬m2 n 2 1»¼ «¬m1  m2 n1  n 2 1»¼

d Phép tӹ lӋ
Tѭѫng tӵ ma` trұn tӹ lӋ:

ª Sx 0 0º ª Sx 0 0º
« 0 Sy 0»
>Ts @ « » [ x' y ' 1] [ x y 1]«« 0 Sy 0»» [ x.Sx y.Sy 1]
¬« 0 0 1¼» «¬ 0 0 1»¼

Chú ý: Phép biӃn ÿәi tәng hӧp cӫa hai phép tӹ lӋ Sx1, Sx2 và Sy1,Sy2 bҵng phép
biӃn ÿәi duy nhҩt có tӹ lӋ là tích hai phép biӃn ÿәi trên Sx1*Sx2, Sy1*Sy2.
Cài ÿһt c/c++ cho phép tӹ lӋ ÿoҥn thҷng toҥ ÿӝ tӯ (x1,y1) ÿӃn (x2,y2):
x11=int(x1*1.1); x22=int(x2*0.9);
y11=int(y1*1.1); y22=int(y2*0.9);
e Phép quay
46
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ

y ( x’’, y’’ )

 ( x, y )

 
D
E x
Hình 3.6 Phép quay

ª cos D sin D 0º
[ x' y ' 1] [ x y 1] «« sin D cos D 0»»
«¬ 0 0 1»¼
>( x cosD  y sin D ) ( x sin D  y cosD ) 1@
Chú ý: Phép biӃn ÿәi tәng hӧp cӫa hai phép quay T1 và T2 là

Cài ÿһt c/c++ cho phép quay tam giác quanh gӕc toҥ ÿӝ :
void quay(int &x,int &y,float tamgiac(x1,y1,x2,y2,x3,y3,4);
goc){ quay(x1,y1,goc);
goc=goc*3.14/180; quay(x2,y2,goc);
int t=x; quay(x3,y3,goc);
x=x*cos(goc)-y*sin(goc); tamgiac(x1,y1,x2,y2,x3,y3,mau);
y=t*sin(goc)+y*cos(goc); }
3.2.3. Cài ÿһt c/c++ cho phép quay tam giác quanh 1 ÿiӇm (xq,yq):
#define RADS 0.017453293
void Quay(int x1,int y1, int x2, int y2, int x3, int y3,int xq, int yq,float
goc ){
float x11,y11,x22,y22,x33,y33;
float anpha = RADS *goc;
x11=int(x1*cos(anpha)-y1*sin(anpha)+(1-cos(anpha))*xq + sin(anpha)*yq);
y11=int(x1*sin(anpha)+y1*cos(anpha)-sin(anpha)*xq+(1 - cos(anpha))*yq);
x22=int(x2*cos(anpha)-y2*sin(anpha)+(1-cos(anpha))*xq + sin(anpha)*yq);
y22=int(x2*sin(anpha)+y2*cos(anpha)-sin(anpha)*xq+(1-cos(anpha))*yq);
x33=int(x3*cos(anpha)-y3*sin(anpha)+(1-cos(anpha))*xq + sin(anpha)*yq);
y33=int(x3*sin(anpha)+y3*cos(anpha)-sin(anpha)*xq+(1 - cos(anpha))*yq);
tamgiac(x11,y11,x22,y22,x33,y33,12);
}

47
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
3.3. CÁC PHÉP BIӂN ĈӘI HÌNH HӐC BA CHIӄU
Các phép biӃn ÿәi chuyӇn vӏ - translation, tӍ lӋ-scaling và quay-rotation sӱ dөng trong
không gian 2D ÿӅu có thӇ mӣ rӝng trong không gian 3D.
3.3.1.BiӇu diӉn ÿiӇm trong không gian 3 chiӅu
[x* y* z* h] hay[x*/h y*/hz*/h 1]
ViӃt gӑn hѫn:[x y z 1]
Ma trұn biӃn ÿәi tәng quát trong không gian 3D vӟi tӑa ÿӝ ÿӗng nhҩt (4x4)
ªa b c p º ªa b c 0º
«d e f q » «d e
[T ] « » « f 0»»
«g i j r » Hay T
«g i h 0»
« » « »
¬ l m n s¼ ¬dx dy dz 1¼

3.3.2. Phép tӏnh tiӃn


Ĉây là phép biӃn ÿәi ÿѫn giҧn nhҩt, mӣ rӝng tӯ phép biӃn ÿәi trong không gian 2D ta có:
ª1 0 0 0º
«0 1 0 0»»
[T (dx, dy, dz )] «
«0 0 1 0»
« »
¬dx dy dz 1¼

[X'] = [ X ] . [ T(dx,dy,dz) ]
[ x' y' z' 1 ] = [ x y z 1 ].[ T(dx,dy,dz) ]
= [ x+dx y+dy z+dz 1 ]
Hình 3.7 Phép tình tiӃn trên 3D
3.3.3. Phép tӍ lӋ
Tѭѫng tӵ trong 2D ta có phép tӍ lӋ trong 3D là :

ª Sx 0 0 0º
« 0 Sy 0 0»
Ts « »
« 0 0 Sz 0»
« »
¬ 0 0 0 1¼
Ta có Sx,Sy và Sz là các hӋ sӕ tӍ lӋ trên các trөc toҥ ÿӝ
[X’’] = [X] . [T(Sx,Sy,Sz) ]
ª Sx 0 0 0º
« 0 Sy 0 0»
[ x' y ' z ' 1] [ x y z 1] « »
« 0 0 Sz 0»
« » Hình 3.8 Phép tӹ lӋ trên 3D
¬ 0 0 0 1¼
= [x.Sxy.Sy z.Sz 1]

48
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
3.3.4. Phép biӃn dҥng
ƒ Ta có tҩt cҧ các phҫn tӱ nҵm trên ÿѭӡng chéo chính bҵng 1
ƒ Các phҫn tӱ chiӃu và tӏnh tiӃn bҵng 0
[X’’] = [X] . [Tsh]

ª1 b c 0º
«d 1 f 0»»
[ x' y ' z ' 1] [ x y z 1] «
«g i 1 0»
« »
¬0 0 0 1¼

[ x  yd  gz bx  y  iz cx  fy  z 1]

Hình 3.9 Các phép biӃn dҥng trên 3D


3.3.5. Phép lҩy ÿӕi xӭng
Ĉӕi xӭng qua trөc ox Ĉӕi xӭng qua mһt xoy Ĉӕi xӭng qua gӕc O
ª1 0 0 0º ª1 0 0 0º ª 1 0 0 0º
«0  1 0 0»» «0 1 0 0»» « 0 1 0 0»»
Mox « Mxoy « Mo «
«0 0  1 0» «0 0  1 0» « 0 0 1 0»
« » « » « »
¬0 0 0 1¼ ¬0 0 0 1¼ ¬0 0 0 1¼

3.3.6. Phép quay 3 chiӅu


3.3.6.1. Quay quanh các trͭc to̩ ÿ͡
Ĉѫn giҧn nhҩt là phép quay quanh các trөc toҥ ÿӝ ox,oy và oz vӟi góc dѭѫng:

Hình 3.10 Xác ÿӏnh góc quay dѭѫng trên 3 trөc toҥ ÿӝ
Khi này phép quay lҥi ÿѭa vӅ phép quay không gian 2D quanh gӕc toҥ ÿӝ
ƒ Quay quanh trөc oz:

49
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ

­ x' x cos D  y sin D ª cos M sin M 0 0º


° ' « sin M cos M 0 0»»
®y x sin D  y cos D [Tz ] «
° « 0 0 1 0»
¯ z' z « »
¬ 0 0 0 1¼

Hình 3.11 Quay quanh trөc oz


ƒ Quay quanh trөc ox:

­ x' x ª1 0 0 0º
° ' «0 cos I
®y y cos D  z sin D sin I 0»»
°z' [Tx ] «
¯ y sin D  z cos D «0  sin I cos I 0»
« »
¬0 0 0 1¼

Hình 3.12 quay quanh trөc ox


ƒ Quay quanh trөc oy:

­ x ' x cos D  z sin D ªcos T 0  sin T 0º


° « 0
® y' y 1 0 0»»
° z '  x sin D  z cos D [Ty ] «
¯ « sin T 0 cos T 0»
« »
¬ 0 0 0 1¼

Hình 3.13 quay quanh trөc oy


Ghi chú: phép quay trong không gian 3D sӱ dөng phép nhân ma trұn biӃn ÿәi không
có khҧ năng hoán vӏ các ma trұn.
3.3.6.2. Quay quanh m͡t trͭc b̭t kǤ song song vͣi các trͭc t͕a ÿ͡
ƒ Ĉҫu tiên chuyӇn dӏch ÿӕi tѭӧng cho ÿӃn khi toҥ ÿӝ ÿӏa phѭѫng cӫa ÿӕi tѭӧng
trùng vӟi trөc toҥ ÿӝ mà trөc ÿӏa phѭѫng song song.
Quay ÿӕi tѭѫng xung quanh trөc cӫa nó (chính là trөc toҥ ÿӝ)
ƒ Ĉѭa ÿӕi tѭӧng vӅ toҥ ÿӝ trѭӟc khi dӏch chuyӇn ta có ma trұn tәng hӧp là:
[TD//] = [Ttt-].[TD].[Ttt+]

50
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
Ví dө: quay ÿӕi tѭӧng xung quanh mӝt trөc // vӟi trөc z vӟi khoҧng dӏch chuyӇn là
x,y và gӕc quay là D.
Giҧi:
>TD // z @ >Ttt  @>. TD @>. Ttt  @
ª1 0 0 0º ª cos D sin D 0 0º ª1 0 0 0º
«0 1 0 0»» «« sin D cos D 0 0»» ««0 1 0 0»»
« . .
«0 0 1 0» « 0 0 1 0» « 0 0 1 0»
« »« »« »
¬ x  y 0 1 ¼ ¬ 0 0 0 1¼ ¬ x y 0 1¼
ª cos D sin D 0 0º ª1 0 0 0º
«  sin D cos D 0 0»» ««0 1 0 0»»
« .
« 0 0 0 0» « 0 0 1 0»
« »« »
¬( x cos D  y sin D ) ( x sin D  y cos D ) 0 1¼ ¬ x y 0 1¼
ª cos D sin D 0 0º
«  sin D cos D 0 0»»
«
« 0 0 1 0»
« »
¬ x(1  cos D )  y sin D y (1  cos D )  x sin D ) 0 1¼
3.3.6.3. Quay ÿ͙i t˱˯ng quanh m͡t trͭc b̭t kǤ
c Xét bài toán sau, hãy tìm ma trұn biӃn ÿәi ÿӇ ÿѭa mӝt trөc bҩt kǤ có hѭӟng: V=ax
+ by + cz vӅ trùng vӟi trөc oz theo chiӅu dѭѫng.
Ta thӵc hiӋn các bѭӟc nhѭ sau:
ƒ Quay V quanh trөc y mӝt góc (-D) sao cho
nҵm trên mһt phҷng (y, z) ÿѭӧc V1
ƒ Quay V1 quanh trөc x mӝt góc E sao cho
trùng vӟi trөc z ÿѭӧc V2

Hình 3.14 Quay ÿӕi tѭӧng quanh mӝt trөc


bҩt kǤ ÿi qua tâm

51
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
Bѭӟc 1:
y

D V
a

D x
c
V’’
z a
Hình 3.15 Quay V=ax+by+cz quanh trөc oy
Ta tính D?
ChiӃu V trên mһt phҷng (x,z) ÿѭӧc V’’. Ta có:
a
sin D
a2  c2
c
cos D
a  c2
2

ª c a º
ª cos D 0  sin(D ) 0º « 0 0»
« a c a c
2 2 2 2
« 0 0»» »
>T @
Dy
«
«sin( D )
1 0
cos D 0»
« 0
a
1 0
c

0 « 0 0»
« » « a  c2
2
a2  c2 »
¬ 0 0 0 1¼ «
¬ 0 0 0 1»¼

Vectѫ: V1 (0, b, a 2  c 2
y
Bѭӟc 2:

b
V1
V
a
E
x
c

V2 a
z
Hình 3.16 Quay vector V1 quanh trөc ox
b
sin E
a  b2  c2
2

a2  c2
cos E
a2  b2  c2

52
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
ª1 0 0 0º
ª1 0 0 0º « a  c2
2
b »
«0 cos E «0 0»
sin E 0»»
>T @
Ex
«
«0  sin E cos E 0»
«
«
a 2  b2  c2 a2  b2  c2 »
»
b a2  c2
« » «0  0»
¬0 0 0 1¼ « a2  b2  c2 a2  b2  c2 »
«¬0 0 0 1»¼

Vұy [Tv] = [T-Dy]. [TEx]


NӃu ÿѭa ngѭӧc lҥi ta ÿѭӧc:
>T @ >T @.>T @ >T @.>T @
v
1
Dy Ex
1
 Ex Dy

d Cho trөc quay L (vectѫ V = ax + by + cz) và mӝt ÿiӇm P nҵm trên trөc L. Hãy
tìm ma trұn biӃn ÿәi quay ÿӕi tѭӧng xung quanh trөc L mӝt góc T.
Giҧi:
Ta thӵc hiӋn nhѭ sau:
1. Tӏnh tiӃn P vӅ gӕc tӑa ÿӝ.
2. ChuyӇn trөc L vӅ trùng vӟi trөc OZ
3. Quay ÿӕi tѭӧng xung quanh trөc OZ mӝt góc T.
4. Thӵc hiӋn ngѭӧc lҥi 2,1
Vұy:
>T @ >T @>. T @.>T @.>T @.>T @
T ,L tt  v T ,Z v
1
tt 

3.3.7. Cài ÿһt bҵng c/c++ nhѭ sau:


ƒ Ĉәi 3D sang 2D
#define RADS 0.017453293
struct point{
int x,y,z;
}
point Diem3d(int &x, int &y, int &z) {
point p;
p.x = int(getmaxx()/2+ y - x*cos(RADS*45));
p.y = int(getmaxy()/2 - z + x*cos(RADS*45));
return p;
}
ƒ Quay quanh các trөc toҥ ÿӝ
point quay(int x,int y,int z,float goc,int truc){
point p;
if (truc==1){ //Quay quanh OX
p.y=y*cos(RADS*goc)-z*sin(RADS*goc);
p.z=y*sin(RADS*goc)+z*cos(RADS*goc);
p.x=x;
}
if (truc==2){ //Quay quanh OY
p.x=x*cos(RADS*goc)+z*sin(RADS*goc);
p.z=-x*sin(RADS*goc)+z*cos(RADS*goc);
p.y=y;

53
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
}
if (truc==3){
p.x=x*cos(RADS*goc)-y*sin(RADS*goc);
p.y=x*sin(RADS*goc)+y*cos(RADS*goc);
p.z=z;
}
return p;
}

Tóm tҳt:
Các phép biӃn ÿәi hình hӑc cho phép dӉ dàng thao tác trên các ÿӕi tѭӧng ÿã ÿѭӧc tҥo ra.
Chúng làm thay ÿәi mô tҧ vӅ toҥ ÿӝ cӫa các ÿӕi tѭӧng, tӯ ÿó ÿӕi tѭӧng sӁ ÿѭӧc thay ÿәi
vӅ hѭӟng, kích thѭӟc và hình dҥng. Các phép biӃn ÿәi hình hӑc cѫ sӣ bao gӗm tӏnh tiӃn,
quay và biӃn ÿәi tӹ lӋ. Ngoài ra mӝt sӕ phép biӃn ÿәi khác cNJng thѭӡng ÿѭӧc áp dөng ÿó
là phép ÿӕi xӭng và biӃn dҥng.
Các phép biӃn ÿәi hình hӑc 2D ÿӅu ÿѭӧc biӇu diӉn dѭӟi dҥng ma trұn ÿӗng nhҩt 3x3
ÿӇ tiӋn cho viӋc thӵc hiӋn các thao tác kӃt hӧp giӳa chúng. Trong hӋ toҥ ÿӝ ÿӗng nhҩt, toҥ
ÿӝ cӫa mӝt ÿiӇm ÿѭӧc mô tҧ bӣi mӝt vector dòng bao gӗm ba giá trӏ, hai giá trӏ ÿҫu tѭѫng
ӭng vӟi toҥ ÿӝ Descartes cӫa ÿiӇm ÿó, và giá trӏ thӭ ba là 1. Vӟi cách biӇu diӉn này, ma
trұn cӫa phép biӃn ÿәi có ÿѭӧc tӯ sӵ kӃt hӧp cӫa các phép biӃn ÿәi cѫ sӣ sӁ bҵng tích cӫa
các ma trұn cӫa các phép biӃn ÿәi thành phҫn.
Phép biӃn ÿәi hình hӑc 3D là sӵ mӣ rӝng cӫa phép biӃn ÿәi 2D. Tѭѫng tӵ nó cNJng
có các phép: tӏnh tiӃn, tӹ lӋ, biӃn dҥng và quay. Phӭc tҥp nhҩt là phép quay, nên chúng ta
khҧo sát lҫn lѭӧt tӯ ÿѫn giҧn ÿӃn phӭc tҥp: quay ÿӕi tѭӧng quanh các trөc toҥ ÿӝ, quanh 1
trөc song song vӟi trөc toҥ ÿӝ, quanh 1 trөc bҩt kǤ....Do khҧo sát các phép biӃn ÿәi affine
vӟi biӇu diӉn dҥng ma trұn ÿӗng nhҩt (4x4 vӟi 3D) nên công viӋc khá ÿѫn giҧn và nhҩt
quán.
Lѭu ý phép tӏnh tiӃn và quay có chung thuӝc tính là: sau khi biӃn ÿәi hình dҥng và
kích thѭӟc cӫa ÿӕi tѭӧng không thay ÿәi mà chúng chӍ bӏ thay ÿәi vӏ trí và ÿӏnh hѭӟng
trong không gian.
Bài tұp:
1.
a. Hãy tìm ma trұn biӇu thӏ phép quay mӝt ÿӕi tѭӧng mӝt góc 600 quanh gӕc
toҥ ÿӝ.
b. Tìm toҥ ÿӝ mӟi cӫa P(-3,3) sau khi thӵc hiӋn phép quay trên?
2.
a. Hãy viӃt dҥng tәng quát cӫa ma trұn ÿiӅu chӍnh tӹ lӋ tѭѫng ӭng vӟi mӝt
ÿiӇm cӕ ÿӏnh Q(a,b)?
b. Phóng lӟn tӭ giác có các ÿӍnh A(0,0), B(1,3), C(4,2) và D(3,1) lên hai lҫn
kích thѭӟc ban ÿҫu cӫa nó trong khi vүn giӳ ÿiӇm D(3,1)?
3.

54
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
a. Mô tҧ phép biӃn ÿәi nhҵm quay 1 ÿӕi tѭӧng mӝt góc D xung quanh mӝt
tâm cӕ ÿӏnh Q(a,b)?
b. Thӵc hiӋn phép quay tam giác ABC có A(0,0), B(1,1) và C(4,2) mӝt góc
450 xung quanh ÿiӇm (-1, -1)?
4. Cho 'ABC có các toҥ ÿӝ ÿӍnh là A(2,2), B(3,1) và C(4,3). Xác ÿӏnh ma trұn biӃn
ÿәi affine biӃn ÿәi tam giác này thành A’’B’’C’’ biӃt ҧnh A’’(4,3), B’’(4,5) và C’’(7,3).
5. qua
a. hãy tìm mӝt ma trұn dành cho phép phҧn chiӃu ÿӕi xӭng gѭѫng xung quanh
mӝt ÿѭӡng thҷng G vӟi ÿӝ dӕc m và tung ÿӝ gӕc (0,g)?

y P’’
G

g P
D
0
x

b. Tҥo phҧn xҥ ÿӕi xӭng gѭѫng ÿa giác mà ÿӍnh cӫa nó: A(-1,0), B(0,-2),
C(1,0) và D(0,2) xung quanh ÿѭӡng G trong các trѭӡng hӧp sau:
i. x=2
ii. y=3
iii. y=2x+3
6. Cho hình chóp ABCD có các toҥ ÿӝ A(0,0,0), B(1,0,0), C(0,1,0) và D(0,0,1). Quay
hình chóp quanh ÿѭӡng L (v=x+y+z) ÿi qua ÿiӇm C mӝt góc 450. Tìm toҥ ÿӝ hình
chóp mӟi.
7.
a. Hãy tìm phép biӃn ÿәi dành cho phép ÿӕi xӭng gѭѫng tѭѫng ӭng vӟi mӝt
mһt phҷng ÿã cho (có vector pháp tuyӃn M, trên ÿó có mӝt ÿiӇm P).

y Q
Q’’
M

b. Áp dөng tìm ma trұn cho phép ÿӕi xӭng gѭѫng vӟi mһt phҷng ÿi qua gӕc
toҥ ÿӝ và vector pháp tuyӃn có hѭӟng M=x+y+z.
8. ViӃt chѭѫng trình vӟi ÿӕi tѭӧng (ÿѭӡng thҷng, tam giác, tӭ giác...) trong mһt
phҷng 2D
a. Dӏch chuyӇn (dùng các phím dӏch chuyӇn)
55
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
b. Phóng lӟn, thu nhӓ (dùng phím dӏch chuyӇn hay gõ vào tӯ bàn phím)
c. Quay vӟi góc quay ÿѭӧc gõ vào tӯ bàn phím (góc gõ vào ÿѭӧc tính bҵng
ÿӝ)
9. ViӃt chѭѫng trình vӟi ÿӕi tѭӧng (hình kim cѭѫng, hình lұp phѭѫng ...) trong 3D
a. Dӏch chuyӇn
b. Phóng lӟn, thu nhӓ
c. Quay mӝt góc

56
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ

CHѬѪNG 4: CÁC GIҦI THUҰT ĈӖ HOҤ CѪ SӢ

4.1. MÔ HÌNH CHUYӆN ĈӘI GIӲA BA Hӊ THӔNG TOҤ ĈӜ


4.1.1. Mô hình chuyӇn ÿәi
HӋ tӑa ÿӝ Descartes là dӉ thích ӭng cho các chѭѫng trình ӭng dөng ÿӇ miêu tҧ các hình
ҧnh (picture) trên hӋ tӑa ÿӝ thӃ giӟi thӵc (World Coordinate System). Các hình ҧnh ÿѭӧc
ÿӏnh nghƭa trên hӋ tӑa ÿӝ thӃ giӟi thӵc này sau ÿó ÿѭӧc hӋ ÿӗ hӑa vӁ lên các hӋ tӑa ÿӝ
thiӃt bӏ (Device Coordinate). ĈiӇn hình, mӝt vùng ÿӗ hӑa cho phép ngѭӡi sӱ dөng xác
ÿӏnh vùng nào cӫa hình ҧnh sӁ ÿѭӧc hiӇn thӏ và bҥn muӕn ÿһt nó ӣ nѫi nào trên hӋ tӑa ÿӝ
thiӃt bӏ. Mӝt vùng ÿѫn lҿ hoһc vài vùng cӫa hình ҧnh có thӇ ÿѭӧc chӑn. Nhӳng vùng này
có thӇ ÿѭӧc ÿһt ӣ nhӳng vӏ trí tách biӋt, hoһc mӝt vùng có thӇ ÿѭӧc chèn vào mӝt vùng
lӟn hѫn. Quá trình biӃn ÿәi này liên quan ÿӃn nhӳng thao tác nhѭ tӏnh tiӃn, biӃn ÿәi tӹ lӋ
vùng ÿѭӧc chӑn và xóa bӓ nhӳng phҫn bên ngoài vùng ÿѭӧc chӑn.

Hình 4.1 WCS Hình 4.2 NDCS Normalized Hình 4.3 DCS
World Coordinate System Device Coordinate System Device Coordinate System

ƒ Qui trình ÿӇ chuyӇn ÿәi các ÿӕi tѭӧng trong WCS sang NDCS ÿѭӧc gӑi là
phép ánh xҥ cӱa sә sang khung nhìn hay phép biӃn ÿәi chuҭn hoá (Window
to Viewport mapping or Normalization Transformation)
ƒ Qui trình có thӇ áp các toҥ ÿӝ thiӃt bӏ hiӇn thӏ chuҭn hoá sang các thiӃt bӏ rӡi
rҥc ÿѭӧc gӑi là phép biӃn ÿәi trҥm làm viӋc (Workstation Transformation)
4.1.2. Phép ánh xҥ tӯ cӱa sә vào khung nhìn

Hình 4.4 Ĉӕi tѭӧng trong cӱa sә Hình 4.5 Ĉӕi tѭӧng tҥi khung nhìn
ƒ Mӝt cӱa sә (window) ÿѭӧc chӍ ÿӏnh bӣi bӕn toҥ ÿӝ thӵc (WCS): Xwmin,
Xwmax, Ywmin, Ywmax

57
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
ƒ Mӝt khung nhìn (viewport) ÿѭӧc mô tҧ bӣi bӕn toҥ ÿӝ thiӃt bӏ chuҭn hoá
(NDCS): Xvmin, Xvmax, Yvmin, Yvmax
Mөc ÿích cӫa phép ánh xҥ này là chuyӇn ÿәi các toҥ ÿӝ thӵc (Xw,Yw) cӫa mӝt ÿiӇm
tuǤ ý sang thiӃt bӏ chuҭn hoá tѭѫng ӭng (Xv,Yv). ĈӇ giӳ lҥi khoҧng cách cӫa ÿiӇm trong
khung nhìn bҵng vӟi khoҧng cách cӫa ÿiӇm trong cӱa sә, vӟi yêu cҫu:
xv  xv max x w  x w min
xv max  xv min x w max  x w min
yv  yv max yw  yw min
yv max  yv min yw max  yw min
Ta có:
( xv max  xv min )
xv ( x w  x w min )  xv max
( x w max  x w min )
( yv max  yv min )
yv ( yw  yw min )  yv max
( yw max  y w min )
Ta có tám giá trӏ ӣ trên ÿӇ xác ÿӏnh cӱa sә và khung nhìn ÿӅu là hҵng sӕ. Vұy chúng
ta hoàn toàn tính ÿѭӧc (Xv,Yv) tӯ (Xw, Yw) qua phép biӃn ÿәi:
[XvYv1] = [XwYw 1]. [T]
[T] = [Ttt-]. [Ts] . [Ttt]
ƒ Ma trұn tӏnh tiӃn theo window:
ª 1 0 0º
>Ttt  @ « 0 1 0»»
«
«¬ xw  yw 1»¼
ƒ Ma trұn chuyӇn ÿәi tӹ lӋ window vào viewport là:
ª xv max  xv min º
«x 0 0»
 xw min
« w max »
yv max  yv min
>T s @ «
«
0 0»
»
y w max  y w min
« 0 0 1»
« »
¬ ¼
ƒ Ma trұn tӏnh tiӃn theo toҥ ÿӝ viewport:
ª1 0 0º
>Ttt @ «0 1 0»»
«
«¬ xv yv 1»¼
Vұy ma trұn biӃn ÿәi tӯ cӱa sә vào khung nhìn:

58
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
ª xv max  xv min º
« 0 0»
« x w max  xw min »
« yv max  yv min
>T @ 0 0»
« y w max  y w min »
« »
« xv min  xw min . xv max  xv min yv min
y
 y w min . v max
 yv min

«¬ x w max  xw min y w max  y w min »¼

4.2. CÁC GIҦI THUҰT XÉN TIҦ (CLIPPING)


4.2.1. Khái niӋm
Xén tӍa là tiӃn trình xác ÿӏnh các ÿiӇm cӫa mӝt ÿӕi tѭӧng nҵm trong hay ngoài cӱa sә hiӇn
thӏ. Nҵm trong ÿѭӧc hiӇn thӏ, nҵm ngoài loҥi bӓ.
ViӋc loҥi tӯng ÿiӇm ҧnh cӫa ÿӕi tѭӧng thѭӡng chұm nhҩt là khi ÿӕi tѭӧng mà phҫn
lӟn nҵm ngoài cӱa sә hiӇn thӏ.
4.2.2. Clipping ÿiӇm
Giҧ sӱ (x,y) là toҥ ÿӝ cӫa mӝt ÿiӇm, vұy ÿiӇm ÿó ÿѭӧc hiӇn thӏ khi thoҧ mãn:
Xmin <= x <= Xmax
Ymin <= y <= Ymax

Các ÿoҥn thҷng không cҳt cӱa sә thì: hoһc nҵm NӃu ÿoҥn thҷng cҳt cӱa sә thì phân chia qua
trong hoàn toàn, hoһc nҵm ngoài hoàn toàn ÿiӇm cҳt phҫn nҵm trong và phҫn nҵm ngoài
4.2.3. Xén tӍa ÿoҥn thҷng
4.2.3.1. Thu̵t toán Cohen-Sutherland
Ý tѭӣng: Các ÿoҥn thҷng có thӇ rѫi vào các trѭӡng hӧp sau
ƒ HiӇn thӏ (visible): cҧ hai ÿҫu cuӕi cӫa ÿoҥn thҷng ÿӅu nҵm bên trong cӱa sә
ƒ Không hiӇn thӏ (not visible): ÿoҥn thҷng xác ÿӏnh nҵm ngoài cӱa sә. ĈiӅu này xҧy
ra khi ÿoҥn thҷng tӯ (x1,y1) ÿӃn (x2,y2) thoҧ màn bҩt kǤ mӝt trong bӕn bҩt ÿҷng
thӭc sau:
x1,x2 >xmaxy1,y2 > ymax
x1,x2 < xminy1,y2 < ymin
ƒ Xén tӍa: ÿoҥn thҷng cҫn xén tӍa
ViӋc cài ÿһt giҧi thuұt chia làm hai bѭӟc:
Bѭӟc 1 : Gán mã vùng 4-bit cho mӛi ÿiӇm cuӕi cӫa ÿoҥn thҷng

59
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ

Hình 4.6 Mһt phҷng mã trong các trѭӡng hӧp clipping ÿoҥn thҷng
Mã vùng ÿѭӧc xác ÿӏnh theo 9 vùng cӫa mһt phҷng mà các ÿiӇm cuӕi nҵm vào ÿó.
Mӝt bít ÿѭӧc cài ÿһt true (1) hoһc false (0).
Bít 1: ÿiӇm cuӕi ӣ bên trên cӱa sә = sign(y-ymax)
Bít 2: ÿiӇm cuӕi ӣ bên dѭӟi cӱa sә = sign(ymin-y)
Bít 3: ÿiӇm cuӕi ӣ bên phҧi cӱa sә = sign(x-xmax)
Bít 4: ÿiӇm cuӕi ӣ bên trái cӱa sә = sign(xmin-x)
Qui ѭӟc sign(a) = 1 nӃu a dѭѫng
= 0 nӃu a âm
Bѭӟc 2 :Quá trình kiӇm tra vӏ trí cӫa ÿoҥn thҷng so vӟi cӱa sә. Tҩt cҧ ÿiӇm ÿҫu và ÿiӇm
cuӕi cӫa ÿoҥn thҷng ÿã có mã.
Gi̫i thu̵t nh˱ sau :
Bѭӟc 1 :NӃu mã cӫa P1 hoһc P2 ÿӅu = 0000 thì toàn bӝ ÿoҥn thҷng thuӝc phҫn hiӇn thӏ.
If (P1.Mã OR P2.Mã == 0000) then““ cҧ ÿoҥn thҷng thuӝc cӱa sә hiӇn thӏ””
Bѭӟc 2 : NӃu mã cӫa P1 và P2 có cùng mӝt vӏ trí mà ӣ ÿó P1 và P2 => cùng phía
If (P1.Mã AND P2.Mã != 0000) then ““ 2 ÿiӇm nҵm vӅ 1 phía cӫa cӱa sә””
Bѭӟc 3: Xét giao ÿiӇm: D(1010)
B(1000)
ymax

A(0001)
ymin

C(0100)
xmin xmax
Hình 4.7 Mô tҧ thuұt toán Cohen Sutherland outcode
Tìm giao ÿiӇm cӫa ÿѭӡng thҷng vӟi cӱa sә, chính xác hѫn là vӟi phҫn mӣ rӝng cӫa
ÿѭӡng biên.
Chú ý: các ÿѭӡng biên mà ÿiӇm cuӕi ÿѭӧc chӑn sӁ ““ÿҭy ngang qua”” nhҵm thay ÿәi
m㠓“1”” thành ““0””
NӃu:
Bít 1 là 1: cҳt y=ymax
Bít 2 là 1: cҳt y= ymin
60
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
Bít 3 là 1: cҳt x=xmax
Bít 4 là 1: cҳt x=xmin
Nhìn trên hình ta có: gӑi ÿiӇm cuӕi cӫa ÿoҥn (x1,y1)
NӃu C ÿѭӧc chӑn thì ÿѭӡng y=ymin chӑn ÿӇ tính phҫn cҳt nhau (bít 2 = 1)
NӃu D ÿѭӧc chӑn thì y=ymax hoһc x=xmax (bít 1 và bít 3 =1)
Toҥ ÿӝ cҳt:
­ xi xmin / xmax x xmin
®
¯ yi y1  m( xi  x1 ) x xmax

Hoһc:
­ xi x1  ( yi  y1 ) / m y y min
®
¯ yi y min / y max y y max
Có m là ÿӝ dӕc cӫa ÿoҥn thҷng
m=(y2-y1)/(x2-x1)
Bây giӡ thay ÿiӇm cuӕi (x1,y1) vӟi ÿiӇm cҳt (xi,yi)
Ví dө: Cho cӱa sә cҳt tӍa hình chӳ nhұt có góc trái dѭӟi L(-3,1), góc phҧi trên R(2,6)
Hãy tìm mã vùng dành cho các ÿiӇm cuӕi cӫa các ÿoҥn AB có A(-2,3), B(1,2) ; CD
có C(-4,7), D(-2,10) ; IK có I(-4,2), K(-1,7)
Tìm hҥng mөc cҳt tӍa cӫa chúng
Giҧi:
ƒ Mã vùng
Bít 1 = sign(y-ymax) = sign(y-6)
Bít 2 = sign(ymin-y) = sign(1-y)
Bít 3 = sign(x-xmax) = sign(x-2)
Bít 4 = sign(xmin-x)= sign(-3-x)
Qui ѭӟc sign(a) = 1 nӃu a dѭѫng
= 0 nӃu a âm
Vұy:
A(-2,3) có (0000)
B(1,2) có (0000)
C(-4,7)có (1001)
D(-2,10) có (1000)
I(-4,2) có (0001)
K(-1,7) có (1000)
ƒ Hҥng mөc cҳt tӍa
AB có mã vùng ÿӅu là (0000) nên nó nҵm hoàn toàn trong
CD có (1001) and (1000) = (1000) (!= (0000)) nên hoàn toàn nҵm ngoài
IK có (0001) or (1000) =(1001) và (0001) and (1000) =(0000) nên phҧi xén tӍa.
Xét I(0001) dӵa trên ÿѭӡng biên xmin =-3
­ xc xmin
®
¯ yc y1  m( xc  x1 )
xmin = -3

61
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
m=(y2-y1)/x2-x1)= (7-2)/ (-1-(-4)) = 5/3
yc=2 + 5/3 (-3-(-4)) = 11/3
Thay I bӣi I1 (-3,11/3) (có mã vùng 0000)
Xét K(1000) cҳt ymax =6
­ xc x1  ( y c  y1 ) / m
®
¯ y c y max
yc=6
xc=-1 +(6-7)/(5/3)=-8/5
Thay K bӣi K1(-8/5,6) có mã vùng 0000)
Vұy sau khi xén tӍa ÿoҥn IK thu ÿѭӧc I1K1
Cài ÿһt bҵng c/c++ là :
#define LEFT_EDGE 0x1
#define RIGHT_EDGE 0x2
#define TOP_EDGE 0x8
#define BOTTOM_EDGE 0x4
#define INSIDE(a) (!a)
#define REJECT(a,b) (a&b)
#define ACCEPT(a,b) (!(a|b))
unsigned char encode(double x, double y, double xmin, double ymin,
double xmax, double ymax){
unsigned char code = 0x00;
if (x < xmin)
code = code | LEFT_EDGE;
if (x > xmax)
code = code | RIGHT_EDGE;
if (y < ymin)
code = code | TOP_EDGE;
if (y > ymax)
code = code | BOTTOM_EDGE;
return code;
}
4.2.3.2. Gi̫i thu̵t Lyangbarsky
: U1=0 P1(x1,y1)

P(u) P2(x2,y2)
U2=1

O
Hình 4.8 Phѭѫng trình tham sӕ cho ÿoҥn thҷng
BiӇu diӉn ÿoҥn thҷng theo tham biӃn: ÿoҥn thҷng bҩt kǤ ÿi qua hai ÿiӇm P1(x1,y1) và
P2(x2,y2) chúng ta có phѭѫng trình tham biӃn :
x=x(u) có 0<=u<=1

62
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
y=y(u)
Vì vectѫ chӍ có mӝt chiӅu nên vectѫ vӏ trí:
P(u)=P1 + (P2-P1).u
x = x1 + (x2 - x1)u = x1 + 'x.u
y = y1 + (y2 - y1)u = y1 + 'y.u

U1=1
top P2
Ur
ymax
P1 Ut
left
Ul right
U0=0
ymin
Ub
bottom

xmin xmax

Hình 4.9 Mô tҧ giҧi thuұt LyaBarsky


ƒ Khi ta chuyӇn ÿӝng dӑc theo ÿѭӡng mӣ rӝng vӟi u thҷng tӯ -f tӟi +f thì ta phҧi:
o ChuyӇn tӯ bên ngoài vào bên trong hai ÿѭӡng biên cӫa cӱa sә cҳt tӍa (ӣ dѭӟi
và bên trái)
o Sau ÿó chúng ta di chuyӇn tӯ trong ra bên ngoài cӫa hai ÿѭӡng biên khác (tӯ
trên và tӯ bên phҧi)
ƒ Vӟi ÿiӇm (x,y) nҵm bên trong cӱa sә cҳt tӍa:
xmin <= x1 + 'x.u <= xmax
ymin <= y1 + 'y.u <= ymax
Suy ra:
-'x.u <= x1 –– xmin k=1
'x.u <= xmax –– x1 k=2
-'y.u <= y1 –– ymin k=3
'y.u <= ymax –– y1 k=4
ViӃt tәng quát:
Pk.u <=qk có k=1,2,3,4
Trong ÿó:
P1 = -'xq1=x1 –– xmin (phҧi)
P2 = 'xq2=xmax –– x1 (trái)
P3 = -'yq3=y1 –– ymin (trên)
P4 = 'yq4=ymax –– y1 (dѭӟi)
Xét:
ƒ NӃu Pk = 0: ÿiӅu ÿó tѭѫng ÿѭѫng vӟi viӋc ÿoҥn thҷng ÿang xét song song vӟi cҥnh
thӭ k cӫa hình chӳ nhұt clipping.
63
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
a) NӃu qk < 0 ÿoҥn thҷng nҵm ngoài cӱa sә (hӋ bҩt phѭѫng trình trên vô nghiӋm)
b)NӃu qk >= 0 thì ÿoҥn thҷng nҵm trong hoһc nҵm trên cҥnh cӫa cӱa sә clipping.
Yêu cҫu khҧo sát tiӃp.
ƒ NӃu Pk  0: ÿoҥn thҷng ÿang xét sӁ cҳt cҥnh k tѭѫng ӭng cӫa cӱa sә clipping tҥi vӏ
trí trên ÿoҥn thҷng uk = qk/Pk
a) Pk < 0 ÿoҥn thҷng có dҥng ÿi tӯ ngoài vào trong cӫa ÿѭӡng biên tѭѫng ӭng
b) Pk > 0 thì ÿoҥn thҷng mӣ rӝng tiӃn hành tӯ trong ra ngoài cӫa ÿѭӡng biên tѭѫng
ӭng.
KӃt hӧp lҥi ta có các bѭӟc sau:
(Vӟi u0 <= u<= u1)
Bѭӟc 1:NӃu Pk=0
qk <0 ӭng vӟi bҩt kǤ giá trӏ nào cӫa k. Loҥi bӓ ÿoҥn thҷng => Exit
qk>=0 thӵc hiӋn bѭӟc tiӃp theo
Bѭӟc 2: Tính:

§ ­ qk ½·
U0 max¨¨ ^0` ‰ ®u k : u k , Pk  0¾ ¸¸
© ¯ Pk ¿¹
§ ­ qk ½·
U1 min¨¨ ^1` ‰ ®u k : u k , Pk ! 0¾ ¸¸
© ¯ Pk ¿¹
u0 là các giá trӏ cӵc ÿҥi cӫa tұp hӧp ÿang chӭa 0 và các giá trӏ uk ÿѭӧc tính
u1 là các giá trӏ cӵc tiӇu cӫa tұp hӧp ÿang chӭa 1 và các giá trӏ uk ÿѭӧc tính
Ví dͭ: cho cӱa sә cҳt tӍa hình chӳ nhұt có góc trái dѭӟi L(1,2) và góc phҧi trên
R(9,8). Có các ÿoҥn AB toҥ ÿӝ A(11,10) và B(11,6), ÿoҥn CD toҥ ÿӝ C(3,2) và D(8,4),
ÿoҥn IJ toҥ ÿӝ I(-1,7) và J(11,1). Tìm các hҥng mөc cҳt tӍa.
Gi̫i:
ƒ Xét AB
P1 = 0q1=10
P2 = 0q2=-2
P3 = -4q3=4
P4 = 4q4=2
Có P2 =0 mà q2 =-2<0 nên AB nҵm hoàn toàn ngoài
ƒ Xét CB
P1 = -5q1=2 u1=-2/5 (uk=qk/pk)
P2 = 5 q2=6 u2=6/5
P3 = -2q3=0 u3=0
P4 = 2 q4=6 u4=3
Vұy U0=max(0,-2/5,0)=0 (vӟi Pk<0)
U1=min(1,6/5,3)=1(vӟi Pk>0)
64
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
Vұy CD nҵm hoàn toàn trong cӱa sә
ƒ Xét IJ
P1 = -12q1=-2 u1=1/6
P2 = 12 q2=10 u2=5/6
P3 = 6q3=5 u3=5/6
P4 = -6 q4=1 u4=-1/6
Vұy u0=max(0,1/6,-1/6)=1/6 (vӟi Pk<0)
u1=min(1,5/6,5/6)=5/6(vӟi Pk>0)
Vì u0<u1 nên hai ÿiӇm cuӕi cӫa ÿѭӡng cҳt tӍa là:
Xc1=x1 + 'x.u0 = -1 +(11-(-1)).1/6 =1
Yc1=y1 + 'y.u0= 7 +(1-7).1/6 =6
Xc2=x1 + 'x.u1 = -1 +(11-(-1)).5/6 =9
Yc2=y1 + 'y.u1= 7 +(1-7).5/6 =2
Vұy ÿѭӡng sau khi cҳt tӍa là: I1I2 có I1(1,6) và I2(9,2)
Cài ÿһt bҵng c/c++ là :
#define TRUE 1
#define FALSE 0
int cliptest(double p, double q, double *u0, double *u1) {
double r; int retVal = TRUE;
if (p < 0.0) {
r = q / p;
if (r > *u1)
retVal = FALSE;
else
if (r > *u0)
*u0 = r; }
else
if ( p > 0.0) {
r = q / p;
if (r < *u0)
retVal = FALSE;
else
if (r < *u1)
*u1 = r;
}
Else {
if (q < 0.0)
retVal = FALSE;
}
return (retVal);
}
void clipline(double x1, double y1, double x2, double y2,
double xmin, double ymin, double xmax, double ymax){
double u0 = 0.0, u1 = 1.0, dx, dy;
double oldx1, oldy1, oldx2, oldy2;
oldx1 = x1; oldy1 = y1;
oldx2 = x2; oldy2 = y2;

65
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
dx = x2 - x1;
if (cliptest(-dx, x1 - xmin, &u0, &u1))
if (cliptest(dx, xmax-x1, &u0, &u1)) {
dy = y2 - y1;
if (cliptest(-dy, y1 - ymin, &u0, &u1))
if (cliptest(dy, ymax - y1, &u0, &u1)){
if (u1 < 1.0){
x2 = x1 + u1 * dx;
y2 = y1 + u1 * dy;
}
if (u0 > 0.0){
x1 += u0 * dx;
y1 += u0 * dy; }
setcolor(RED);
line(oldx1, oldy1, x1, y1);
line(x2, y2, oldx2, oldy2);
setcolor(YELLOW);
line(x1, y1, x2, y2);
}}}
4.2.4. Giҧi thuұt xén tӍa ÿa giác (Sutherland Hodgman)
4.2.4.1. Khái ni͏m
Theo qui ѭӟc: mӝt ÿa giác vӟi các ÿӍnh P1, .....,PN (các cҥnh là Pi-1Pi và PNP1) ÿѭӧc gӑi là theo
hѭӟng dѭѫng nӃu các hình theo thӭ tӵ ÿã cho tҥo thành mӝt mҥch ngѭӧc chiӅu kim ÿӗng hӗ.
NӃu bàn tay trái cӫa mӝt ngѭӡi dӑc theo bҩt kǤ cҥnh Pi-1Pi hoһc PNP1 cNJng chӍ vӅ bên
trong ÿa giác.

L
R

Hình 4.10 Qui tҳc tìm hѭӟng dѭѫng cӫa mӝt ÿa giác hѭӟng
Khҧo sát mӝt ÿiӇm so vӟi mӝt ÿѭӡng thҷng:

ABxAP
K
P(x,y)

A(x1,y1) B(x2,y2)
Hình 4.11 Khҧo sát mӝt ÿiӇm so vӟi ÿѭӡng thҷng
Có ÿiӇm A(x1,y1), B(x2,y2) và P(x,y)
Theo ÿӏnh nghƭa thì tích cӫa hai vectѫ (ABxAP) chӍ theo hѭӟng cӫa vectѫ KA vӟi
mһt phҷng (xoy). Có:
AB=(x2-x1)i + (y2-y1)j
AP=(x-x1)i + (y-y1)j

66
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
Vұy ABxAP=[ (x2-x1).(y-y1) –– (y2-y1).(x-x1) ].K
Do ÿó hѭӟng ÿѭӧc xác ÿӏnh nhѭ sau:
C ( x2  x1 )( y  y1 )  ( y 2  y1 )( x  x1 )
NӃu C dѭѫng thì P nҵm bên trái AB
NӃu C âm thì P nҵm bên phҧi AB
4.2.4.2. Gi̫i thu̵t Hodgman
Cho P1,......,PN là danh sách các ÿӍnh cӫa ÿa giác ÿã bӏ cҳt tӍa. Cho cҥnh AB (ÿiӇm A,B) là
cҥnh bҩt kǤ. Ĉa giác cҳt tӍa lӗi hѭӟng dѭѫng.
output A A A A
Pi-1
Pi A
output Pi

I
Pi-1 Pi Pi-1 B
B B B Pi-1
I
Pi output
output

Hình 4.12 Các trѭӡng hӧp trong giҧi thuұt Hodgman


ƒ NӃu cҧ Pi-1 và Pi ÿӅu nҵm bên trái cӫa cҥnh này thì Pi ÿѭӧc lѭu lҥi (ÿѭa vào output)
cӫa ÿa giác cҳt tӍa.
ƒ NӃu cҧ Pi-1 và Pi ÿӅu nҵm bên phҧi cӫa cҥnh thì không có ÿӍnh nào ÿѭӧc lѭu lҥi.
ƒ NӃu Pi-1 nҵm bên trái và Pi nҵm bên phҧi cӫa cҥnh thì giao ÿiӇm I cӫa Pi-1Pi vӟi
cҥnh sӁ ÿѭӧc lѭu lҥi.
ƒ NӃu Pi-1 nҵm bên phҧi và Pi nҵm bên trái thì cҧ giao ÿiӇm I và Pi ÿӅu ÿѭӧc lѭu lҥi.
4.2.4.3. Minh ho̩ thu̵t toán Sutherland –– Hodgman
F=P1 (F là ÿӍnh ÿѭӧc ÿѭa vào ÿҫu tiên, S là ÿӍnh ÿѭa vào trѭӟc P - ÿӍnh ÿѭӧc ÿѭa). Sѫ ÿӗ
bên phҧi khép kín ÿa giác bӣi PNP1

67
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ

Begin

P(Vertex Input)
Vertex Output, F,AB,N

I=1 TiӃp
S=Pi
N
Y
SF cҳt AB
N i=1
i++ F=P1 Y

N Tìm giao I
SPi cҳt
AB
Y
Vertex output I
Giao cҳt I

Vertex output End


I

S=Pi

Y N Y
i<N S bên trái Vertex output
AB S
N
End

Hình 4.13 Sѫ ÿӗ khӕi thuұt toán Hodgman


4.2.4.4. Ví dͭ minh ho̩:
A
D B C5
A D
A A D C4
A A
B
B C1
B C
A C2
B C3 C
A B B C B
D D
A E5 D
D A
E4
D E1

E2 B E3 C
D B D C
Hình 4.14 Ví dө dùng giҧi thuұt Hodgman xén tӍa ÿa giác A1...A5
68
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
Ví dө 2: hãy sӱ dөng thuұt toán Hodgman ÿӇ cҳt xén ÿoҥn thҷng nӕi P1(-1,2) ÿӃn P2(6,4)
trên cӱa sә A(1,1), B(5,1), C(5,3) và D(1,3)
I1 P2(6,4)
I2
D(1,3)
C(5,3)

I3

P1(-1,2)
B(5,1)
A(1,1)

Hình 4.15 Ví dө dùng thuұt toán Hodgman xén tӍa ÿoҥn P1P2
Theo thuұt toán Hodgman ta xén P1P2 dӵa trên tӯng cҥnh.
ƒ AB: ta xét C=(x2-x1)(y-y1) –– (y2-y1)(x-x1)
ĈiӇm P1: C=(5-1)(2-1)-(1-1)(-1-1) = 4 >0 nҵm bên trái
ĈiӇm P2: C= (5-1)(4-1)-(1-1)(-1-1) = 12 >0 nҵm bên trái
Vұy P1P2 ÿӅu ÿѭӧc lѭu
ƒ BC
ĈiӇm P1:C = (5-5)(2-1)-(3-1)(-1-5)= 12 >0 nҵm bên trái
ĈiӇm P2:C = - (3-1)(6-5) = -2 <0 nҵm bên phҧi
42 2
Giao ÿiӇm I1: m
6  (1) 2

­ xc 5
°
®y 2 5
°̄ c y1  ( xc  x1 )m 2  (5  (1)). 3
7 7
I1(5,26/7) vұyP1I1 lѭu lҥi
ƒ CD
ĈiӇm P1: C = (1-5)(2-3) = 4 >0 nҵm bên trái
ĈiӇm I1:C=(1-5)(26/7 -3) = -20/7 <0 nҵm bên phҧi
Giao ÿiӇm I2:
­ yc 3
°° xc x1  ( yc  y1 ) / m
®
° 7 5
°¯ 1  (3  2).
2 2
VұyI2(5/2,3)có P1I2ÿѭӧc lѭu
ƒ DA
ĈiӇm P1: C = -(1-3)(-1-1) = -4nҵm bên phҧi
ĈiӇm I2: C = -(1-3)(5/2-1) = 7/2nҵm bên trái
Giao ÿiӇm I3:

69
Chѭѫng 4: Các giҧi thuұt ÿӗ hoҥ cѫ sӣ
­ xc 1
°° y c y1  ( xc  x1 )m
® I3(1, 18/7)
° 2 4
2  (1  (1)). 2
°¯ 7 7
Tóm lҥi: Cҳt xén ÿoҥn P1P2 ÿѭӧc ÿoҥn I2I3có I2(5/2,3) và I3(1,18/7)
Tóm tҳt chѭѫng:
HiӇn thӏ ÿӕi tѭӧng là quá trình ÿѭa các mô tҧ ÿӕi tѭӧng tӯ thӃ giӟi thӵc sang mӝt thiӃt bӏ
xuҩt cө thӇ nào ÿó. Mӛi ÿӕi tѭӧng có thӇ ÿѭӧc quan sát ӣ nhiӅu vӏ trí và góc ÿӝ khác
nhau. Thông thѭӡng mӛi hình ҧnh mà chúng ta quan sát ÿѭӧc trên màn hình thiӃt bӏ ÿѭӧc
gӑi là mӝt góc nhìn (view) cӫa ÿӕi tѭӧng.
Quá trình loҥi bӓ các phҫn hình ҧnh nҵm ngoài mӝt vùng cho trѭӟc ÿѭӧc gӑi là xén
tӍa. Vùng ÿѭӧc dùng ÿӇ xén tӍa gӑi là cӱa sә xén tӍa.
Các thuұt toán xén tӍa ÿoҥn thҷng Cohen-Sutherland, LyaBarsky ÿӅu tұp trung giҧi
quyӃt hai vҩn ÿӅ chính nhҵm tӕi ѭu tӕc ÿӝ thuұt toán ÿó là: loҥi bӓ viӋc tìm giao ÿiӇm ÿӕi
vӟi các ÿoҥn thҷng chҳc chҳn không cҳt cӱa sә (nhѭ nҵm hoàn toàn trong, nҵm hoàn toàn
ngoài), và vӟi ÿoҥn thҷng có khҧ năng cҳt cӱa sә, cҫn phҧi tìm cách hҥn chӃ sӕ lҫn tìm
giao ÿiӇm vӟi các biên không cҫn thiӃt. Thuұt toán Cohen-Sutherland giҧi quyӃt hai ý này
thông qua kiӇu dӳ liӋu mã vùng mà vӅ bҧn chҩt ÿó chӍ là sӵ mô tҧ vӏ trí tѭѫng ÿӕi cӫa
vùng ÿang xét so vӟi các biên cӫa cӱa sә. Còn thuұt toán LyaBarsky thì tuy dӵa vào
phѭѫng trình tham sӕ cӫa ÿoҥn thҷng ÿӇ lұp luұn nhѭng thӵc chҩt là dӵa trên viӋc xét các
giao ÿiӇm có thӇ có giӳa ÿoҥn thҷng kéo dài vӟi các biên cӫa cӱa sә (cNJng ÿѭӧc kéo dài).
Các giao ÿiӇm này tѭѫng ӭng vӟi các giá trӏ rk = qk/pk. Cҧ hai thuұt toán này ÿӅu có thӇ
ÿѭӧc mӣ rӝng cho viӋc xén hình trong ÿӗ hoҥ 3D.
Bài tұp:
1. Tìm phép biӃn ÿәi chuҭn hoá tҥo ánh xҥ cho mӝt cӱa sә mà góc bên trái phía dѭӟi
cӫa nó (1,1) và góc bên phҧi trên (3,5) vào:
a. Là màn hình thiӃt bӏ ÿѭӧc chuҭn hoá toàn bӝ.
b. Mӝt khung nhìn có góc bên trái dѭӟi (0,0) và góc bên trái trên (1/2,1/2)
2. Cho cӱa sә cҳt tӍa hình chӳ nhұt có góc bên trái dѭӟi (-3,-2) và góc phҧi trên
(2,3), dùng giҧi thuұt Cohen Sutherland xén tӍa ÿoҥn thҷng AB có toҥ ÿӝ là A(3,2)
và B(-2,-4).
3. Cho cӱa sә cҳt tӍa hình chӳ nhұt có góc bên trái dѭӟi (-3,-2) và góc phҧi trên
(2,3), dùng giҧi thuұt LyaBarsky xén tӍa ÿoҥn thҷng AB có toҥ ÿӝ là A(3,2) và B(-
2,-4).
4. ViӃt chѭѫng trình cài ÿһt thuұt toán Cohen Sutherland.
5. ViӃt chѭѫng trình cài ÿһt thuұt toán LyaBarsky
ViӃt chѭѫng trình cài ÿһt thuұt toán Sutherland Hodgman

70
Chѭѫng 5: Phép chiӃu

CHѬѪNG 5: PHÉP CHIӂU ––PROJECTION

5.1. KHÁI NIӊM CHUNG


5.1.1.Nguyên lý vӅ 3D (three-Dimension)
Ĉӗ hӑa 3 chiӅu (3D computer graphics) bao gӗm viӋc bә xung kích thѭӟc vӅ chiӅu sâu
cӫa ÿӕi tѭӧng, cho phép ta biӇu diӉn chúng trong thӃ giӟi thӵc mӝt cách chính xác và sinh
ÿӝng hѫn.
Tuy nhiên các thiӃt bӏ truy xuҩt hiӋn tҥi ÿӅu là 2 chiӅu, Do vұy viӋc biӇu diӉn ÿѭӧc
thӵc thi thông qua phép tô chát (render) ÿӇ gây ҧo giác (illusion) vӅ ÿӝ sâu
Ĉӗ hoҥ 3D là viӋc chyӇn thӃ giӟi tӵ nhiên dѭӟi dҥng các mô hình biӇu diӉn trên các
thiӃt bӏ hiӇn thӏ thông qua kӻ thuұt tô chát (rendering).
5.1.2. Ĉһc ÿiӇm cӫa kӻ thuұt ÿӗ hoҥ 3D
Có các ÿӕi tѭӧng phӭc tҥp hѫn các ÿӕi tѭӧng trong không gian 2D
ƒ Bao bӣi các mһt phҷng hay các bӅ mһt
ƒ Có các thành phҫn trong và ngoài
Các phép biӃn ÿәi hình hӑc phӭc tҥp
Các phép biӃn ÿәi hӋ toҥ ÿӝ phӭc tҥp hѫn
Thѭӡng xuyên phҧi bә xung thêm phép chiӃu tӯ không gian 3D vào không gian 2D
Luôn phҧi xác ÿӏnh các bӅ mһt hiӇn thӏ
5.1.3.Các phѭѫng pháp hiӇn thӏ 3D
Vӟi các thiӃt bӏ hiӇn thӏ 2D thì chúng ta có các phѭѫng pháp sau ÿӇ biӇu diӉn ÿӕi tѭӧng
3D:
ƒ Kӻ thuұt chiӃu (projection): Trӵc giao (orthographic)/phӕi cҧnh (perspective)
ƒ Kӻ thuұt ÿánh dҩu ÿӝ sâu (depth cueing)
ƒ Nét khuҩt (visible line/surface identification)
ƒ Tô chát bӅ mһt (surface rendering)
ƒ Cҳt lát (exploded/cutaway scenes, cross-sections)
Các thiӃt bӏ hiӇn thӏ 3D:
ƒ Kính stereo - Stereoscopic displays*
ƒ Màn hình 3D –– Holograms

71
Chѭѫng 5: Phép chiӃu
Exploded/cutaway Perspective (phӕi Shadows as depth cues (tҥo bóng cҧm
scenes (cҳt lát) cҧnh) and Depth of giác có chiӅu sâu)
Field (chiӅu sâu)

Hình 5.1 Các cách mô tҧ ÿӕi tѭӧng 3D

Hình chiӃu cҥnh Hình chiӃu bҵng Hình chiӃu ÿӭng


Hình 5.2 Các góc nhìn khác nhau cӫa mô hình 3D

x2  y2  z2 r2

Mô hình 3D Nét khuҩt (Implicit)


Ĉa giác (3D Modelling)
(Polygonal)

x sin 4T
Tham sӕ y cos 2T
(Parametric) M̫nh nh͗
(Particles)

Hình 5.3 Các cách mô tҧ ÿӕi tѭӧng 3D


5.2.PHÉP CHIӂU
Ĉ͓nh nghƭa v͉ phép chi͇u
Mӝt cách tәng quát, phép chiӃu là phép chuyӇn ÿәi nhӳng ÿiӇm cӫa ÿӕi tѭӧng trong
hӋ thӕng tӑa ÿӝ n chiӅu thành nhӳng ÿiӇm trong hӋ thӕng tӑa ÿӝ có sӕ chiӅu nhӓ hѫn n.

72
Chѭѫng 5: Phép chiӃu
Ĉ͓nh nghƭa v͉ hình chi͇u
Ҧnh cӫa ÿӕi tѭӧng trên mһt phҷng chiӃu ÿѭӧc hình thành tӯ phép chiӃu bӣi các
ÿѭӡng thҷng gӑi là tia chiӃu (projector) xuҩt phát tӯ mӝt ÿiӇm gӑi là tâm chiӃu (center of
projection) ÿi qua các ÿiӇm cӫa ÿӕi tѭӧng giao vӟi mһt chiӃu (projection plan).
Các b˱ͣc xây d͹ng hình chi͇u
1. Ĉӕi tѭӧng trong không gian 3D vӟi tӑa ÿӝ thӵc ÿѭӧc cҳt theo mӝt không gian xác
ÿӏnh gӑi là view volume.
2. View volume ÿѭӧc chiӃu lên mһt phҷng chiӃu. DiӋn tích choán bӣi view volume
trên mһt phҷng chiӃu ÿó sӁ cho chúng ta khung nhìn.
3. Là viӋc ánh xҥ khung nhìn vào trong mӝt cәng nhìn bҩt kǤ cho trѭӟc trên màn
hình ÿӇ hiӇn thӏ hình ҧnh.

täa ®é thùc täa ®é theo vïng täa ®é thiÕt


3D khung nh×n
c¾t bÞ

PhÐp biÕn ®æi vµo


C¾t theo view PhÐp chiÕu trªn
cæng nh×n cña
volum mÆt ph¼ng chiÕu
täa ®é thiÕt bÞ

Hình 5.4 Mô hình nguyên lý cӫa tiӃn trình biӇu diӉn ÿӕi tѭӧng 3D

PhÐp chiÕu h×nh häc


ph¼ng

PhÐp chiÕu song


PhÐp chiÕu phèi c¶nh
song

Trùc giao PhÐp chiÕu


Mét ®iÓm
Xiªn

Axonometric
ChiÕu
Hai ®iÓm
b»ng Cavalier

Trimetric

ChiÕu Cabinet Ba ®iÓm


®øng

ChiÕu Dimetric
c¹nh PhÐp chiÕu
Isometric kh¸c

Hình 5.5 Phân loҥi các phép chiӃu

73
Chѭѫng 5: Phép chiӃu

Hình 5.6 Ví dө minh hoҥ các phép chiӃu phӕi cҧnh


5.3. PHÉP CHIӂU SONG SONG (Parallel Projections )
Phép chiӃu song song (Parallel Projections) là phép chiӃu mà ӣ ÿó các tia chiӃu song song
vӟi nhau hay xuҩt phát tӯ ÿiӇm vô cùng.
Phân loҥi phép chiӃu song song dӵa trên hѭӟng cӫa tia chiӃu (Direction Of
Projection) và mһt phҷng chiӃu (projection plane).
5.3.1.Phép chiӃu trӵc giao (Orthographic projection)
Là phép chiӃu song song và tia chiӃu vuông góc vӟi mһt phҷng chiӃu. VӅ mһt toán hӑc,
phép chiӃu trӵc giao là phép chiӃu vӟi mӝt trong các mһt phҷng toҥ ÿӝ có giá trӏ bҵng 0.
Thѭӡng dùng mһt phҷng z=0, ngoài ra x=0 và y=0.
Ӭng vӟi mӛi mһt phҷng chiӃu ta có mӝt ma trұn chiӃu tѭѫng ӭng.
ª1 0 0 0º ª0 0 0 0º ª1 0 0 0º
«0 0 0 0»» «0 1 0 0»» «0
« 1 0 0»»
[Ty ] « [T x ] [T ] «
«0 0 1 0» «0 0 1 0» z «0 0 0 0»
« » « » « »
¬0 0 0 1¼ ¬0 0 0 1¼ ¬0 0 0 1¼

Hình 5.7 Phép chiӃu trӵc giao


Thông thѭӡng thì ngѭӡi ta không sӱ dөng cҧ 6 mһt phҷng ÿӇ suy diӉn ngѭӧc hình
cӫa mӝt ÿӕi tѭӧng mà chӍ sӱ dөng mӝt trong sӕ chúng nhѭ: hình chiӃu bҵng, ÿӭng, cҥnh.
Cҧ sáu góc nhìn ÿӅu có thӇ thu ÿѭӧc tӯ mӝt mһt phҷng chiӃu thông qua các phép
biӃn ÿәi hình hӑc nhѭ quay, dӏch chuyӇn hay lҩy ÿӕi xӭng.
Ví dө: giҧ sӱ chúng ta có hình chiӃu bҵng trên mһt phҷng z=0, vӟi phép quay ÿӕi
tѭӧng quanh trөc mӝt góc 900 sӁ cho ta hình chiӃu cҥnh.

74
Chѭѫng 5: Phép chiӃu
Ĉӕi vӟi các ÿӕi tѭӧng mà các mһt cӫa chúng không song song vӟi mӝt trong các mһt
phҷng hӋ toҥ ÿӝ thì phép chiӃu này không cho hình dҥng thұt cӫa vұt thӇ. Muӕn nhìn vұt
thӇ chính xác hѫn ngѭӡi ta phҧi hình thành phép chiӃu thông qua viӋc quay và dӏch
chuyӇn ÿӕi tѭӧng sao cho mһt phҷng ÿó song song vӟi các trөc toҥ ÿӝ.
Hình cӫa ÿӕi tѭӧng quá phӭc tҥp cҫn thiӃt phҧi biӃt các phҫn bên trong cӫa ÿӕi
tѭӧng ÿôi lúc chúng ta phҧi tҥo mһt cҳt ÿӕi tѭӧng.
5.3.2. Phép chiӃu trөc luӧng (Axonometric)
Phép chiӃu trөc lѭӧng là phép chiӃu mà hình chiӃu thu ÿѭӧc sau khi quay ÿӕi tѭӧng sao
cho ba mһt cӫa ÿӕi tѭӧng ÿѭӧc trông thҩy rõ nhҩt (thѭӡng mһt phҷng chiӃu là z=0).
Có 3 phép chiӃu
ƒ Phép chiӃu Trimetric
ƒ Phép chiӃu Dimetric
ƒ Phép chiӃu Isometric
5.3.2.1.Phép chi͇u Trimetric
Là phép chiӃu hình thành tӯ viӋc quay tӵ do ÿӕi tѭӧng trên mӝt trөc hay tҩt cҧ các trөc
cӫa hӋ tӑa ÿӝ và chiӃu ÿӕi tѭӧng ÿó bҵng phép chiӃu song song lên mһt phҷng chiӃu
(thѭӡng là mһt phҷng z = 0).
Ngoҥi trӯ nhӳng mһt phҷng cӫa ÿӕi tѭӧng song song vӟi mһt phҷng chiӃu không
thay ÿәi. Các mһt khác cӫa ÿӕi tѭӧng hay hình dҥng cӫa ÿӕi tѭӧng thѭӡng biӃn dҥng sau
phép chiӃu.Tuy nhiên tӍ lӋ co (Shortening Factor - SF) là tӹ sӕ cӫa ÿӝ dài ÿoҥn thҷng
chiӃu so vӟi ÿӝ dài thӵc tӃ cӫa ÿӕi tѭӧng. Trên cѫ sӣ SF phép chiӃu trөc lѭӧng ÿѭӧc chia
làm ba loҥi sau:
ƒ Phép chiӃu Trimetric
ƒ Phép chiӃu Dimetric
ƒ Phép chiӃu Isometric
ViӋc tính các giá trӏ SF này cӫa các trөc tѭѫng ӭng dӵa vào công thӭc [U]* [T].
ª x x' y x' 0 1º
ª1 0 0 1º « ' ' »
x y 0 1»
[U ] ««0 1 0 1»» [T ] « y' y
« xz y '
0 1»
«¬0 0 1 1»¼ «
z
»
«¬ 0 0 0 1»¼
[ U ]: là ma trұn vector ÿѫn vӏ cӫa các trөc x, y, z bҩt biӃn
[ T ]: là ma trұn chiӃu tәng hӧp tѭѫng ӭng
SF- tӍ lӋ co theo các trөc là:

fy x'2y  y '2y fz x'2z  y '2z


fx x x'2  y x'2

5.3.2.2.Phép chi͇u Dimetric


Là phép chiӃu Trimetric vӟi 2 hӋ sӕ tӍ lӋ co bҵng nhau, giá trӏ thӭ 3 còn lҥi là tuǤ ý.

75
Chѭѫng 5: Phép chiӃu
Phép chiӃu ÿѭӧc xây dӵng bҵng cách quay ÿӕi tѭӧng quanh trөc y theo mӝt góc I,
tiӃp ÿó quanh quanh trөc ox mӝt góc M và sau cùng là phép chiӃu trên mһt phҷng z=0 vӟi
tâm chiӃu tҥi vô tұn.

Hình 5.8 Ҧnh cӫa phép chiӃu Trimetric vӟi các tham sӕ góc xoay thay ÿәi

[T ] [ Ry ][ Rx][ Pz ]
ªcos I 0  sin I 0º ª1 0 0 0º ª1 0 0 0º
« 0 1 0 » «
0» «0 cos M sin M 0»» ««0 1 0 0»»
« . .
« sin I 0 cos I 0» «0  sin M cos M 0 » «0 0 0 0»
« »« »« »
¬ 0 0 0 1 ¼ ¬0 0 0 1 ¼ ¬0 0 0 1¼

ªcos I sin I sin M 0 0º ª x x' y x' 0 0º


« 0 « ' »
« cos M 0 0»» «x y y 'y 0 0»
[T ]
« sin I  cos I sin M 0 0» « x z' y z' 0 0»
« » « »
¬ 0 0 0 1¼ ¬« 0 0 0 1¼»

f x2 ( x x'2  y x'2 ) cos 2 I  sin 2 I . sin 2 I f y2 ( x 'y2  y 'y2 ) cos 2 M

Tӹ lӋ co trên x và y bҵng nhau nên ta có:


cos2M = cos2I + sin2I.sin2M
1- sin2M = 1-sin2I + sin2I.sin2M
sin2I(sin2M-1) = - sin2M
f z2 ( x z'2  y z'2 ) sin 2 I  cos 2 I sin 2 M
sin 2 I  sin 2 M (1  sin 2 I ) sin 2 M  sin 2 I (1  sin 2 M )

76
Chѭѫng 5: Phép chiӃu
fz
f z2  sin 2 M sin 2 M sin2 M I sin 1 (r )
sin 2 I sin I
2
2  f z2
1  sin 2 M 1  sin 2 M 1 sin2 M

fz fz
sin 2 M M sin 1 (r )
2 2

Ta thҩy tӹ lӋ co thuӝc khoҧng [0 1], vӟi mӛi fz ta có bӕn khҧ năng cӫa phép chiӃu.

fz = 0 fz =1/2 fz = 1
fz = 0 fz =1/2 fz = 1
Hình 5.9 Phép chiӃu hình hӝp vӟi f=0, f=1/2 và f=1
1
M sin 1 (r ) | sin 1 (r0.35355) | r20.705 0
2 2
Khi fz =1/2 thì:
1/ 2
I sin 1 (r ) sin 1 (r0.378) | r22.208
7/4
5.3.2.3.Phép chi͇u Isometric
Là phép chiӃu trөc lѭӧng mà ӣ ÿó hӋ sӕ co cҥnh trên 3 trөc là bҵng nhau.
Góc quay tѭѫng ӭng là 35.260 và 450
Ĉѭӧc ӭng dөng nhiӅu trong viӋc xây dӵng các góc quan sát chuҭn cho ÿӕi tѭӧng
trong các hӋ soҥn thҧo ÿӗ hoҥ.

1  2 sin 2 M sin 2 M
sin 2 I sin 2 I
1  sin 2 M 1  sin 2 M
1
sin M r
3
M r35.26 0
sin 2 M 1/ 3
sin 2 I 1/ 2
1  sin 2 M 1  1/ 3
1
sin I r
2
I r45 0

M r35.260
I r450 f cos 2 M 2/3 0.8165

Ví dө các phép chiӃu song song:

77
Chѭѫng 5: Phép chiӃu

Hình 5.10 Ví dө các phép chiӃu song song


5.3.3. Phép chiӃu xiên - Oblique
ƒ Phép chiӃu Cavalier
ƒ Phép chiӃu Cabinet

Hình 5.11 Phép chiӃu vӟi tâm chiӃu trên trөc oz


5.3.3.1.Phép chi͇u Cavalier
Phép chiӃu cavalier là phép chiӃu xiên ÿѭӧc tҥo thành khi các tia chiӃu làm thành vӟi mһt
phҷng chiӃu mӝt góc 450
HӋ sӕ co trên các hӋ trөc toҥ ÿӝ bҵng nhau.
Ta có vectѫ ÿѫn vӏ theo trөc z là P=[0 0 1] tia chiӃu làm vӟi mһt phҷng mӝt góc và
p ÿѭӧc chiӃu lên mһt phҷng chiӃu.
Ta có P1O và PP2 là 2 tia chiӃu cӫa phép chiӃu xiên vӟi góc E vӟi mһt phҷng chiӃu.
P2 là ҧnh cӫa P
P1 là ÿiӇm dӏch chuyӇn cӫa P tҥo ra tia chiӃu song song PP2
Tia chiӃu P1O có thӇ thu ÿѭӧc tӯ phép biӃn ÿәi P ÿӃn ÿiӇm [-a-b]
Trong không gian hai chiӅu dӏch chuyӇn sӁ là:

78
Chѭѫng 5: Phép chiӃu
ª1 0 0º
«
T' « 0 1 0»»
«¬ a  b 1»¼

Trong không gian ba chiӅu, f là chiӅu dài cӫa hình chiӃu vectѫ ÿѫn vӏ trөc z trên mһt
phҷng chiӃu, ÿó chính là hӋ sӕ co.

ª1 0 0 0º a f cosD ª 1 0 0 0º
«0 « 0 0»»
1 0 0»» b f sin D 0 1
[T ' ' ] « [T ] «
« a  b 0 0» « f cos D  f sin D 0 0»
« » « »
¬0 0 0 1¼ ¬ 0 0 0 1¼
f = 0, b = 900 phép chiӃu sӁ trӣ thành phép chiӃu trӵc giao.
Còn vӟi f = 1 kích thѭӟc cӫa hình chiӃu bҵng kích thѭӟc cӫa ÿӕi tѭӧng => cavalier
Phép chiӃu Cavalier cho phép giá trӏ cӫa a biӃn ÿәi mӝt cách tӵ do a = 300 và 450
5.3.3.2.Phép chi͇u Cabinet
Phép chiӃu xiên vӟi hӋ sӕ co tӍ lӋ f = 1/2 .
Vӟi phép chiӃu cabinet, giá trӏ cӫa D có thӇ thay ÿәi tuǤ ý. Thông thѭӡng thì các giá
trӏ hay ÿѭӧc sӱ dөng là 300 và 450 .
Theo phép chiӃu xiên mӝt sӕ mһt cӫa ÿӕi tѭӧng có thӇ ÿѭӧc hiӇn thӏ nhѭ hình dҥng
thұt cho nên rҩt phù hӧp vӟi viӋc mô tҧ các ÿӕi tѭӧng có hình dҥng tròn hay các bӅ mһt
f
E cos 1 ( )
1  f2
2

1
cos 1 ( 2 ) 63.4350
1  (1 2 )
2 2

cong.
Ví dө vӅ phép chiӃu xiên (Oblique Projections)

D/2
D
D
D

Hình 5.12 Ví dө các phép chiӃu xiên hình hӝp

5.4. PHÉP CHIӂU PHӔI CҦNH (Perspective Projection)


Phép chi͇u ph͙i c̫nh là phép chiӃu mà các tia chiӃu không song song vӟi nhau mà xuҩt
phát tӯ mӝt ÿiӇm gӑi là tâm chiӃu. Phép chiӃu phӕi cҧnh tҥo ra hiӋu ӭng vӅ luұt xa gҫn tҥo
cҧm giác vӅ ÿӝ sâu cӫa ÿӕi tѭӧng trong thӃ giӟi thұt mà phép chiӃu song song không lӝt tҧ
ÿѭӧc.
Các ÿoҥn thҷng song song cӫa mô hình 3D sau phép chiӃu hӝi tө tҥi mӝt ÿiӇm gӑi là
ÿiӇm triӋt tiêu (vanishing point).

79
Chѭѫng 5: Phép chiӃu
Phân lo̩i phép chi͇u ph͙i c̫nh dӵa vào tâm chiӃu - Centre Of Projection (COP) và
mһt phҷng chiӃu projection plane

Mӝt tâm chiӃu Hai tâm chiӃu Ba tâm chiӃu


1 point Perspective 2 point Perspective 3 point Perspective
Hình 5.13 Phép biӃn ÿәi phӕi cҧnh

Hình 5.14 Phép chiӃu vӟi tâm chiӃu trên trөc z


Phép chiӃu phӕi cҧnh cӫa các ÿiӇm trên ÿӕi tѭӧng lên trên mһt phҷng 2D thu ÿѭӧc
tӯ phép chiӃu trӵc giao và phép biӃn ÿәi phӕi cҧnh.
5.4.1. Phép chiӃu phӕi cҧnh mӝt tâm chiӃu
Giҧ sӱ khi mһt phҷng ÿѭӧc ÿһt tҥi z = 0 và tâm phép chiӃu nҵm trên trөc z , cách trөc z
mӝt khoҧng zc = -1/r.
NӃu ÿӕi tѭӧng cNJng nҵm trên mһt phҷng z = 0 thì ÿӕi tѭӧng sӁ cho hình ҧnh thұt.
Phѭѫng trình biӃn ÿәi:
[ x y z 1 ][ Tr ] = [ x y z rz+1 ]
ma trұn biӃn ÿәi mӝt ÿiӇm phӕi cҧnh [ Tr ] có dҥng:
80
Chѭѫng 5: Phép chiӃu

y y’’

D’’ C’’
H
G H’’ G’’

E F
x A’’ E’’ F’’ B
A B x
z

5.15 Phép chiӃu phӕi cҧnh mӝt tâm chiӃu

ª1 0 0 0º ª1 0 0 0º ª1 0 0 0º ª1 0 0 0º
«0 1 0 0» «0 1 0 0» «0 1 0 0» «0
« » « » « » 1 0 0»»
«0 0 1 r» «0 0 0 0» «0 0 0 r» >x y z 1@ « >x y 0 rz  1@
«0 0 0 r»
« » « » « » « »
¬0 0 0 1¼ ¬0 0 0 1¼ ¬0 0 0 1¼
¬0 0 0 1¼
ª x y º
>x' y ' z ' 1@ « 0 1»
¬ rz  1 rz  1 ¼
5.4.2. Phép chiӃu phӕi cҧnh hai tâm chiӃu
Y’’ VP (y=10)

VP { y = 10

D’’, H’’C’’, G’’


D’’ H’’
C’’,G’’ VP( x = 10)

VP A’’, E’’B’’, F’’


X=10

5.16 Phép chiӃu phӕi cҧnh hai tâm chiӃu


[ Tc ] = [ Tpq ][ Tz ]

ª1 0 0 pº ª1 0 0 0º ª1 0 0 pº
«0 1 0 q »» «0 1 0 0»» «0 1 0 q »»
« « «
«0 0 1 0» «0 0 0 0» «0 0 0 0»
« » « » « »
¬0 0 0 1¼ ¬0 0 0 1¼ ¬0 0 0 1¼

81
Chѭѫng 5: Phép chiӃu

Hai tâm chiӃu: [ -1/p 0 0 1 ] và [ 0 -1/q 0 1 ]


ĈiӇm triӋt tiêu (VP -Vanishing point) tѭѫng ӭng trên 2 trөc x và y là ÿiӇm: [ 1/p 0 0 1 ] và
[ 0 1/q 0 1 ].
ª1 0 0 pº
«0 1 0 q »»
>x y z 1@ « >x y 0 ( px  qy  1)@
«0 0 0 0»
« »
¬0 0 0 1¼

ª x y º
>x' y ' z ' 1@ « 0 1»
¬ ( px  qy  1) ( px  qy  1) ¼

ª1 0 0 pº ª1 0 0 0º ª1 0 0 0º ª1 0 0 pº
«0 1 0 0 »» «0 1 0 q »» «0 1 0 0»» «0 1 0 q »»
« « « «
«0 0 1 0» «0 0 1 0» «0 0 1 r» «0 0 1 r»
« » « » « » « »
¬0 0 0 1¼ ¬0 0 0 1¼ ¬0 0 0 1¼ ¬0 0 0 1¼

ª1 0 0 p º ª1 0 0 0º ª1 0 0 pº
«0 1 0 q »» ««0 1 0 0»» «0 1 0 q »»
>Tc @ >T pqr @.>Tz @ « . «
«0 0 1 r » «0 0 0 0» «0 0 0 r»
« »« » « »
¬0 0 0 1 ¼ ¬0 0 0 1¼ ¬0 0 0 1¼

ª1 0 0 pº
«0 1 0 q »»
>x y z 1@ « >x y 0 ( px  qy  rz  1)@
«0 0 0 r»
« »
¬0 0 0 1¼

ª x y º
>x' y ' z ' 1@ « 0 1»
¬ ( px  qy  rz  1) ( px  qy  rz  1) ¼
y'

VP ( y = 10) y'
H'
D'
D'
H' C' G'

G' E' C'

VP ( x = 10 )
VP ( z = 10 ) F'
A'
x'
z' x'
A', E' F' B' B'

Hình 5.17 Phép chiӃu phӕi cҧnh ba tâm chiӃu

82
Chѭѫng 5: Phép chiӃu
5.4.3. Phép chiӃu phӕi cҧnh ba tâm chiӃu
[ Tpqr ] = [Tp ][Tq ][Tr ]
Ba tâm chiӃu:trên trөc x tҥi ÿiӇm [ -1/p 0 0 1 ],
y tҥi ÿiӇm [ 0 -1/q 0 1 ] và z tҥi ÿiӇm [ 0 0 -1/r 1 ]
ĈiӇm triӋt tiêu -VP sӁ tѭѫng ӭng vӟi các giá trӏ:
[ 1/p 0 0 1 ], [ 0 1/q 0 1 ] [ 0 0 1/r 1 ]
Cài ÿһt bҵng c/c++: ChiӃu trên các mһt phҷng:
point hinhchieu(int x,int y,int z,int mfchieu) {
point p;
if (mfchieu==1){ //XOY
p.x=int(getmaxx()/2+y-x*cos(RADS*45));
p.y=int(getmaxy()/2+x*cos(RADS*45));
p.z=z;
}
if (mfchieu==2) { //XOZ
p.x=int(getmaxx()/2+y-x*cos(RADS*45));
p.y=int(getmaxy()/2-z+x*cos(RADS*45));
p.z=z;
}
if (mfchieu==3){ //YOZ
p.x=int(getmaxx()/2+y-x*cos(RADS*45)+x*sin(RADS*45));
p.y=int(getmaxy()/2-z);
p.z=z;
}
return p; }

Tóm tҳt chѭѫng:


Chúng ta xét hai phép chiӃu song song và phӕi cҧnh, trong phép chiӃu song song thì phân
ra các loҥi: trӵc giao, trөc lѭӧng và phép chiӃu xiên. Phép chiӃu trӵc giao chӍ ÿѫn giҧn là
bӓ ÿi mӝt trong ba toҥ ÿӝ cӫa ÿiӇm chiӃu bҵng cách cho các tia chiӃu song song vӟi mӝt
trong các trөc toҥ ÿӝ. Phép chiӃu trөc lѭӧng thì quay ÿӕi tѭӧng khi thҩy ÿѭӧc rõ nhҩt ÿӕi
tѭӧng rӗi mӟi cho các tia chiӃu song vӟi các trөc toҥ ÿӝ. Phép chiӃu xiên thì tia chiӃu
không song song vӟi trөc toҥ ÿӝ mà thay bҵng nó làm vӟi các mһt phҷng chiӃu mӝt góc
không vuông.
Phép chiӃu phӕi cҧnh thì sӱ dөng mӝt ÿiӇm cӕ ÿӏnh gӑi là tâm chiӃu và hình chiӃu
cӫa các ÿiӇm ÿѭӧc xác ÿӏnh bҵng giao ÿiӇm cӫa tia chiӃu (nӕi ÿiӇm chiӃu và tâm chiӃu)
vӟi mһt phҷng quan sát. Phép chiӃu phӕi cҧnh hӝi tө tҥi mҳt nên ÿӕi tѭӧng càng xa trông
càng nhӓ và ngѭӧc lҥi.
Bài tұp:
1. Cho Hình vuông ABCD có các toҥ ÿӝ là: A(0,0,0), B(0,2,0), C(2,2,2) và D(2,0,2). Tính
toҥ ÿӝ mӟi cӫa hình vuông sau khi chiӃu nó bӣi phép chiӃu Isometric?
2. Cho Hình vuông ABCD có các toҥ ÿӝ là: A(0,0,0), B(0,2,0), C(2,2,2) và D(2,0,2). Tính
toҥ ÿӝ mӟi cӫa hình vuông sau khi chiӃu nó bӣi phép chiӃu Dimetric vӟi fz=1/2 (tӹ lӋ co theo trөc
z)?
83
Chѭѫng 5: Phép chiӃu
3. Cho tam giác ABC có các toҥ ÿӝ là A(2,3,1), B(0,4,6) và C(5,2,7), Hãy tính toҥ ÿӝ mӟi cӫa
hình tam giác ÿó sau khi chiӃu phӕi cҧnh sau:
- Mӝt tâm chiӃu tҥi P(0,0,10)
- Hai tâm chiӃu tҥi M(5,0,0) và N(0,-8,0)
- Ba tâm chiӃu tҥi M(4,0,0), N(0,-6,0) và P(0,0,12)
4. ViӃt chѭѫng trình chiӃu hình kim cѭѫng (ABCD) vӟi phép chiӃu trӵc giao.
5. ViӃt chѭѫng trình chiӃu hình lұp phѭѫng vӟi phép chiӃu
ƒ Trimetric
ƒ Dimetric
ƒ Isometric
6. ViӃt chѭѫng trình chiӃu hình kim cѭѫng (ABCD) vӟi phép chiӃu xiên
ƒ Cavalier
ƒ Cabinet
7. ViӃt chѭѫng trình chiӃu hình lұp phѭѫng vӟi phép chiӃu phӕi cҧnh.

84
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ

CHѬѪNG 6: MÀU SҲC TRONG ĈӖ HOҤ

6.1. ÁNH SÁNG VÀ MÀU SҲC (light and color)


6.1.1. Quan niӋm vӅ ánh sáng
x Ánh sáng ÿem ÿӃn sӵ sӕng cho con ngѭӡi
x Ánh sáng ÿem ÿӃn màu sҳc cho con ngѭӡi
Màu sҳc là cҧm giác mà nó xҧy ra khi có năng lѭӧng cӫa ánh sáng, xuҩt hiӋn trên
võng mҥc và nhұn biӃt ÿѭӧc nhӡ não.
x Hҥnh phúc cӫa con ngѭӡi là cҧm nhұn ÿѭӧc màu sҳc
x Nguyên tҳc cӫa ánh sáng dӵa trên hai góc ÿӝ
o Vұt lý - physics
o Sinh lý - physiology
6.1.2. YӃu tӕ vұt lý
Ánh sáng phө thuӝc vào mӭc năng lѭӧng ÿѭӧc truyӅn hay bѭӟc sóng cӫa ánh sáng. Ánh
sáng trҳng hay dҧi sóng mà mҳt ngѭӡi có thӇ cҧm nhұn ÿѭӧc, sau khi phân tích qua lăng
kính thành các phә màu: tím, chàm, lam, lөc, vàng, da cam, ÿӓ…….Ánh sáng là sóng ÿiӋn
tӯ có bѭӟc sóng O ÿi tӯ 400nm –– 700nm.

Hình 6.1 Tҫn sӕ, màu sҳc và bѭӟc sóng cӫa ánh sáng nhìn thҩy
Tәng năng lѭӧng ÿһc trѭng cho tӯng loҥi bѭӟc sóng ÿѭӧc biӇu diӉn bҵng hàm phân
bә năng lѭӧng phә P(O).

Hình 6.2 Ĉӗ thӏ phân bӕ ba màu


85
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Nguyên lý pha màu vӟi các sҳc màu cѫ bҧn là ÿӓ, lөc, lam (Red, Green, Blue). Theo
nguyên lý ba màu này, mӝt màu bҩt kǤ ÿӅu có thӇ ÿѭӧc tҥo ra tӯ ba màu cѫ bҧn.
Frequency (Hz)
3 6 9 1 2 1 4 1 5 1 8 2 2

10 10 10 10 10 10 10 10

Radio Frequency Microwaves Infrared X-Rays J-Rays


Ultraviolet

Visible Spectrum

Hình 6.3 Vùng ánh sáng thҩy ÿѭӧc


Phә cӫa ánh sáng (Spectrum)
x Ánh sáng xuҩt phát tӯ nguӗn sáng ÿѭӧc xác ÿӏnh bӣi phә I(O) cӫa nó - spectrum,
phә I(O) này ÿѭӧc ÿo bӣi năng lѭӧng cӫa ánh sáng vӟi bѭӟc sóng cho trѭӟc ÿi
qua mӝt ÿѫn vӏ diӋn tích trong mӝt khoҧng thӡi gian.
x Thuұt ngӳ khác phә công suҩt - power spectrum, vͣi ÿ˯n v͓ là watts/m2.
x Phә công suҩt ÿѭӧc dùng ÿӇ ÿo cѭӡng ÿӝ phát sáng cӫa nguӗn - emission
intensity
x Hay còn gӑi cѭӡng ÿӝ truyӅn dүn - transmission intensity cӫa ánh sáng theo
luӗng trong không gian, hay cѭӡng ÿӝ phát sáng- illumination intensity cӫa ánh
sáng ÿұp lên bӅ mһt.
Màu sҳc
x Isaac Newton - ánh sáng trҳng ÿi qua thҩu kính thuӹ tinh sӁ phát tán ra thành phә
các màu cҫu vӗng
x Ngѭӧc lҥi, thҩu kính có thӇ kӃt hӧp các phә ánh sáng ÿӇ tҥo thành ánh sáng
trҳng.
x Chùm sáng khi phân tách thành phә màu có liên quan ÿӃn phә năng lѭӧng I(O).
x Phә ÿiӋn tӯ ÿó có bѭӟc sóng tӯ 350 tӟi 780 nm và màu ÿѭӧc ÿһc trѭng bӣi c(O)
c(O )

350 780 O

Hình 6.4 Phә ÿiӋn tӯ cӫa ánh sáng

86
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
6.1.3. Cҧm nhұn màu sҳc cӫa con ngѭӡi (Physiology - Sinh lý - Human Vision)
Hai mҳt chӍ là nhӳng bӝ phұn thu hình giӕng nhѭ chiӃc máy ҧnh, còn não mӟi phân tích,
tәng hӧp, kӃt hӧp nhӳng thông tin cӫa hàng triӋu tӃ bào cҧm quang gӱi vӅ ÿӇ tҥo nên cҧm
nhұn hình ҧnh. Chính ӣ não mӟi tái hiӋn rõ rӋt các hình thái, sҳc màu mà hai mҳt ÿã ghi
nhұn ÿѭӧc. Phҧi chăng vì vұy, nhiӅu lúc con ngѭӡi chӍ ““trông”” mà không ““nhìn”” thҩy. Nói
cách khác, mҳt ““trông”” và não ““nhìn””.
Cҩu tҥo hӋ quan sát cӫa con ngѭӡi gӗm 2 loҥi tӃ bào cҧm thө - sensors
ƒ Rods (tӃ bào que): nhҥy cҧm vӟi cѭӡng ÿӝ ánh sáng thҩp hay trong bóng tӕi
ƒ Cones - tӃ bào hình nón
ƒ 125 triӋu tӃ bào que và 6 triӋu tӃ bào nón
Nh̩y c̫m vͣi ánh sáng màu s̷c
Chia làm 3 lo̩i nón - cone
Ba lo̩i sͅ có ba giá tr͓ g͕i là tristimulus values c̫m nh̵n t˱˯ng ͱng trên 3 màu
c˯ b̫n và g͵i ÿ͇n não nhͷng tín hi͏u t̩o ra c̫m nh̵n v͉ màu s̷c S-M-L.
ÐӇ ÿҥt ÿѭӧc mӝt sӵ cҧm nhұn vӅ mӝt màu bҩt kǤ ta phҧi xác ÿӏnh giá trӏ cӫa 3 ÿҥi
lѭӧng này

Hình 6.5 Cҩu tҥo mҳt con ngѭӡi Hình 6.6 Con ngѭӡi cҧm nhұn màu sҳc
Ba loҥi tӃ bào nón sӁ có ÿӝ nhҥy cҧm vӟi 3 màu và các bѭӟc sóng khác nhau nhѭ:
ƒ L or R, hҫu nhѭ nhҥy cҧm vӟi ánh sáng ÿӓ (610 nm)
ƒ M or G, nhҥy cҧm vӟi ánh sáng lөc (560 nm)
ƒ S or B, nhҥy cҧm vӟi ánh lam (430 nm)
ƒ Vұy ta có ngѭӡi bӏ mù màu chҷng qua là mҩt tӃ bào nón
S:M:L tӹ lӋ = 1:20:40 Ÿ tӯ ÿó ta thҩy con ngѭӡi nhҥy cҧm vӟi màu ÿӓ hѫn là màu
xanh lam.

87
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
ƒ Nó không chӍ ÿѫn giҧn là RGB
cӝng vӟi ánh sáng
ƒKӃt hӧp tӃ bào que và nón mang
lҥi cҧm nhұn cҧ màu sҳc và ánh
sáng
ƒTӃ bào ÿáp ӭng thay ÿәi vӟi
cѭӡng ÿӝ:
- Khi ánh sáng yӃu: thích ӭng vӟi
nhìn tӕi, tӃ bào que trӝi hѫn cҧm
nhұn màu sҳc không ÿáng kӇ
- Khi ánh sáng là trung bình: thì
cҧ hai là mӭc trung bình
- Ánh sáng cao: xӱ lý màu sҳc,
tӃ bào nón trӝi hѫn
Hình 6.7 Cҩu tҥo và nguyên lý hoҥt ÿӝng các tӃ bào mҳt
56 27

86 88

Hình 6.8 Cҧm nhұn màu sҳc cӫa con ngѭӡi


Ta thҩy màu ÿӓ tѭѫi (bão hoà) khác màu ÿӓ tái (chѭa bão hoà).
YӃu tӕ cҧm nhұn sinh lý:
ƒ Hue - sҳc màu: dùng ÿӇ phân biӋt sӵ khác nhau giӳa các màu nhѭ xanh, ÿӓ,
vàng ……
ƒ Saturation - ÿӝ bão hoà: chӍ ra mӭc ÿӝ thuҫn cӫa mӝt màu hay khoҧng cách
cӫa màu tӟi ÿiӇm có cѭӡng ÿӝ cân bҵng.
ƒ Lightness - ÿӝ sáng: hiӋn thân vӅ mô tҧ cѭӡng ÿӝ sáng tӯ ánh sáng phҧn xҥ
nhұn ÿѭӧc tӯ ÿӕi tѭӧng.
ƒ Brightness - ÿӝ phát sáng: cѭӡng ÿӝ ánh sáng tӵ ÿӕi tѭӧng phát ra chӭ không
phҧi do phҧn xҥ tӯ các nguӗn sáng khác.
ƒ HӋ thӕng màu ÿѭӧc sӱ dөng rӝng rãi ÿҫu tiên do A.H.Munsell ÿѭa ra vào
nhӳng năm 1976 không gian ba chiӅu bao gӗm ba yӃu tӕ Hue, Lightness và
Saturation.
88
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Sҳc màu trong hӝi hoҥ: thѭӡng ÿѭӧc xác ÿӏnh mүu trên góc ÿӝ sҳc thái (tints), sҳc ÿӝ
(shade), tông màu (tone) tӯ các màu nguyên chҩt hay bão hoà. Sҳc thái là ÿѭӧc hình thành
tӯ viӋc thêm sҳc tӕ trҳng vào các màu nguyên chҩt ÿӇ giҧm ÿӝ bão hoà. Sҳc ÿӝ hay còn
gӑi là ÿӝ giҧm màu ÿѭӧc tҥo ra bҵng cách thêm màu ÿen vào các màu nguyên chҩt ÿӇ
giҧm ÿi ÿӝ sáng cӫa màu. Còn tông màu là kӃt quҧ cӫa cҧ hai quá trình trên khi thêm cҧ
màu trҳng lүn màu ÿen vào các màu nguyên chҩt.
6.1.4. Các ÿһc trѭng cѫ bҧn cӫa ánh sáng
Ánh sáng có thӇ ÿѭӧc mô tҧ bҵng ba thuұt ngӳ:
ƒ Ĉӝ sáng (Lightness): dӵa vào tính chҩt vұt lý cӫa nó, hay còn gӑi là tính phát sáng
(brightness). Tính phát sáng ÿo lѭӡng năng lѭӧng toàn phҫn trong ánh sáng. Nó tӹ lӋ
vӟi diӋn tích giӟi hҥn bӣi P(O) và trөc O trong dãy 400 ÿӃn 700 nm. DiӋn tích này
ÿѭӧc tính nhѭ sau:

³O P(O )dO
Tính phát sáng càng cao, thì ÿӝ sáng càng sáng hѫn ÿӕi vӟi ngѭӡi quan sát.
ƒ Sҳc ÿӝ (shade): ÿӇ phân biӋt ánh sáng trҳng vӟi ánh sáng ÿӓ vӟi ánh sáng xanh. Ĉӕi
vӟi ánh sáng có sӵ phân bӕ quang phә lý tѭӣng nhѭ hình dѭӟi, sҳc ÿӝ thích ӭng vӟi
mӝt tính chҩt vұt lý khác ÿѭӧc gӑi là bѭӟc sóng trӝi cӫa sӵ phân bӕ.

P(O) bѭӟc sóng trӝi (Dominant warelength)

Pure color

White
O(nm)
400 700

Hình 6.9 Phân bӕ quang phә cӫa ánh sáng


ƒ Ĉӝ bão hoà (Saturation): mô tҧ mӭc ÿӝ chói lӑi cӫa ánh sáng. Ví dө hai ánh sáng màu
ÿӓ có thӇ khác nhau ӣ tính phát sáng/ÿӝ sáng và chúng có thӇ khác nhau ӣ mӭc ÿӝ
chói lӑi (ví dө màu ÿӓ tѭѫi/bão hoà khác vӟi màu ÿӓ tái/ không bão hoà). Chúng ta có:
màu tѭѫi
Ĉӝ bão hoà = 
Màu tѭѫi + màu trҳng
6.2. ÁNH SÁNG ĈѪN SҲC
Không cҧm nhұn ÿѭӧc các sҳc màu khác nhѭ vàng, ÿӓ, tím…… khi quan sát trên màn hình
ÿen trҳng

89
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Ĉӏnh lѭӧng là thuӝc tính duy nhҩt cӫa các tia sáng ÿѫn sҳc và vӅ mһt vұt lý nó ÿѭӧc
tính bҵng năng lѭӧng cӫa tia sáng ÿѭӧc mô tҧ cѭӡng ÿӝ (intensity) hay ÿӝ chiӃu sáng
(luminance).
Dѭӟi góc ÿӝ cҧm nhұn vӅ mһt tâm lý thì cѭӡng ÿӝ cӫa tia sáng chính là ÿӝ sáng cӫa
vұt (brighness)
Sӱ dөng phә kӃ - photometer ÿӇ ÿo ÿӝ sáng thҩp nhҩt (min) và cao nhҩt (max) cӫa
màn hình. Và ÿó là khoҧng ÿӝng.
Khoҧng cѭӡng ÿӝ nhұn giá trӏ min là I0, ÿӃn max là 1.0. Làm thӃ nào ÿӇ thӇ hiӋn
ÿѭӧc 256 mӭc xám khác nhau?
6.2.1. Cѭӡng ÿӝ sáng và cách tính
Cѭӡng ÿӝ cӫa nguӗn sáng sӁ thay ÿәi trong khoҧng tӯ 0 ÿӃn 1: 0 qui ѭӟc cho màu ÿen và
1 cho màu trҳng.
khoҧng tăng cӫa cѭӡng ÿӝ sáng sӁ phân chia theo hàm logarit
I0 = I0 , I1 = r I0 , I2 = r I1 = r2 I0 , ... , I255 = r255 I0=1
r=(1/ I0)1/255 , Ij = rj I0 = I0(255-j)/255
I = k.NJ
Vӟi k và J là các hҵng sӕ (có J tӯ 2.2 -> 2.6), N sӕ lѭӧng hҥt tҥi mӝt thӡi ÿiӇm phát
ra tӯ cathode trong mӝt chùm tia ÿiӋn tӱ.

I0=I0

I1 = rI0

I2 = rI1 = r2I0

……

I255=rI254=r255I0=1
6.2.2. Phép hiӋu chӍnh gama
Ta có I = K.VJ hay V = (I / K)1/J
Trong ÿó V ÿiӋn áp tӍ lӋ vӟi N trên mӛi ÿiӇm ҧnh.
Giҧ sӱ chúng ta có mӝt cѭӡng ÿӝ sáng I thì bѭӟc ÿҫu tiên ta phҧi làm là tìm ra giá trӏ
Ij gҫn nhҩt qua phép làm tròn. Giá trӏ j tìm ÿѭӧc I= rjI0 vұy rj=I/I0 suy ra j = ROUND(logr (
I / I0 )).
Thay j vào công thӭc ta có:
Ij = rj . I0
Bѭӟc tiӃp theo cӫa tiӃn trình là xây dӵng mӭc ÿiӋn áp Vj cho ÿiӇm ҧnh mà cѭӡng ÿӝ
ánh sáng có giá trӏ tѭѫng ӭng là Ij.
Vj = ROUND( Ij / K )1/J

90
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Ta thҩy ÿӇ cѭӡng ÿӝ sáng là nhѭ nhau cho các màn hình (hay ҧnh là nhѭ nhau), thì
chӍ còn thay ÿәi giá trӏ gama. Giá trӏ gama là sӕ mNJ cӫa hàm luӻ thӯa, giá trӏ ÿó ÿӕi vӟi
loҥi phim nhӵa 35mm trong phòng tӕi là 1.5. Nhѭng hӋ sӕ gama cӫa CRT là loҥi thiӃt bӏ
ÿӝ sáng phө thuӝc vào ӕng phóng tia ÿiӋn tӱ. Thӵc tӃ giá trӏ gama cӫa CRT dao ÿӝng tӯ
2.3 ÿӃn 2.6.
Ta có sӵ phҧn hӗi tuyӃn tính cӫa CRT có thӇ ÿѭӧc bù bӣi phҫn cӭng và phép bù này
gӑi là phép hiӋu chӍnh gama (Gama correction). ViӋc sӱ dөng Ij làm chӍ sӕ trong Lookup
table (LUT) ÿӇ tìm ra cѭӡng ÿӝ sáng cho các ÿiӇm ҧnh trên màn hình gӑi là phép hiӋu
chӍnh gama vӟi bҧng LUT. Vұy bao nhiêu khoҧng sӁ là ÿӫ nhӓ cho viӋc thӇ hiӋn mӝt ÿiӇm
ҧnh ÿen trҳng là liên tөc? Theo tính toán thì r=1.01 là mӭc ngѭӥng phân biӋt cӫa mҳt. NӃu
r<1.01 thì mҳt sӁ không phân biӋt ÿѭӧc sӵ khác lӋnh giӳa hai cѭӡng ÿӝ lân cұn nhau Ij và
Ij+1.
r=(1/I0).1/n =1.01 vұy n=log1.01(1/I0) vӟi (1/I0) là khoҧng biӃn ÿӝng cӫa thiӃt bӏ phҫn cӭng.
6.2.3. Xҩp xӍ bán tông - halftone
Sӱ dөng ÿen trҳng ÿӇ mô tҧ ҧnh nhiӅu màu ?
Phѭѫng pháp trên dӵa vào cҩu tҥo mҳt cӫa ngѭӡi cNJng nhѭ nguyên lý thu nhұn ҧnh
cӫa mҳt khi nhìn nhӳng vùng nhӓ ӣ khoҧng cách xa. Lúc ÿó mҳt không thӇ phân biӋt ÿѭӧc
các vұt mӝt cách cө thӇ mà chӍ ghi nhұn cѭӡng ÿӝ trung bình cӫa vùng ҧnh ÿó. Phѭѫng
pháp này ÿѭӧc gӑi là xҩp xӍ bán tông.
Phѭѫng pháp này cho phép ÿҥt ÿѭӧc ÿӝ phân giҧi trong in ҧnh báo vào khoҧng tӯ
60->80 dpi, còn trong tҥp chí và sách cao hѫn là khoҧng tӯ 110 -> 120 dpi.

Hình 6.10 Dùng ÿen trҳng ÿӇ thӇ hiӋn ҧnh màu


Ta có giҧi thuұt phân ngѭӥng (Thread Hold). Phân ngѭӥng là lҩy mӝt giá trӏ trung
bình cӫa cҧ vùng ҧnh làm ngѭӥng và so sánh nó vӟi mӭc sáng cӫa tӯng ÿiӇm ҧnh trong ô.
NӃu giá trӏ cӫa nó lӟn hѫn ngѭӥng thì ÿiӇm ÿó ÿѭӧc bұt (on), nӃu ngѭӧc lҥi thì tҳt (off).
Ta thҩy vӟi phѭѫng pháp này mҩt ÿi nhiӅu thông tin cӫa ҧnh gây ra mӝt sӕ hiӋu ӭng
phө cho ҧnh. ĈӇ giҧi quyӃt ta dùng phѭѫng pháp sau:
Mүu tô: ta biӇu diӉn mӝt ÿiӇm ҧnh trên màn hình theo các mүu tô. Ĉѫn vӏ nhӓ nhҩt
cӫa ҧnh lѭӟi là 2x2 ta có 5 mӭc ÿӝ ÿӇ thӇ hiӋn cѭӡng ÿӝ sáng cӫa vùng ÿѫn vӏ. Ma trұn
lѭӟi kích thѭӟc nxn chúng ta có n2+1 ÿӝ phân giҧi khác nhau. Hình dѭӟi ÿây là ma trұn
3x3 và các ÿѫn vӏ mã là 0 ÿӃn 9.

91
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ

0 1 2 3 4

5 6 7 8 9

Hình 6.11 Phân bӕ các ÿiӇm trong vùng theo thӭ tӵ tăng dҫn
ViӋc thӇ hiӋn cѭӡng ÿӝ vùng ҧnh I bây giӡ chӍ còn ÿѫn thuҫn là bұt tҩt cҧ các vӏ trí < I
ƒ Thӭ nhҩt:Không dùng ma trұn mүu có dҥng ÿѭӡng thҷng ngang
ƒ Thӭ hai: Các mүu phҧi ÿѭӧc hình thành theo chuӛi các bѭӟc liên tiӃp nhau sao cho
mӑi ÿiӇm ҧnh có mұt ÿӝ thӇ hiӋn ngѭӥng a ÿӅu phҧi có mһt ÿӇ thӇ hiӋn mӑi ngѭӥng b
vӟi b > a.
ƒ Thӭ ba: Các mүu phҧi ÿѭӧc phát triӇn theo quy tҳc tӯ tâm ÿi dҫn ra xung quanh. Nhӡ
ÿó sӁ gây ÿѭӧc cho ngѭӡi sӱ dөng hiӋu ӭng tăng kích thѭӟc ÿiӇm.
ƒ Thӭ tѭ: Vӟi mӝt sӕ các thiӃt bӏ in nhѭ máy in laser hay các thiӃt bӏ ghi hình, vҩn ÿӅ vӅ
các ÿiӇm ÿӝc lұp tuyӋt ÿӕi là rҩt khó có khҧ năng ÿҥt ÿѭӧc. Khi mà ÿҥi ÿa phҫn các
ÿiӇm ҧnh ÿѭӧc bұt cho mӝt cѭӡng ÿӝ sáng thì chúng sӁ gây ra các thay ÿәi cho các
ÿiӇm còn lҥi.
Xҩp xӍ bán tông vӟi ҧnh màu: Ta lҩy mӛi cell không phҧi là mӝt ÿѫn vӏ nӳa mà là ba
ÿѫn vӏ nhӓ ÿһc trѭng cho ba màu (Red, Green, Blue).

Hình 6.12 Màu sҳc trong ҧnh màu

92
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
6.2.4. Ma trұn Dither và phép lҩy xҩp xӍ bán tông
Bayer năm 1973 ÿã ÿѭa ra dҥng ma trұn dither mà nhӡ ÿó tăng ÿѭӧc ÿӝ mӏn cӫa ҧnh khi
hiӇn thӏ.
Ma trұn 2 u 2 ma trұn dither có ký hiӋu D(2):
Tính các ma trұn D(2n) thông qua D(n):

ª0 2 º ª4 D n / 2  D00
2 n / 2
U 4 D n / 2  D01
2 n / 2
U º
D 2 «3 1 » D n « n / 2 2 n / 2 n / 2 2 n / 2 »
¬ ¼ ¬4 D  D10 U 4D  D11 U ¼

U(n) là ma trұn n u n vӟi tҩt cҧ các phҫn tӱ = 1


Vӟi n = 4 và kӃt quҧ tӯ D(2)
ª ª0 2º ª1 1º ª0 2º ª1 1º º
«4 « 0 4« »  2« »
« ¬3 1 »¼ «¬1 »
1¼ ¬3 1 ¼ ¬1 1»¼ »
D ( 4)
« ª0 2º ª1 1º ª0 2º ª1 1º »
« 4« 3 4« »  1« »
¬ ¬3 1 »¼ «¬1 »
1¼ ¬3 1 ¼ ¬1 1»¼ ¼

ª 0 8 2 10º
« »
4 «12 4 14 6 »
D
« 3 11 1 9 »
« »
¬15 7 13 5 ¼
ĈӇ xác ÿӏnh ÿiӇm (x,y) là bұt hay tҳt, ta cҫn xác ÿӏnh vӏ trí ÿiӇm tѭѫng ӭng vӟi vӏ trí
ma trұn Dither ÿӇ so sánh cѭӡng ÿӝ sáng trung bình S vӟi giá trӏ ÿó trong ma trұn. NӃu
S>Dij thì bұt.
6.3. CÁC Hӊ MÀU TRONG MÀN HÌNH ĈӖ HӐA
Mô hình màu - color model: là hӋ thӕng có quy tҳc cho viӋc tҥo khoҧng màu tӯ tұp các
màu cѫ bҧn.
Có 2 loҥi mô hình màu là:
ƒ Màu thêm (additive): mô hình màu thêm sӱ dөng ánh sáng - light ÿӇ hiӇn thӏ màu.
Màu sҳc cӫa mô hình này là kӃt quҧ cӫa ánh sáng truyӅn dүn - transmitted
ƒ Màu bù (subtractive): mô hình màu bù sӱ dөng mӵc in - printing inks. Màu sҳc
cҧm nhұn ÿѭӧc là tӯ ánh sáng phҧn xҥ - reflected light (lҩy màu trӝi).
Khoҧng màu mà chúng ta tҥo ra vӟi tұp các màu cѫ bҧn gӑi là gam màu hӋ thӕng
(system’’s color gamut)
Mӛi mô hình màu có khoҧng màu hay gam màu riêng gamut (range) cӫa nhӳng màu
mà nó có thӇ hiӇn thӏ hay in.
Mӛi mô hình màu ÿѭӧc giӟi hҥn khoҧng cӫa phә màu nhìn ÿѭӧc. Gam màu hay
khoҧng còn ÿѭӧc gӑi là không gian màu "color space". Ҧnh hay ÿӗ hoҥ vector có thӇ nói:
sӱ dөng không gian màu RGB hay CMY hay bҩt cӭ không gian màu nào khác.

93
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Mӝt sӕ ӭng dөng ÿӗ hoҥ cho phép ngѭӡi dùng sӱ dөng nhiӅu mô hình màu ÿӗng
thӡi ÿӇ soҥn thҧo hay thӇ hiӋn ÿӕi tѭӧng hình hӑc. ÐiӇm quan trӑng là hiӇu và ÿӇ cho
ÿúng mô hình cҫn thiӃt cho công viӋc.
Có ba hӋ màu ÿӏnh hѭӟng phҫn cӭng:
ƒ RGB (Red, Green, Blue) dùng vӟi CRT
ƒ YIQ trong hӋ thӕng tivi màu băng tҫn rӝng
ƒ CMY (Cyan, Mangenta, Yellow) sӱ dөng mӝt sӕ thiӃt bӏ in màu
Không có mӝt mô hình màu nào trong các mô hình thӵc tӃ trên có tính dӉ sӱ dөng,
vì chúng không có mӕi liên hӋ trӵc tiӃp vӟi ý niӋm màu trӵc giác cӫa con ngѭӡi. Màu mà
con ngѭӡi cҧm nhұn:Hue (sҳc màu), Saturation (ÿӝ bão hoà), Lightness (ÿӝ sáng).
Các mô hình màu khác nhau ÿѭӧc phát triӇn nhҵm sӱ dөng cho mӝt tiêu chí nhҩt
ÿӏnh.
6.3.1. Mô hình màu RGB (Red, Green, Blue - ÿӓ, lөc, lam)
Gam màu thӇ hiӋn trong màn hình CRT xác ÿӏnh bҵng nhӳng ÿһc tính cӫa hiӋn tѭӧng phát
quang các chҩt phӕt pho trong màn hình CRT. Mô hình không gian màu RGB ÿѭӧc sҳp
xӃp theo khӕi lұp phѭѫng ÿѫn vӏ. Ĉѭӡng chéo chính cӫa khӕi lұp phѭѫng vӟi sӵ cân bҵng
vӅ sӕ lѭӧng tӯng màu gӕc tѭѫng ӭng vӟi các mӭc ÿӝ xám vӟi ÿen là (0,0,0) và trҳng
(1,1,1).

Hình 6.13 Mô hình không gian màu RGB


C = rR + gG + bB
Trong ÿó C = màu hoһc ánh sáng kӃt quҧ. (r,g,b) = toҥ ÿӝ màu trong miӅn [0 1],
(R,G,B) = các màu cѫ bҧn ÿӓ, lөc và lam.
ªX º ªX r Xg X b ºªRº
«Y » « »
« » « Yr Yg Yb » ««G »»
«¬ Z »¼ « Zr Zg Z b »¼ «¬ B »¼
¬
NӃu hai màu tҥo ra cùng mӝt giá trӏ kích thích thì chúng ta không thӇ phân biӋt ÿѭӧc
hai màu. Không gian màu RGB dӵa theo chuҭn ITU-R BT.709, vӟi gama = 2.2 và ÿiӇm
trҳng cӫa mô hình là 6500 degrees K.
6.3.2. Mô hình màu CMY (Cyan, Magenta, Yellow - xanh tím, Ĉӓ tѭѫi, vàng)
Ĉây là mô hình màu bù (Subtractive color models) hiӇn thӏ ánh sáng và màu sҳc phҧn xҥ
tӯ mӵc in. Bә xung thêm mӵc ÿӗng nghƭa vӟi ánh sáng phҧn xҥ càng ít.

94
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Khi bӅ mһt không phӫ mӵc thì ánh sáng phҧn xҥ là ánh sáng trҳng - white.
Khi 3 màu có cùng giá trӏ cho ra màu xám. Khi các giá trӏ ÿҥt max cho màu ÿen.
Color = cC + mM + yY
Ta có Red +Cyan = Black ; Green +Magenta = Black ; Blue + Yellow = Black
ª1º ªC º ª1º ª R º
Black «1» «M » «1»  «G »
«» « » «» « »
«¬1»¼ «¬ Y »¼ «¬1»¼ «¬ B »¼

Hình 6.14 Mô hình không gian màu CMY


Mô hình màu CMY- K
Mô hình mӣ rӝng cӫa CMY ӭng dөng trong máy in màu. Giá trӏ ÿen bә xung vào
thay thӃ cho hàm lѭӧng màu bҵng nhau cӫa 3 màu cѫ bҧn.
Công thӭc chuyӇn ÿәi:
K = min(C, M, Y) ;
C =C-K;
M = M - K;
Y=Y-K;
C-Cyan, M-Magenta, Y-Yellow; K-blacK
6.3.3. Mô hình màu YIQ
Mô hình màu YIQ là mô hình màu ÿѭӧc ӭng dөng trong truyӅn hình màu băng tҫn rӝng
tҥi Mӻ, và do ÿó nó có mӕi quan hӋ chһt chӁ vӟi màn hình ÿӗ hoҥ màu raster. YIQ là sӵ
thay ÿәi cӫa RGB cho khҧ năng truyӅn phát và tính tѭѫng thích vӟi ti vi ÿen trҳng thӃ hӋ
trѭӟc. Tín hiӋu truyӅn sӱ dөng trong hӋ thӕng NTSC (National Television System
Committee).
Sӵ biӃn ÿәi RGB thành YIQ ÿѭӧc xác ÿӏnh theo công thӭc sau:

ªY º ª0.299 0.587 0.114 º ª R º


« I » «0.596  0.275  0.321» «G »
« » « » « »
«¬Q »¼ «¬0.212  0.523 0.311 »¼ «¬ B »¼
Y ÿ͡ chói, I & Q ÿ̩i l˱ͫng v͉ màu s̷c
Chú ý: Y giӕng nhѭ Y trong mô hình CIE’’s
Nó hoàn toàn tѭѫng thích vӟi ÿen/trҳng (B/W) cӫa TV

95
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Nhӳng ÿҥi lѭӧng trong ma trұn biӃn ÿәi ÿѭӧc tìm bҵng cách sӱ dөng các phosphor NTSC
RGB chuҭn có các toҥ ÿӝ sҳc phә là R(0.67 0.33), G (0.21 0.71) và B(0.14 0.08). Ngѭӡi
ta cNJng giҧ ÿӏnh rҵng ÿiӇm trҳng nҵm ӣ xw =0.31 , yw = 0.316 và Yw =1.0.
3.4. Mô hình màu HSV (Hue, Saturation,Value) - Mӻ thuұt
YӃu tӕ cҧm nhұn màu sҳc:
ƒ Hue - sҳc màu: dùng ÿӇ phân biӋt sӵ khác nhau giӳa các màu nhѭ xanh, ÿӓ,
vàng...
ƒ Saturation - ÿӝ bão hoà: chӍ ra mӭc ÿӝ thuҫn cӫa mӝt màu hay khoҧng cách cӫa
màu tӟi ÿiӇm có cѭӡng ÿӝ cân bҵng(màu xám)
ƒ Lightness - ÿӝ sáng: hiӋn thân vӅ mô tҧ cѭӡng ÿӝ sáng tӯ ánh sáng phҧn xҥ nhұn
ÿѭӧc tӯ ÿӕi tѭӧng.
ƒ Brightness - ÿӝ phát sáng: cѭӡng ÿӝ ánh sáng mà tӵ ÿӕi tѭӧng phát ra chӭ không
phҧi do phҧn xҥ tӯ các nguӗn sáng khác.
Mô hình màu RGB, CMY, YIQ ÿѭӧc ÿӏnh hѭӟng cho phҫn cӭng
HSV (Hue, Saturation, Value)=HSB(Hue, Saturation, Brightness) ÿӏnh hѭӟng ngѭӡi
sӱ dөng dӵa trên cѫ sӣ vӅ trӵc giác vӅ tông màu, sҳc ÿӝ và sҳc thái mӻ thuұt
Mô hình màu HSV ÿѭӧc Alvey Ray Smith ÿѭa ra 1978. Hue: màu sҳc 00-3600 ÿo
bӣi góc quay xung quanh trөc ÿӭng vӟi màu ÿӓ là 00, màu lөc là 1200, màu lam là 2400.
Các màu bә sung cho hình chóp ӣ 1800 ÿӕi diӋn vӟi màu khác.
Value-Brightness:(ÿӝ sáng) 0-1 ÿѭӡng cao V vӟi ÿӍnh là các ÿiӇm gӕc toҥ ÿӝ (0,0).
ĈiӇm ӣ ÿӍnh là màu ÿen và giá trӏ V=0, tҥi các ÿiӇm này giá trӏ cӫa H và S không liên
quan ÿӃn nhau. Khi ÿiӇm có S=0 và V=1 là ÿiӇm màu trҳng, nhӳng giá trӏ trung gian cӫa
V ÿӕi vӟi S=0 (trên ÿѭӡng thҷng qua tâm) là các màu xám. Khi S=0 giá trӏ cӫa H phө
thuӝc ÿѭӧc gӑi bӣi các qui ѭӟc không xác ÿӏnh. Ngѭӧc lҥi khi S khác 0 giá trӏ H sӁ là phө
thuӝc.
Saturation: Ĉӝ bão hoà 0-1, giá trӏ cӫa S là tұp các giá trӏ tӯ 0 trên ÿѭӡng trөc tâm
(trөc V) ÿӃn 1 trên các mһt bên tҥi ÿӍnh cӫa chóp 6 cҥnh.
Satu

Hình 6.15 Mô hình màu HSV


Mô hình màu HLS (Hue, Lightness, Saturation Model) –– không gian màu trӵc quan
96
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Mô hình thѭӡng ÿѭӧc sӱ dөng trong kӻ thuұt ÿӗ hoҥ. Ѭu ÿiӇm là rҩt trӵc giác ví dө
ta có thӇ chӑn màu, thay ÿәi ÿӝ sáng và thay ÿәi ÿӝ bão hoà. Nhѭӧc ÿiӇm là khi chuyӇn
ÿәi vӟi không gian màu RGB sӁ có sai sӕ (cube stood on end) thay ÿәi trên các loҥi màn
hình khác nhau, rõ ràng không cҧm nhұn ÿӅu các màu.

Hình 6.16 Mô hình màu hình chóp sáu cҥnh ÿôi HLS
Chúng ta có thӇ coi mô hình HLS nhѭ mӝt sӵ biӃn dҥng cӫa mô hình HLS mà trong
ÿó mô hình này màu trҳng ÿѭӧc kéo hѭӟng lên hình chóp sáu cҥnh phía trên tӯ mһt V=1.
Nhѭ vӟi mô hình chóp sáu cҥnh ÿѫn, phҫn bә sung cӫa màu sҳc ÿѭӧc ÿһt ӣ vӏ trí 1800 hѫn
là xung quanh hình chóp sáu cҥnh ÿôi, sӵ bão hoà ÿѭӧc ÿo xung quanh trөc ÿӭng, tӯ
không trên trөc tӟi 1 trên bӅ mһt. Ĉӝ sáng (Lightness)=0 cho màu ÿen (tҥi ÿiӇm mút thҩp
nhҩt cӫa hình chóp sáu cҥnh ÿôi) và bҵng 1 cho màu trҳng (tҥi ÿҫu mút cao nhҩt).
6.3.5. BiӇu ÿӗ màu CIE (1931 –– Commission Internationale de l’’Eclairage)
Nhѭӧc ÿiӇm cӫa RGB:
ƒ KӃt quҧ thӵc nghiӋm cho thҩy rҩt nhiӅu nhӳng ánh sáng mүu không thӇ tҥo thành
tӯ 3 thành phҫn màu cѫ sӣ vӟi nguyên nhân do vӓ cӫa võng mҥc - retinal cortex.
ƒ Vӟi màu Cyan: cѭӡng ÿӝ cӫa ánh sáng 2 màu green và blue kích thích cҧm nhұn
màu ÿӓ trong mҳt ngăn không cho thu ÿѭӧc màu chính xác
ƒ Cách duy nhҩt ÿӇ thu ÿѭӧc màu này là loҥi bӟt phҫn màu ÿӓ bҵng cách thêm ánh
sáng ÿӓ vào mүu ban ÿҫu.
ƒ Bҵng cách thêm tӯ tӯ ánh sáng ÿӓ vào thu ÿѭӧc (test + red) sӁ cho ra màu ÿúng
bҵng (blue + green)
ƒ C + rR = gG + bB <=> C = gG + bB - rR
ƒ Vҩn ÿӅ ÿһt ra là viӋc phӭc tҥp trong phân tích màu và chuyӇn ÿәi màu vӟi ÿҥi
lѭӧng âm cӫa ánh sáng ÿӓ ÿӝc lұp thiӃt bӏ.

97
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ

Hình 6.17 Hàm phân bӕ ba màu cѫ sӣ (qua thӵc nghiӋm - phө thuӝc vào mҳt ngѭӡi)
CIE stands for Comission Internationale de l'Eclairage (International Commission
on Illumination)
Commission thành lұp 1913 tҥo mӝt diӉn ÿàn quӕc tӃ vӅ trao ÿәi ý tѭӣng và thông
tin cNJng nhѭ tұp chuҭn - set standards cho nhӳng vҩn ÿӅ liên quan ÿӃn ánh sáng.
Mô hình màu CIE color phát triӇn trên cѫ sӣ hoàn toàn ÿӝc lұp thiӃt bӏ
Dӵa trên sӵ cҧm nhұn cӫa cӫa mҳt ngѭӡi vӅ màu sҳc.
YӃu tӕ cѫ bҧn cӫa mô hình CIE ÿӏnh nghƭa trên chuҭn vӅ nguӗn sáng và chuҭn vӅ
ngѭӡi quan sát.
CIE XYZ - Color Space
ƒ CIE - Cambridge, England, 1931. Vӟi ý tѭӣng 3 ÿҥi lѭӧng ánh sáng - lights màu
X, Y, Z cùng phә tѭѫng ӭng.
ƒ Mӛi sóng ánh sáng O có thӇ cҧm nhұn ÿѭӧc bӣi sӵ kӃt hӧp cӫa 3 ÿҥi lѭӧng X,Y,Z
ƒ Mô hình - là khӕi hình không gian 3D X,Y,Z gӗm gam màu (gamut) cӫa tҩt cҧ
các màu có thӇ cҧm nhұn ÿѭӧc.
ƒ Color = X’’X + Y’’Y + Z’’Z
ƒ Các giá trӏ XYZ thay thӃ cho 3 ÿҥi lѭӧng truyӅn thӕng RGB
ƒ Màu ÿѭӧc hiӇu trên 2 thuұt ngӳ (Munsell's terms): màu sҳc và sҳc ÿӝ
ƒ Ѭu ÿiӇm cӫa 3 loҥi màu nguyên lý cѫ bҧn là có thӇ sinh ra các màu trên cѫ sӣ tәng
các ÿҥi lѭӧng dѭѫng cӫa màu mӟi thành phҫn.
ƒ ViӋc chuyӇn ÿәi tӯ không gian màu 3D tӑa ÿӝ (X,Y,Z) vào không gian 2D xác
ÿӏnh bӣi tӑa ÿӝ (x,y),theo công thӭc dѭӟi phân sӕ cӫa cӫa tәng 3 thành phҫn cѫ
bҧn.
ƒ x = X/(X+Y+Z) , y = Y/(X+Y+Z) , z = Z/(X+Y+Z)
Có: x + y + z = 1, ӣ ÿây toҥ ÿӝ z không ÿѭӧc sӱ dөng

98
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ

Hình 6.18 Hàm phân bӕ cӫa các ÿҥi lѭӧng CIE cѫ sӣ


ƒ Chuҭn CIE xác ÿӏnh 3 màu giҧ thuyӃt hypothetical colors, X, Y, and Z làm cѫ sӣ
cho phép trӝn màu theo mô hình 3 thành phҫn kích thích.
ƒ Không gian màu hình móng ngӵa - horseshoe-shaped là kӃt hӧp cӫa không gian
tӑa ÿӝ 2D màu x, y và ÿӝ sáng.
ƒ Ox = 700 nm; Oy = 543.1 nm; Oz = 435.8 nm
ƒ Thành phҫn ÿӝ sáng hay ÿӝ chói ÿѭӧc chӍ ÿӏnh chính bҵng giá trӏ ÿҥi lѭӧng Y
trong tam kích tӕ cӫa màu sҳc

Hình 6.19 Không gian màu hình móng ngӵa


Mô hình CIE xyY

Hình 6.20 Mô hình màu CIE xyY


ƒ Thang ÿo cӫa Y xuҩt phát tӯ ÿiӇm trҳng trên ÿѭӡng thҷng vuông góc vӟi mһt
phҷng x,y vӟi giá trӏ tӯ 0 tӟi 100.

99
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
ƒ Khoҧng màu lӟn nhҩt khi Y=0 tҥi ÿiӇm trҳng và bҵng CIE Illuminant C. Ĉây là
ÿáy cӫa hình.
ƒ Khi Y tăng màu trӣ nên sáng hѫn và khoҧng màu hay gam màu giҧm diӋn tích trên
tӑa ÿӝ x,y cNJng giҧm theo.
ƒ Tҥi ÿiӇm trên không gian vӟi Y= 100 màu có sҳc xám bҥc và khoҧng màu ӣ ÿây là
bé nhҩt.

Hình 6.21 Không gian màu hình móng ngӵa


6.4. CHUYӆN ĈӘI GIӲA CÁC Hӊ MÀU
ViӋc xây dӵng và thӇ hiӋn màu sҳc cӫa các ÿӕi tѭӧng trên màn hình ÿӗ hoҥ chӍ thӵc hiӋn
qua mô hình ba màu mà phҫn cӭng hӛ trӧ RGB. Vұy khi phҫn mӅm ӭng dөng có sӱ dөng
ÿӃn các mô hình màu khác, ta phҧi chuyӇn ÿәi giӳa chúng.
6.4.1. ChuyӇn ÿәi HSV - RGB
HӋ HSV có H (sҳc màu) chҥy tӯ 00 ÿӃn 3600 vӟi màu ÿӓ tҥi 00 .
S (ÿӝ bão hoà) và V (giá tӏ cѭӡng ÿӝ ánh sáng) thuӝc khoҧng [0 1]
If (S==0)//H khong tham gia - ÿen trұng
R = V;
G = V;
B = V;
Else // Khi ÿó S<>0 trѬӟng hӥp màu
// Màu cөa ÿiӅm ҥnh ÿѬӥc xác ÿӍnh thông qua 3 biӁn phӧ M,N và K
if (H==360)
H=0;
Else
H = H/60;
I = (int)H; // lҧy giá trӍ nguyên
F = H - I;
M = V*(1 - S);
N = V*(l - S*F);
K = V*(1- S*(1- F));
if I == 0 then (R,G,B) = (V,K,M);
if I == 1 then (R, G, B) = (N, V, M);
if I == 2 then (R, G, B) = (M, V, K);

100
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
if I == 3 then (R, G, B) = (M, N, V);
if I == 4 then (R, G, B) = (K, M, V);
if I == 5 then (R, G, B) = (V, M, N);
6.4.2. ChuyӇn ÿәi RGB sang XYZ

ªX º ª a11 a12 a13 º ª R º


«Y » «a a 22 a 23 »» ««G »»
« » « 21
«¬ Z »¼ «¬ a31 a32 a33 »¼ «¬ B »¼
Các nhà sҧn xuҩt cung cҩp các toҥ ÿӝ XYZ cho phӕt pho tѭѫng ӭng vӟi màu RGB
mà màn hình hiӇn thӏ: (Xr, Yr, Zr ), (Xg, Yg, Zg) và (Xb, Yb, Zb)
Hay viӃt lҥi:

ªX º ªX r Xg X b ºªRº
«Y » « »
« » « Yr Yg Yb » ««G »»
«¬ Z »¼ « Zr Zg Z b »¼ «¬ B »¼
¬
Có R=1
ªRº ª1º ªX º ªX r º
«G » «0» suy ra «Y » «Y »
« » « » « » « r»
«¬ B »¼ «¬0»¼ «¬ Z »¼ «¬ Z r »¼

Tѭѫng tӵ G=1 Tѭѫng tӵ B=1

ªRº ª0 º ªX º ªX g º ªRº ª0 º ªX º ªXb º


«G » «1» suy ra «Y » « » «G » «0» suy ra «Y » «Y »
« » « » « » « Yg » « » « » « » « b»
«¬ B »¼ «¬0»¼ «¬ Z »¼ «Zg » ¬« B ¼» ¬«1¼» ¬« Z ¼» ¬« Z b ¼»
¬ ¼
Thѭӡng [X Y Z] cho mӛi phӕt pho (phosphor) thì không ÿѭӧc cung cҩp, nên chúng
ta tính vӟi trѭӡng hӧp ÿiӇm trҳng (whitepoint) khi R=G=B=1.
Bây giӡ chúng ta cҫn biӃt ÿӝ chói cӫa ÿiӇm trҳng ÿѭӧc gӱi bӣi Yw . Ta ÿһt:
Er = Xr + Yr + Zrsuy ra xr = Xr / Er vұy Xr = xr .Er ; Yr = yr.Er ; Zr = (1- xr –– yr ).Er
Tѭѫng tӵ:

ªX º ª xr E r xg E g xb Eb ºªRº
«Y » « »« »
« » « y r Er yg Eg yb Eb » «G »
«¬ Z »¼ «(1  xr  yr ) Er (1  xg  y g ) E g (1  xb  yb ) Eb »¼ «¬ B »¼
¬
Ta có ÿiӇm trҳng:

ªX w º ª1º
«Y » >M @««1»»
« w»
«¬ Z w »¼ «¬1»¼
Mà ta có theo NTSC: RGB chuҭn (xw, yw, Yw) nhѭ sau: xw = 0.31, yw = 0.316 và Yw =1.0
Có:

101
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
Yw Yw
yw ( X w  Yw  Z w )
X w  Yw  Z w yw
Xw Yw
xw Xw = xw (Xw + Yw + Zw ) X w xw
X w  Yw  Z w yw
Yw
Và: Zw (1  x w  y w )
yw
Ta có R + G + B = W nên:

ªX r º ªX g º ªXb º ªX w º
«Y »  «Y »  «Y » «Y »
« r» « g» « b» « w » suy ra Xw =Xr + Xg + Xb = xrEr + xrEg + xbEb
«¬ Z r »¼ «¬ Z g »¼ «¬ Z b »¼ «¬ Z w »¼
Tӯ ÿó:

ªX w º ª xr xg xb º ª Er º
«Y » « »« »
« w» « yr yg yb »«Eg »
«¬ Z w »¼ «(1  xr  y r ) (1  x g  y g ) (1  xb  yb )» «¬ Eb »¼
¬ ¼
Ta hoàn toàn tính ÿѭӧc: Er, Eg và Eb
Tóm tҳt:
Chѭѫng này chúng ta nghiên cӭu cҩu tҥo cӫa ánh sáng (vӅ mһt vұt lý), rӗi xét bӝ phұn
cҧm nhұn ánh sáng cӫa con ngѭӡi là mҳt. Ĉѭa ra các hӋ màu ÿӏnh hѭӟng cho phҫn cӭng
nhѭ: RGB dùng cho máy tính, CMYK dùng cho máy in và YIQ dùng cho truyӅn hình. Tҩt
cҧ các hӋ màu này con ngѭӡi ÿӅu không cҧm nhұn ÿѭӧc, con ngѭӡi chӍ cҧm nhұn ÿѭӧc hӋ
màu HSV hay HLS. Tӯ tҩt cҧ các ѭu nhѭӧc ÿiӇm cӫa các hӋ màu trên, tӯ sӵ cҧm nhұn
màu sҳc cӫa con ngѭӡi phө thuӝc vào cҩu tҥo cӫa các tӃ bào mҳt nên năm 1913 tә chӭc
quӕc tӃ vӅ ánh sáng ÿã ÿѭa ra hӋ màu chuҭn thuҫn nhҩt CIE. HӋ màu này có thӇ bao hàm
tҩt cҧ các hӋ màu trên, nó giҧi quyӃt ÿѭӧc các nhѭӧc ÿiӇm cӫa hӋ màu RGB. Cuӕi cùng
chúng ta ÿѭa ra các công thӭc ÿӇ chuyӇn ÿәi giӳa các hӋ màu vӟi nhau.
Bài tұp:
1. Giҧ sӱ rҵng môi trѭӡng trӑng tâm là không khí (hoһc chân không) hãy mô tҧ dҧi
quang phә hiӇn thӏ bҵng mӝt dҧi tҫn sӕ.
2. Tҥi sao mӑi thӭ trông có vҿ màu xám hoһc ÿen trong mӝt phòng tӕi nѫi chúng ta
hҫu nhѭ không thӇ nhìn thҩy ÿѭӧc?
3. Hãy thiӃt lұp mӝt công thӭc ÿѫn giҧn ÿӇ tính diӋn tích bӏ giӟi hҥn bӣi hàm phân bӕ
P(O). (Xem hình 6.9 sách Kӻ thuұt ÿӗ hoҥ)
4. Tӯ hàm phân bӕ P(O) hãy lұp công thӭc tính ÿӝ bão hoà tӯ hình 6.9 - sách kӻ thuұt
ÿӗ hoҥ.
5. Sӵ khác nhau giӳa Y trong CMY và Y trong YIQ là gì?

102
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
6. Giҧ sӱ rҵng mӝt màn hình hiӇn thӏ tҥo nên nhӳng gì ÿѭӧc gӑi là màu trҳng chuҭn
vӟi xw = 0.313 yw =0.329 và Yw = 1.0 (R=G=B=1). Và các toҥ ÿӝ sҳc phә cӫa phӕt
pho giӕng nhѭ toҥ ÿӝ ÿѭӧc tìm thҩy ӣ mô hình màu.
R(0.62 0.34)G(0.290.59)B(0.150.06)
Hãy tìm ma trұn biӃn ÿәi màu M cho màn hình hiӇn thӏ.
7. Hãy kiӇm nghiӋm rҵng Y trong mô hình CIE XYZ tѭѫng tӵ Y trong mô hình màu
NTSC YIQ. Ta có NTSC chuҭn thì: xw =0.31 , yw = 0.316 và Yw =1.0 và sӱ dөng
các toҥ ÿӝ sҳc phә cӫa các phӕt pho NTSC chuҭn: R(0.67 0.33), G (0.21 0.71) và
B(0.14 0.08).

103
Chѭѫng 8: Ánh sáng

CHѬѪNG 7: ĈѬӠNG CONG VÀ MҺT CONG TRONG 3D

7.1. ĈѬӠNG CONG - CURVE


Trong các ӭng dөng cӫa ÿӗ hoҥ máy tính, hҫu nhѭ các thӵc thӇ là ÿѭӡng cong mӅm và
mһt cong, chúng dùng ÿӇ mô tҧ thӃ giӟi thӵc: nhà cӱa, xe cӝ, núi non…….hay xây dӵng nên
các thӵc thӇ ÿang ÿѭӧc thiӃt kӃ. Nhѭng ta thҩy sӱ dөng các phѭѫng trình ÿѭӡng cong
không thӇ hiӋn ÿѭӧc hình ҧnh thӵc hay ý tѭӣng cӫa ngѭӡi thiӃt kӃ, còn nӃu ta dùng tұp
hӧp các ÿiӇm thì thѭӡng cҫn nhiӅu dung lѭӧng nhӟ ÿӇ lѭu trӳ cNJng nhѭ tӕc ÿӝ tính toán.
Ta có quӻ ÿҥo chuyӇn ÿӝng cӫa mӝt ÿiӇm trong không gian thì tҥo thành ÿѭӡng
cong. Trong chѭѫng này sӁ ÿѭa ra phѭѫng pháp tәng thӇ vӅ nhӳng mô hình toán hӑc ÿӇ
biӇu diӉn và xây dӵng các loҥi ÿѭӡng và mһt cong trong không gian 3D trên máy tính.
7.1.1. ĈiӇm biӇu diӉn ÿѭӡng cong (curve represents points )
Ta thҩy qua hai ÿiӇm vӁ ÿѭӧc mӝt ÿѭӡng thҷng. Qua ba ÿiӇm vӁ ÿѭӧc mӝt ÿѭӡng cong
trong mһt phҷng. Qua bӕn ÿiӇm vӁ ÿѭӧc mӝt ÿѭӡng cong trong không gian. Dùng các
phѭѫng trình ÿѭӡng cong nhѭ Hypebol, parabol... thì tính toán phӭc tҥp và không thӇ hiӋn
ÿѭӧc hình ҧnh thӵc hay ý tѭӣng cӫa ngѭӡi thiӃt kӃ.
Chӑn ÿѭӡng cong nhѭ thӃ nào ÿӇ phù hӧp vӟi máy tính? BiӇu diӉn và ÿiӅu khiӇn
ÿѭӡng cong thông qua ÿiӇm ÿiӅu khiӇn. Ĉѭӡng cong là các ÿӕi tѭӧng cѫ bҧn thѭӡng là
kӃt quҧ cӫa tiӃn trình thiӃt kӃ và các ÿiӇm ÿóng vai trò là công cө ÿӇ kiӇm soát và mô hình
hoá ÿѭӡng cong. Cách tiӃp cұn này là cѫ sӣ cӫa lƭnh vӵc thiӃt kӃ mô hình hình hӑc nhӡ
máy tính (Computer Aided Geometric Design - CAGD).
Các cách ÿӇ biӇu diӉn ÿѭӡng cong:
ƒ Tѭӡng minh (Explicit functions):
y = f(x), z = g(x)
ƒ Không tѭӡng minh (Implicit equations):
f(x,y,z) = 0
ƒ BiӇu diӉn các ÿѭӡng cong tham biӃn (Parametric representation)
x = x(t), y = y(t), z = z(t) trong ÿó t  [0 1]
Hҥn chӃ:
ƒ HӋ ÿӗ hoҥ ӭng dөng chӍ mô tҧ bó hҽp trong ÿoҥn nào ÿҩy
ƒ Ĉѭӡng cong bұc cao vӟi mӛi giá trӏ cӫa x ta luôn có 2 tұp giá trӏ cӫa y (thӵc tӃ
chӍ cҫn 1)
ƒ Chúng ta cҫn biӇu diӉn ÿѭӡng cong mӅm (chӍ biӉu diӉn ÿѭӡng ““cong gүy””)
7.1.2. Ĉѭӡng cong ÿa thӭc bұc ba tham biӃn
Phҧi ÿҧm bҧo là ÿѭӡng cong không gian vӟi 3 trөc toҥ ÿӝ x, y, z. Tránh ÿѭӧc nhӳng tính
toán phӭc tҥp và nhӳng phҫn nhҩp nhô ngoài ý muӕn xuҩt hiӋn ӣ nhӳng ÿѭӡng ÿa thӭc
bұc cao.
Công thӭc mô tҧ:
Tѭӡng minh : y = f3(x),z = g3(x)
104
Chѭѫng 8: Ánh sáng
Không tѭӡng minh: f3(x,y,z) = 0

Hình 7.1 Ĉѭӡng cong ÿa thӭc bұc ba


BiӇu diӉn các ÿѭӡng cong tham biӃn (Parametric representation):
x = f3(u), y = f3(u), z = f3(u) trong ÿó u  [0 1]
Theo Lagrange:
x = a1 + b1u + c1u2 + d1u3
y = a2 + b2u + c2u2 + d2u3
z = a3 + b3u + c3u2 + d3u3
Ӣ ÿây ba phѭѫng trình vӟi 12 ҭn sӕ
Vӟi 4 ÿiӇm p0, p1, p2, p3 phѭѫng trình xác ÿӏnh (vì 4 ÿiӇm thì xác ÿӏnh 1 ÿѭӡng cong
trong không gian).
ª x0 º ª x1 º ª x2 º ªx3 º
Mӛi 1 ÿiӇm cho ta cһp 3 giá trӏ: P0 «y » P «y » P «y » P «y »
« 0» 1 « 1» 2 « 2» 3 « 3»
«¬ z 0 »¼ «¬ z1 »¼ «¬ z 2 »¼ «¬ z 3 »¼

Cҧ thҧy có 12 phѭѫng trình, thay vào 3 phѭѫng trình trên ta tính ÿѭӧc 12 ҭn a1.....d3
Ghi chú: rõ ràng có sӵ thay ÿәi mӝt chút vӅ ÿѭӡng cong thì ta lҥi phҧi giҧi lҥi hӋ
phѭѫng trình ÿӇ tính các tham sӕ cho ÿѭӡng cong, dүn ÿӃn tính toán chұm.
7.1.3. Ĉѭӡng cong Hermite
Phѭѫng pháp Hermite dӵa trên cѫ sӣ cӫa cách biӇu diӉn Ferguson hay Coons năm 60. Vӟi
phѭѫng pháp cӫa Hermite ÿѭӡng bұc ba sӁ xác ÿӏnh bӣi hai ÿiӇm ÿҫu và cuӕi cùng vӟi hai
góc nghiêng tҥi hai ÿiӇm ÿó.

Hình 7.2 Ĉѭӡng cong Hermite


Theo công thӭc toán hӑc hàm bұc ba ÿѭӧc biӇu diӉn dѭӟi dҥng:
p = p(u) = k0 + k1u + k2u2 + k3u3
p(u) = ¦kiuiin (vӟi ki là các tham sӕ chѭa biӃt)

105
Chѭѫng 8: Ánh sáng
Ĉӝ dӕc cӫa ÿѭӡng cong ÿѭӧc ÿo bҵng p’’(u)
p’’ = p’’(u) = k1 + 2k2u + 3k3u2
p0 và p1 ta có hai ÿӝ dӕc p0’’ và p1’’ vӟi u = 0 và u = 1 tҥi hai ÿiӇm ÿҫu cuӕi cӫa ÿoҥn
[0,1].
p0 (u=0)=k0
p’’0(u=0)=k1
p1(u=1)=k0+k1+k2+k3
p’’1(u=1)= k1+2k2+3k3
hay
k0=p0 và k1=p’’0
k2=3(p1 –– p0) - 2p0’’ –– p1’’ và k3 = 2(p0-p1) + p0’’ + p1’’
Khi ÿã có ko, k1, k2, k3 thay vào:
p = p(u) = k0 + k1u + k2u2 + k3u3
p0(1-3u2+2u3) + p1(3u2-2u3) + p0’’(u-2u2+u3) + p1’’(-u2+u3)

ª1 0 0 0 º ª p0 º
«0 0 1 0 »» «« p1 »»
p = p(u) = [ 1 u u2 « .
« 3 3  2  1» « p'0 »
« » « »
¬2 2 1 1 ¼ ¬ p '1 ¼

Thay ÿәi cӫa các ÿiӇm hay các góc nghiêng (thay ÿәi 2 vector) dүn ÿӃn sӵ thay ÿәi
hình dҥng cӫa ÿѭӡng.
7.1.4. Ĉѭӡng cong Bezier
ViӋc sӱ dөng ÿiӇm vӟi các vector kiӇm soát ÿѭӧc ÿӝ dӕc cӫa ÿѭӡng cong tҥi nhӳng ÿiӇm
mà nó ÿi qua. Tuy nhiên không ÿѭӧc thuұn lӧi cho viӋc thiӃt kӃ tѭѫng tác, không tiӃp cұn
vӟi các ÿӝ dӕc cӫa ÿѭӡng cong bҵng các giá trӏ sӕ (Hermite).
Paul Bezier, nhân viên hãng RENAULT vào năm 1970 ÿi ÿҫu trong viӋc ӭng dөng
máy tính cho viӋc xây dӵng các bӅ mһt. HӋ thӕng UNISURF cӫa ông ÿӵѫc áp dөng trong
thӵc tӃ vào năm 1972 ÿѭӧc thiӃt kӃ và kiӇm xe Mezesez hay Renaut.
Bezier ÿã sӱ dөng ÿa giác kiӇm soát cho ÿѭӡng cong tҥi nhӳng ÿӍnh cӫa ÿa giác và
tiӃp tuyӃn tҥi ÿó (p0,p1,p2,p3).
Ta có p0, p3 tѭѫng ÿѭѫng vӟi p0, p1 trên ÿѭӡng Hermite, ÿiӇm trung gian p1, p2 ÿѭӧc
xác ÿӏnh bҵng 1/3 theo ÿӝ dài cӫa vector tiӃp tuyӃn tҥi ÿiӇm po và p3

Hình 7.3 Ĉa giác kiӇm soát Bezier

106
Chѭѫng 8: Ánh sáng
p0’’ = 3(p1 –– p0)
p1’’ = 3(p3 –– p2)
p = p(u) = p0(1-3u2+2u3) + p1(3u2-2u3) + p0’’(u-2u2+u3) + p1’’(-u2 + u3)
p = p(u) = p0(1 - 3u + 3u2 - u3) + p1(3u-6u2-3u3) + p2(3u2 - 3u3) + p3u3

ª1 0 0 0 º ª p0 º
« 3 3 0 0 » «p »
p = p(u) = [ 1 u u2 u3 « » « 1»
« 3 6 3 0 » « p2 »
« » « »
¬ 1 3  3 1 ¼ ¬ p3 ¼

Hình 7.4 Hàm hӧp cӫa ÿѭӡng cong Bezier


Ѭu ÿiӇm:
DӉ dàng kiӇm soát hình dҥng cӫa ÿѭӡng cong hѫn vector tiӃp tuyӃn tҥi p0’’ và p1’’ cӫa
Hermite.
Nҵm trong ÿa giác kiӇm soát vӟi sӕ ÿiӇm trung gian tuǤ ý (sӕ bұc tuǤ ý),
có sӕ bұc =sӕ ÿiӇm kiӇm soát -1.
Ĉi qua ÿiӇm ÿҫu và ÿiӇm cuӕi cӫa ÿa giác kiӇm soát, tiӃp xúc vӟi cһp hai vector cӫa
ÿҫu cuӕi ÿó.
BiӇu thӭc Bezier-Bernstain
Ĉѭӡng Bezier cNJng có thӇ ÿѭӧc biӃt ÿӃn nhѭ biӇu thӭc Bezier Bernstain bӣi kӻ thuұt
mà Bezier sӱ dөng là áp dөng công thӭc hoá các vector trong phép tính ÿa giác xҩp xӍ
ÿѭӧc Bernstain phát triӇn gҫn ÿây. Phép toán ÿҥi sӕ ÿѭӧc xác ÿӏnh nhѭ sau:
0dud1
0!=1, ui =1 khi i = 0
n
P (u ) ¦B
i 0
i ,n (u ) Pi

Bi ,n (u ) C (n, i )u i (1  u ) ni

n!
C (n, i)
i!(n  i)!
Trong ÿó P0.....Pn: vector vӏ trí cӫa ÿa giác (n+1) ÿӍnh.

107
Chѭѫng 8: Ánh sáng
7.1.5. Ĉѭӡng cong B-spline
7.1.5.1. Ĉ˱ͥng cong b̵c ba Spline
Trong công thӭc cӫa Bezier, chúng ta sӱ dөng hàm hӧp liên tөc ÿӇ xác ÿӏnh ÿiӇm kiӇm
soát tѭѫng ÿӕi. Vӟi các ÿiӇm nӝi suy thì mӭc ÿӝ tѭѫng ÿӕi sӁ khác nhau mà trong ÿó mӝt
chuӛi các phҫn tӱ nhӓ sӁ kӃt hӧp vӟi nhau tҥo ra ÿѭӡng cong ÿa hӧp. Theo tính toán thì
ÿѭӡng bұc ba sӁ ÿa thӭc bұc thҩp nhҩt có thӇ ÿӇ biӇu diӉn mӝt ÿѭӡng cong trong không
gian và chuӛi ÿiӇm Hermite sӁ phù hӧp nhҩt ÿӕi vӟi viӋc xây dӵng nên ÿѭӡng cong ÿa
hӧp này.
ViӋc yêu cҫu ngѭӡi sӱ dөng ÿѭa vào các vector tiӃp tuyӃn tҥi mӛi ÿiӇm trong tұp
hӧp các ÿiӇm là cӵc kǤ bҩt tiӋn cho nên thѭӡng trong các ÿѭӡng bұc ba ÿa hӧp ta sӱ dөng
các ÿiӅu kiӋn biên liên tөc trong phép ÿҥo hàm bұc mӝt và hai tҥi ÿiӇm nӕi giӳa. và ÿѭӡng
cong ÿѭӧc xác ÿӏnh nhѭ trên gӑi là ÿѭӡng spline bұc ba vӟi phép ÿҥo hàm liên tөc bұc hai.
Giá trӏ ÿҥo hàm cӫa ÿѭӡng cong sӁ xác ÿӏnh ÿӝ cong tҥi mӛi ÿiӇm nút và nó cNJng ÿѭa ra
ÿiӅu kiӋn biên cho mӛi ÿoҥn trên ÿѭӡng cong.
Vұy ÿѭӡng bұc ba spline có ѭu ÿiӇm là không phҧi xác ÿӏnh ÿӝ dӕc cӫa ÿѭӡng tҥi
các nút nhѭng nhѭӧc ÿiӇm cӫa nó là chӍ tҥo ra sӵ thay ÿәi toàn cөc khi ta thay ÿәi vӏ trí
cӫa ÿiӇm.
Ĉѭӡng cong –– Spline ÿi qua n ÿiӇm cho trѭӟc mà mӛi ÿoҥn là các ÿѭӡng cong bұc
ba ÿӝc lұp có ÿӝ dӕc và ÿӝ cong liên tөc tҥi mӛi ÿiӇm kiӇm soát hay ÿiӇm nút. Vӟi n ÿiӇm
ta có (n-1) ÿoҥn vӟi mӛi ÿoҥn gӕm bӕn vector hӋ sӕ hay 4(n-1) cho n-1 ÿoҥn, và 2(n-1)
ÿiӅu kiӋn biên và (n-2) ÿiӅu kiӋn vӅ ÿӝ dӕc cùng (n-2) vӅ ÿӝ cong.
ĈӇ xây dӵng nên ÿѭӡng spline có tham sӕ vӟi n ÿiӇm nút ta có mӝt dãy các giá trӏ
tham sӕ mà ta gӑi là vector nút.
u0......un-1 trong ÿó ui+1 >ui
Cҫn lӵa chӑn tҥi mӛi nút, cách lӵa chӑn ÿѫn giҧn nhҩt là theo cách ÿѫn ÿiӋu có
nghƭa là vӟi giá trӏ 0 tҥi ÿiӇm ÿҫu và tăng lên 1 tҥi nhӳng ÿiӇm kӃ tiӃp. tuy vұy phѭѫng
pháp này dүn ÿӃn ÿӝ cong không mong muӕn tҥi các ÿiӇm vì vұy viӋc tham sӕ hoá sӁ ÿѭa
vào chiӅu dài, nhѭng phѭѫng pháp này cNJng không ÿѭӧc chính xác khi mà ÿѭӡng cong
chѭa xác ÿӏnh chiӅu dài. Tuy nhiên thông thѭӡng ngѭӡi ta sӱ dөng viӋc tích luӻ cӫa các
dây cung vӟi:
u0 =0và ui+1 = ui + di+1 trong ÿó di: là khoҧng cách giӳa 2 ÿiӇm pi-1 và pi
Trong các trѭӡng hӧp ÿѭӡng cong có bұc lӟn hѫn ba có thӇ dùng cho ÿѭӡng spline.
Thông thѭӡng ÿѭӡng spline bұc n sӁ ÿѭӧc xây dӵng trên các phҫn nhӓ liên tөc cӫa các
biӃn ÿӝc lұp.

Hình 7.5 KӃt nӕi hai ÿѭӡng cong

108
Chѭѫng 8: Ánh sáng
Hình trên cho thҩy hai ÿoҥn cong có chung ÿiӇm nӕi mà ÿѭӡng cong liên tөc tҥi
ÿiӇm ÿó, viӋc biӇu diӉn tính liên tөc cӫa ÿѭӡng cong thông qua chӳ cái C-Cuntinue. C0 ÿӇ
ÿҧm bҧo không có sӵ gián ÿoҥn giӳa hai ÿoҥn cong. C1 tính liên tөc bұc nhҩt hay ÿҥo hàm
bұc nhҩt tҥi ÿiӇm nӕi. C2 ÿҥo hàm bұc hai liên tөc cӫa ÿѭӡng cong tҥi ÿiӇm nӕi.
Giҧ sӱ khi biӇu diӉn ÿѭӡng cong mӅm thông qua các ÿoҥn cong q1, q2, q3 (mӛi
ÿoҥn có 4 vector hӋ sӕ) cҫn thoҧ mãn:
Liên tөc tҥi ÿiӇm nӕi hay C10 = C20
Ĉӝ dӕc (hay vector tiӃp tuyӃn) tҥi ÿiӇm nӕi (ÿiӇm cuӕi cӫa q1 và ÿҫu q2) là nhѭ
nhau: C11 = C21 (ÿҥo hàm bұc nhҩt)
Thoҧ mãn liên tөc trên tҥi ÿiӇm nӕi (ÿҥo hàm bұc 2 liên tөc tҥi ÿiӇm nӕi)C12 = C22
ViӋc kӃt hӧp các ÿoҥn cong Hermite bұc ba ÿӇ mô tҧ mӝt ÿѭӡng cong mӅm theo
kiӇu phân ÿoҥn spline là phѭѫng pháp ÿѫn giҧn nhҩt hay còn gӑi là phѭѫng pháp Hermite
nӝi suy. Vӟi phѭѫng pháp này thì tham biӃn ui cho mӛi ÿoҥn cong i cӫa tұp các ÿoҥn cong
Hermite sӁ biӃn ÿәi trong khoҧng tӯ 0 ÿӃn 1 và luôn tӗn tҥi ÿҥo hàm bұc nhҩt cӫa các
ÿoҥn cong tҥi các ÿiӇm nӕi. Phѭѫng trình cho mӛi ÿoҥn cong ÿѭӧc sӱ dөng lúc này là
phѭѫng trình ÿѭӡng cong bұc ba Hermite:
ª1 0 00 º ª p0 º
«0 0 1 0 »» «« p1 »»
p = p(u) = [ 1 u u2 « .
« 3 3  2  1» « p'0 »
« » « »
¬2 2 1 1 ¼ ¬ p '1 ¼

y
Pn-1’’

Pn-1

Po’’
P1
z x

Hình 7.6 Phân ÿoҥn cӫa ÿѭӡng cong Spline - Hermite


Theo Hermite các ÿoҥn là các ÿѭӡng cong, tính liên tөc cӫa ÿҥo hàm bұc hai tҥi các
ÿiӇm nӕi có thӇ dӉ dàng ÿҥt ÿѭӧc bҵng cách ÿһt P’’’’i-1(ui-1=1) là ÿҥo hàm bұc hai tҥi ÿiӇm
cuӕi cӫa ÿoҥn (i-1) bҵng vӟi P’’’’i(ui=0) ÿҥo hàm bұc hai tҥi ÿiӇm ÿҫu cӫa ÿoҥn thӭ i.
P’’’’i-1(1)= P’’’’i(0)
Có phѭѫng trình:
Pi(u) = k0i + k1iu + k2iu2 + k3iu3
Ĉҥo hàm bұc hai sӁ là:
P’’’’i(u) = 2k2i + 6k3iu
P’’’’i-1(1)= P’’’’i(0) nên 2k2(i-1) + 6k3(i-1)u= 2k2i
Vì ÿiӇm cuӕi cӫa ÿoҥn i-1 trùng vӟi ÿiӇm ÿҫu cӫa ÿoҥn thӭ i(Pi(0)=Pi-1(1))

109
Chѭѫng 8: Ánh sáng
Theo Hermite: k2 = 3(p1 –– p0) - 2p0’’ –– p1’’ và
k3 = 2(p0-p1) + p0’’ + p1’’
2(3(Pi –– Pi-1) - 2P’’i-1 –– P’’i)+6(2(Pi-1-Pi) + P’’i-1 + P’’i)=2(2(Pi-1 - Pi) + P’’i-1 + P’’i)
Hay: P’’i-1 + 4P’’i + P’’i+1 = 3(Pi+1 ––Pi) (*)
Vӟi phѭѫng trình (*) này thì phѭѫng trình dҥng tәng quát cӫa ÿѭӡng cong Spline là
tұp cӫa các ÿoҥn cong Hermite sӁ xác ÿӏnh vӟi ÿiӅu kiӋn ban ÿҫu cho là tұp các ÿiӇm kiӇm
soát cӫa ÿѭӡng cong và hai vector tiӃp tuyӃn tҥi hai ÿiӇm ÿҫu cuӕi cӫa ÿѭӡng cong ÿó. Sӱ
dөng (*) ta có thӇ tính ÿѭӧc các giá trӏ cӫa các vector tiӃp tuyӃn tҥi tӯng ÿiӇm kiӇm soát
cӫa ÿѭӡng cong.
ª1 0 . . . . º ª P0' º ª P0' º
«1 4 1 0 . . » « ' » « »
« » « P1 » « 3( P2  P0 ) »
«0 1 4 1 0 . » « . » « . »
« ».« » « »
« . . . . . .» « . » « . »
« . . 0 1 4 1» « Pn' 2 » «3( P  P )»
« »« ' » « n 1 ' n 3 »
¬« . . . . 0 1¼» «¬ Pn1 »¼ «¬ Pn 1 »¼
Tѭѫng ÿѭѫng vӟi:
1
ª P0' º ª1 0 . . . . º ª P0' º
« ' » «1 4 1 0 . . » « »
« P1 » « » « 3( P2  P0 ) »
« . » «0 1 4 1 0 . » « . »
« » « » .« »
« . » « . . . . . .» « . »
«P ' » « . . 0 1 4 1» «3( P  P )»
« n' 2 » « » « n 1 ' n 3 »
¬« Pn1 ¼» «¬ . . . . 0 1»¼ ¬« Pn1 ¼»
7.1.5.2. Ĉ˱ͥng B-spline
Vӟi Bezier hay spline ÿӅu không cho ta thay ÿәi ÿѭӡng cong mӝt cách cөc bӝ, viӋc thay
ÿәi vӏ trí các ÿiӇm kiӇm soát hay các vector tiӃp tuyӃn không chӍ ҧnh hѭӣng trӵc tiӃp ÿӃn
ÿӝ dӕc cӫa ÿѭӡng cong lân cұn quanh ÿiӇm kiӇm soát mà còn kéo theo ҧnh hѭӣng ÿӃn các
phҫn còn lҥi cӫa ÿѭӡng cong. Ĉѭӡng Bezier thêm vào ÿó là khi tính xҩp xӍ ӣ bұc cao sӁ
rҩt phӭc tҥp còn khi liên kӃt nhiӅu ÿoҥn Bazier hay Hermite bұc thҩp (bұc ba) có thӇ ÿem
lҥi ích lӧi khi tính toán nhѭng yӃu tӕ ràng buӝc vӅ tính liên tөc cӫa ÿҥo hàm bұc cao tҥi
các ÿiӇm nӕi không cho ÿiӅu khiӇn cөc bӝ nhѭ mong muӕn.
ViӋc kӃt hӧp luôn phiên các ÿoҥn cong tәng hӧp, thông qua các ÿa thӭc tham sӕ xác
ÿӏnh riêng rӁ trên mӝt sӕ ÿiӇm kiӇm soát lân cұn vӟi sӕ bұc tuǤ ý không phө thuӝc vào sӕ
lѭӧng các ÿiӇm kiӇm soát, cho phép tҥo nên ÿѭӡng cong trѫn mӅm B-spline. Ĉѭӡng cong
này ÿã khҳc phөc ÿѭӧc các nhѭӧc ÿiӇm mà các dҥng ÿѭѫng cong trѭӟc chѭa ÿҥt ÿѭӧc. Có
nghƭa là khi dӏch chuyӇn ÿiӇm kiӇm soát cӫa ÿѭѫng cong thì chӍ mӝt vài phân ÿoҥn lân
cұn cӫa ÿiӇm kiӇm soát ÿó bӏ ҧnh hѭӣng chӭ không phҧi toàn bӝ ÿѭӡng cong.
Vӟi n+ 1 sӕ ÿiӇm kiӇm soát Pi ta có:

110
Chѭѫng 8: Ánh sáng
n
P (u ) ¦N
i 0
i ,k (u ).Pi

Trong ÿó Ni,k(u) là hàm hӧp B-Spline bұc k-1 và sӵ khác biӋt giӳa B-spline và
Bezier sӁ ÿѭӧc thӇ hiӋn trên ÿó. Trong ÿѭӡng Bezier bұc cӫa ÿa thӭc ÿѭӧc xác ÿӏnh bӣi sӕ
ÿoҥn cong trên ÿѭӡng cong ÿó, còn vӟi B-spline bұc ÿѭӧc thoҧ mãn ÿӝc lұp vӟi sӕ ÿiӇm
kiӇm soát cӫa ÿѭӡng.
Hѫn nӳa hàm hӧp cӫa Bezier khác 0 trên toàn bӝ khoҧng cӫa tham sӕ u còn B-spline
chӍ khác 0 trên ÿoҥn ngҳn cӫa các tham sӕ. Mӛi ÿoҥn trên hàm hӧp chӍ tѭѫng ӭng vӟi mӝt
ÿiӇm thì chӍ dүn tӟi sӵ thay ÿәi cөc bӝ trong khoҧng mà trên ÿó tham sӕ cӫa hàm hӧp
khác 0.
BiӇu diӉn toán hӑc cӫa B-spline, vӟi hàm B-spline có bұc k-1 xác ÿӏnh thì:
(u  U i 1k ) (U i 1  u )
N i ,k (u ) N i 1,k 1 (u )  N i ,k 1 (u )
(U i  U i 1 k ) (U i 1  U i  2 k )

­1 u  [ui , ui 1 ]
N i ,1 (u ) ®
¯0 others
Trong ÿó ui là giá trӏ tҥi nút pi vӟi biӃn sӕ là u ÿѭӧc gӑi là các vector nút.
Tҩt cҧ các giá trӏ nút ÿӗng thӡi xác ÿӏnh trên vector nút và các nút nguyên thѭӡng sӱ
dөng dӉ dàng. Trong trѭӡng hӧp này các hàm hӧp bұc k sӁ khác 0 trong khoҧng k cӫa
vector nút và toàn bӝ các giá trӏ trên vector cho mӝt tұp hӧp ÿiӇm bҵng n+1+k.
Không nhѭ Bezier, ÿѭӡng B-spline không ÿi qua hai ÿiӇm ÿҫu và cuӕi trӯ khi hàm
hӧp ÿѭӧc dùng là tuyӃn tính.
Ĉѭӡng B-spline có thӇ ÿѭӧc tҥo qua hai ÿiӇm ÿҫu, cuӕi và tiӃp xúc vӟi vector ÿҫu và
cuӕi cӫa ÿa giác kiӇm soát. Bҵng cách thêm vào các nút tҥi vӏ trí cӫa các nút cuӕi cӫa
vector tuy nhiên các giá trӏ giӕng nhau không nhiӅu hѫn bұc cӫa ÿѭӡng cong.
Giӕng nhѭ ÿѭӡng cong Bezier, tính chҩt bao lӗi cӫa ÿa giác kiӇm soát và tính chҩt
chuҭn ÿѭӧc thӓa mãn. Vұy có:
n

¦N
i 0
i,k (u) 1

Trong ÿѭӡng cong B-spline, sӕ lѭӧng các nút, bұc cӫa ÿѭӡng cong và sӕ ÿiӇm ÿiӅu
khiӇn luôn có các quan hӋ ràng buӝc:
0dudn-k+2

111
Chѭѫng 8: Ánh sáng

Hình 7.7 Ĉѭӡng cong B-spline


Vұy viӋc xác ÿӏnh các vector nút sӁ phө thuӝc vào sӵ phân loҥi cӫa chính bҧn thân
chúng và ÿiӅu ÿó sӁ ҧnh hѭӣng ÿӃn hình dҥng cӫa ÿѭӡng cong ÿѭӧc mô tҧ. Phân loҥi sӁ
dӵa trên loҥi cӫa ÿѭӡng cong nhѭ sau:
ĈӅu tuҫn hoàn (periodic)
Không tuҫn hoàn (open or unperodic)
Không ÿӅu (non-uniform)
a. B Spline - ĈӅu và tuҫn hoàn
Vector nút là ÿӅu khi giá trӏ cӫa chúng cách ÿӅu nhau mӝt khoҧng ’ xác ÿӏnh.
Ví dө: [ 0 1 2 3 4 5 ] vӟi ’ xác ÿӏnh = 1
[ -2-1/2 1 5/2 4 ] vӟi ’ xác ÿӏnh = 3/2
[ -1-0.6 -0.2 0.2 0.6 1 ] vӟi ’ xác ÿӏnh = 0.4
Trong các bài toán thӵc tӃ, thông thѭӡng thì khoҧng xác ÿӏnh cӫa tham biӃn nҵm
trong khoҧng tӯ 0 ÿӃn 1 hay tӯ 00 ÿӃm 3600 thì viӋc chӑn giá trӏ cӫa các vector nút ÿѭӧc
chuҭn hoá trong khoҧng [0 1] hay [00 3600] ÿó.
[ 00.2 0.4 0.6 0.81 ] vӟi ’ xác ÿӏnh = 0.2
[ 00120024003600 ] vӟi ’ xác ÿӏnh = 1200
Bұc (k-1) Cҩp (k) Vector nút (m=n+k) Khoҧng tham sӕ (k-1)dtd(n+1)
1 2 [0 1 2 3 4 5 6 7] 1dtd6
2 3 [0 1 2 3 4 5 6 7 8] 2dtd6
3 4 [0 1 2 3 4 5 6 7 8 9] 3dtd6
Các vector nút gӑi là ÿӅu và tuҫn hoàn khi các hàm B-spline ÿӕi vӟi mӛi phân ÿoҥn
có thӇ chuyӇn ÿәi lүn nhau. Bҧng trên chӍ ra sӵ thay ÿәi cӫa miӅn tham sӕ và vector nút
khác nhau cӫa các ÿѭӡng cong B-spline khi bұc cӫa ÿѭӡng cong thay ÿәi. Sӕ lѭӧng cӫa

112
Chѭѫng 8: Ánh sáng
vector nút ÿѭӧc qui ÿӏnh bӣi biӇu thӭc m-n+k và sӕ lѭӧng các ÿiӇm kiӇm soát tính qua
biӇu thӭc (n+1) bҵng6.
Tính chҩt:
Ҧnh hѭӣng cӫa mӛi hàm cѫ sӣ ÿѭӧc giӟi hҥn trong k ÿoҥn là cҩp cӫa ÿѭӡng cong
cҫn thӇ hiӋn. Vұy chúng ta sӱ dөng ÿѭӡng cong bұc ba thì ҧnh hѭӣng cӫa hàm cѫ sӣ trҧi
dài trên bӕn ÿoҥn cӫa ÿѭӡng cong.
Ĉѭӡng B-spline tuҫn hoàn không ÿi qua các ÿiӇm ÿҫu và cuӕi cӫa ÿa giác kiӇm soát
ngoҥi trӯ vӟi ÿѭӡng bұc 1 (k=2) mà khi ÿó ÿѭӡng cong chuyӇn dҥng thành ÿѭӡng thҷng.
Ví dө vӅ các ÿѭӡng B-spline tuҫn hoàn có các bұc khác nhau có cùng các ÿiӇm và ÿa
giác kiӇm soát. Khi k=2 ÿѭӡng cong bұc mӝt trùng vӟi các cҥnh cӫa ÿa giác kiӇm soát.
Khi k=3, ÿѭӡng cong B-spline bұc 2, bҳt ÿҫu tҥi trung ÿiӇm cӫa cҥnh thӭ nhҩt và kӃt
thúc tҥi trung ÿiӇm cӫa cҥnh cuӕi cùng cӫa ÿa giác kiӇm soát.
b. Không tuҫn hoàn (Open –– Non Uniform)
Mӝt vector không tuҫn hoàn hoһc mӣ là vector nút có giá trӏ nút tҥi các ÿiӇm ÿҫu
cuӕi lһp lҥi vӟi sӕ lѭӧng các giá trӏ lһp lҥi này bҵng chính cҩp k cӫa ÿѭӡng cong và các
giá trӏ nút trong mӛi ÿiӇm lһp này là bҵng nhau
NӃu mӝt trong hai ÿiӅu kiӋn này hoһc cҧ hai ÿiӅu kiӋn không ÿѭӧc thoҧ mãn thì
vecto nút là không ÿӅu.
Ví dө, xét mӝt ÿa giác kiӇm soát vӟi bӕn ÿӍnh. Các ÿѭӡng cong B-spline cҩp 2,3,4
ÿѭӧc xây dӵng dӵa trên ÿa giác kiӇm soát có sӕ lѭӧng các nút m=n+k sӁ có vector nút
nhѭ sau:
Cҩp (k) sӕ lѭӧng nút (m = n + k) Vector nút không tuҫn hoàn
2 6 [0 0 1 2 3 3]
3 7 [0 0 0 1 2 2 2]
4 8 [0 0 0 0 1 1 1 1]
Các biӇu thӭc phҧi ÿѭӧc thoҧ mãn ÿӕi vӟi nút ui trên vector nút không tuҫn hoàn bҳt
ÿҫu tҥi u0.
Danh sách các vector nút không tuҫn hoàn ÿã ÿѭa ra ӣ mөc này ÿӅu thoҧ mãn các biӇu
thӭc sau:
ui = 0 1=<i<=k
ui = i-k k+1<i<=n+1
ui = n-k+2 n+1<i<=n+k+1
Các vector nút không tuҫn hoàn cung cҩp các hàm cѫ sӣ ÿѭӧc ÿӏnh nghƭa trong mӝt
miӅn tham sӕ phӭc tҥp và không có sӵ mҩt mát nhѭ vӟi loҥi vector tuҫn hoàn và vì vұy
ÿѭӡng cong B-spline loҥi này luôn ÿi qua các ÿiӇm ÿҫu và cuӕi cӫa ÿa giác kiӇm soát.

113
Chѭѫng 8: Ánh sáng
Ví dө: hàm hӧp bұc ba tính xҩp xӍ cho 8 khoҧng sӁ xác ÿӏnh trên vector nút là
00001234555. Ӣ ÿây chúng ta còn thҩy sӵ thay ÿәi cөc bӝ trên ÿѭӡng cong khi ta thay ÿәi
vӏ trí mӛi ÿiӇm.
Ĉѭӡng cong Bezier là trѭӡng hӧp ÿһc biӋt cӫa B-spline không tuҫn hoàn, trong ÿó
sӕ lѭӧng các ÿӍnh sӱ dөng bҵng vӟi cҩp cӫa ÿѭӡng cong. Vector nút trong trѭӡng hӧp này
là:
[ 0 0 ..... 0 1 1 ...... 1 1 ]
kk
Ĉѭӡng cong B-spline bұc ba vӟi bӕn ÿiӇm kiӇm soát và vector không tuҫn hoàn [0 0
0 0 1 1 1 1] cNJng chính là ÿѭӡng cong Bezier.
c. Không ÿӅu
Trong vector nút không tuҫn hoàn, giá trӏ các nút xuҩt hiӋn tҥi các biên ÿѭӧc lһp lҥi
và các nút bên trong các bѭӟc nút bҵng nhau. NӃu mӝt trong hai ÿiӅu kiӋn này hoһc cҧ hai
ÿiӅu kiӋn này không ÿѭӧc thoҧ mãn thì vector nút là không ÿӅu.
Ví dө các nút không ÿӅu có thӇ tҥo ra bҵng cách ÿһt các giá trӏ lһp lҥi ÿӕi vӟi các nút
ӣ khoҧng giӳa [0 1 2 3 3 4 5]
Hay tҥo ra bѭӟc nhҧy không bҵng nhau giӳa các nút [0.0 0.2 0.5 0.75 1.0]
Các vector nút loҥi ÿӅu cho phép ngѭӡi sӱ dөng dӉ hình dung và xӱ lý trong các
phép toán nhѭng trong mӝt sӕ các trѭӡng hӧp bѭӟc nút không ÿӅu lҥi có nhӳng ѭu ÿiӇm
ÿһc biӋt. Ví dө nhѭ trong viӋc ÿiӅu khiӇn hình dҥng cӫa ÿѭӡng cong trong tiӃn trình thiӃt
kӃ khi các sai lӋch không mong muӕn có thӇ xuҩt hiӋn mà viӋc sӱ dөng ÿѭӡng cong B-
spline ÿӅu vӟi các dӳ liӋu ÿiӇm có các khoҧng cách tѭѫng ÿӕi lӟn mà không ÿӅu nhau.
KӃt luұn
o B-spline là mӝt dòng cӫa Bezier
o Thӵc tӃ khi ta chӑn bұc k cho tұp hӧp k ÿiӇm thì thi B-spline chuyӇn thành
Bezier
o Khi bұc cӫa ÿa thӭc giҧm sӵ ҧnh hѭӣng cөc bӝ cӫa mӛi ÿiӇm nút càng rõ
ràng hѫn.
o Khi tӗn tҥi ҧnh hѭӣng cөc bӝ càng lӟn và ÿѭӡng cong phҧi ÿi qua ÿiӇm ÿó.
o Chúng ta có thӇ thay ÿәi hình dҥng ÿѭӡng cong B-spline bҵng cách:
o Thay ÿәi kiӇu vector nút: ÿӅu tuҫn hoàn, mӣ, không ÿӅu
o Thay ÿәi cҩp k cӫa ÿѭӡng cong
o Thay ÿәi sӕ ÿӍnh và vӏ trí các ÿӍnh ÿa giác kiӇm soát
o Sӱ dөng các ÿiӇm kiӇm soát trùng nhau
7.2. MÔ HÌNH Bӄ MҺT (Surface) VÀ CÁC PHѬѪNG PHÁP XÂY DӴNG
7.2.1. Các khái niӋm cѫ bҧn
Mһt cong (surface): là quӻ ÿҥo chuyӇn ÿӝng cӫa mӝt ÿѭӡng cong tҥo nên. BiӇu diӉn tham
biӃn cho mһt cong:
114
Chѭѫng 8: Ánh sáng
9 Dӵa vào viӋc xây dӵng và tҥo bӅ mһt toán hӑc trên nhӳng ÿiӇm dӳ liӋu
9 Dӵa trên viӋc xây dӵng nên bӅ mһt phө thuӝc vào biӃn sӕ có khҧ năng thay ÿәi
mӝt cách trӵc diӋn thông qua các tѭѫng tác ÿӗ hoҥ.
Ta có:
x=x(u,v,w) u,v,w  [0, 1]
y=y(u,v,w) u+v+w=1
z=z(u,v,w)
Q(u,v,w) = Q[ x=x(u,v,w) y=y(u,v,w) z=z(u,v,w) ]
BiӇu diӉn theo mҧnh
9 BiӇu diӉn miӃng tӭ giác - quadrilatera Patches
9 BiӇu diӉn miӃng tam giác - Triangular Patches
7.2.2. BiӇu diӉn mҧnh tӭ giác
Phѭѫng trình:
x=x(u,v)
y=y(u,v) u,v  [ 0, 1]
z=z(u,v)
Q(u,v) = Q[ x=x(u,v) y=y(u,v) z=z(u,v) ]
Thành phҫn
u,v là các tham biӃn
Các ÿiӇm Q(0,0) Q(0,1), Q(1,0), Q(1,1) là cұn cӫa mҧnh,các ÿѭӡng cong Q(1,v),
Q(0,v), Q(u,0), Q(u,1) là các biên cӫa mҧnh. Ĉҥo hàm riêng tҥi ÿiӇm Q(u,v) xác ÿӏnh
vector tiӃp tuyӃn theo hѭӟng u, v.

Hình 7.8 BiӇu diӉn mҧnh tӭ giác


wQ(u , v) / wu Q>wx(u , v) / wu , wy (u , v) / wu , wz (u , v) / wu @
wQ(u , v) / wv Q>wx(u , v) / wv, wy (u , v) / wv, wz (u , v) / wv @
7.2.2.1. K͇t n͙i m̫nh tͱ giác

115
Chѭѫng 8: Ánh sáng

Hình 7.9 KӃt nӕi mҧnh tӭ giác


Thӵc thӇ hình hӑc biӇu diӉn thông qua các mҧnh cùng dҥng, các mҧnh có thӇ nӕi vӟi
nhau theo các hѭӟng u,v khi hai mҧnh cùng hѭӟng ÿó. NӃu mӑi ÿiӇm trên biên cӫa hai
mҧnh bҵng nhau, hay hai biên bҵng nhau. Hai mҧnh liên tөc bұc C0. NӃu hai biên bҵng
nhau và ÿҥo hàm bҵng nhau trên cùng mӝt hѭӟng thì hai mҧnh gӑi là kӃt nӕi bұc C1.
7.2.2.2. H͏ t͕a ÿ͡ Barycentric Coordinates
Tұp các ÿiӇm P1,P2 ... Pn , tұp các tә hӧp cӫa các ÿiӇm ÿó
k1P1 + k2P2 + k3P3 ... + knPn
Vӟi k1 + k2 + k3 + ... + kn =1
Các ÿiӇm tҥo thành không gian affine vӟi các giá trӏ tӑa ÿӝ nates
k1,k2,k3,..knÿѭӧc gӑi là hӋ toҥ ÿӝ barycentric.
7.2.2.3. Tam giác –– Triangular

Hình 7.10 Mҧnh tam giác


Trong tam giác các ÿiӇm có dҥng P1, P2, P3
HӋ sӕ: k1, k2, k3  [ 0, 1]
k1 + k 2 + k 3 = 1
P = k1P1 + k2P2+ k3P3
NӃu HӋ sӕ ki > 1 hoһc <0 ÿiӇm P sӁ nҵm ngoài tam giác (Q)
NӃu HӋ sӕ ki = 1 hoһc =0 ÿiӇm P sӁ nҵm trên cҥnh tam giác (R)
116
Chѭѫng 8: Ánh sáng
7.2.3. Mô hình hoá các mһt cong (Surface Patches)
7.2.3.1. M̿t k̓ (Ruled Surface)
BӅ mһt ÿѭӧc xây dӵng bҵng cách cho trѭӧt mӝt ÿoҥn thҷng trên hai ÿѭӡng cong. Các mһt
kҿ nhұn ÿѭӧc bҵng phép nӝi suy tuyӃn tính tӯ hai ÿѭӡng cong biên cho trѭӟc tѭѫng ӭng
vӟi hai biên ÿӕi diӋn cӫa mһt kҿ P1(u) và P2(u).
Ruled Surface

2.

1.

1 Duong cong
0.
0. Duong cong
0.
0.
0. 0.
0.
1 1 0.

Hình 7.11 Mô hình bӅ mһt kҿ


Phѭѫng trình mһt kҿ:
Q(u,v) = P2(u)v + P1(u)(1-v)
NӃu hai ÿѭӡng cong cho trѭӟc tѭѫng ӭng là P1(v) và P2(v)
Thì mһt kҿ có phѭѫng trình:

>(1  u )@ª«
P1 (v) º
Q(u , v) P1 (v)(1  u )  P2 (v)u »
¬ P2 (v)¼
7.2.3.2. M̿t tròn xoay (Revolution surface)

Hình 7.12 Mô hình mһt tròn xoay

117
Chѭѫng 8: Ánh sáng
Mһt ÿѭӧc xây dӵng bӣi ÿѭӡng thҷng hay mӝt ÿѭӡng cong phҷng, quanh mӝt trөc
trong không gian.
Giҧ sӱ ÿѭӡng cong phҷng có dҥng:
P(t)=[x(t) y(t) z(t)] 0”t”tmax
Ví dө: quay quanh trөc x mӝt thӵc thӇ nҵm trên mһt phҷng xoy, phѭѫng trình bӅ mһt

Q(t, f ) = [ x(t) y(t) cosfz(t) sinf ]
0 d I d 2S
Ví dө: Mһt tròn xoay
P1[1 1 0] và P2[6 2 0] nҵm trong mһt phҷng xoy. Quay ÿѭӡng thҷng quanh trөc ox
sӁ ÿѭӧc mӝt mһt nón. Xác ÿӏnh ÿiӇm cӫa mһt tҥi t=0.5, f =p/3.
Phѭѫng trình tham sӕ cho ÿoҥn thҷng tӯ P1 tӟi P2 là:
P(t) = [ x(t) y(t) z(t) ] = P1 + (P1 - P2)t 0 dtd 1
Vӟi các thành phҫn ĈӅ-các:
x(t) = x1 + (x2- x1)t = 1+5t
y(t) = y1 + (y2- y1)t = 1+t
z(t) = z1 + (z2- z1)t = 0
Dùng phѭѫng trình:
Q(1/2, p/3) = [ 1+5t(1+t)cosf (1+t)sinf ]
ª7 3 S 3 Sº
«¬ 2 cos sin »
2 3 2 3¼
ª7 3 3 3º
« »
¬2 4 4 ¼

7.2. 3.3. M̿t tr˱ͫt (Sweept Surface

Hình 7.13 Mô hình mһt trѭӧt


Sweep surface là mһt ÿѭӧc tҥo bӣi bҵng cách trѭӧt mӝt thӵc thӇ.
Ví dө: mӝt ÿѭӡng thҷng, ÿa giác, mӝt ÿѭӡng cong, mӝt hình…… dӑc theo mӝt ÿѭӡng
trong không gian.
118
Chѭѫng 8: Ánh sáng
Q(u,v) = P(u)*[ T(v) ]
P(u) thӵc thӇ cҫn trѭӧt
[ T(v) ] là ma trұn biӃn ÿәi ([ T(v) ] có thӇ là ma trұn tӏnh tiӃn, quay, hay tӍ lӋ ……hoһc
là kӃt hӧp cӫa nhiӅu phép biӃn ÿәi ÿó).
Ví dө:
P1[000], P2[03 0]
P(t) = P1 + (P2 –– P1) *u = [0 3u01]
0 du,vd 1
ª 1 0 0 0º
«
« 0 cos( 2 3 v ) sin( 2 3v ) 0»
T (v ) »
« 0  sin(23v ) cos(23v ) 0»
« »
¬10v 0 0 1¼
Ví dө vӅ mһt trѭӧt (Sweept Extrusion)

1 1

0.5 0.5

0 0

-0.5
-0.5

-1
-1 1
1
0 10
10 8
0 8 -1 6
6 -2 4
-1 4 2
2 -3 0
-2 0

Hình 7.14 Hình thành mһt trѭӧt


Hình vuông xác ÿӏnh bӣi 4 ÿӍnh:
P1[0 -10], P2[0-1-1]
P3[01 -1], P4[01 1]
Ĉѭӡng cong trѭӧt:

ª0  1 1 1º
ª P1 º «0  1  1 ª 1 0 0 0º
« » 1» «
P2
P (u ) « »
« »
« 0 1 0 0»
«0 1  1 1» T (v ) »
« P3» « » « 0 0 1 0»
« » «0 1 1 1»
« »
¬ P 4¼ «¬0  1 1 1»¼ ¬10v cos( 3v )  1 0 1¼
x= 10vy= cos(Pv) –– 1
Quay 1 góc khi trѭӧt:

119
Chѭѫng 8: Ánh sáng

ª cos(M ) sin(M ) 0 0º
«
« sin(M ) cos(M ) 0 0»
»
« 0 0 1 0»
« »
¬ 10 v cos( 3 v)  1 0 1¼
7.2.3.4. M̿t n͡i suy trên b͙n ÿ˱ͥng biên(Boolean sum surface
Mһt ÿѭӧc xây dӵng trên 4 ÿiӇm và các ÿѭӡng cong biên, S(u,v) mһt nӝi suy trên 4 ÿѭӡng
biên.

Hình 7.15 Mô hình mһt cong Boolean Sum


S(u, v) = S1(u, v) + S2(u, v) - P(u,v)
Vӟi:
P(u,v) = (1-u)(1-v)P00 + (1-u)vP01 + u(1-v)P10 + uvP11
S1(u,v) = va0(u) + (1-v)a2(u)
S2(u,v) = ua1(v) + (1-u)a3(v);
P là các ÿӍnh cӫa mҧnh 4
ai(u) là các phѭѫng trình ÿѭӡng biên
Ví dө vӅ mһt Boolean Sum:
Vͣi u = 0
S(0,v) = S1(0,v) + S2(0,v) - P(0, v)
= v a0(0) + (1 - v)a2(0) + 0a1(v)+ 1 a3(v) - (1 - v)P00 - v P01
= v P01 + (1 - v)P00 + a3(v) -(1 - v)P00 - v P01
= a3(v)
7.2.4. Mһt tӯ các ÿѭӡng cong
7.2.4.1. M̿t cong b̵c ba Hermite
Mһt cong tham biӃn ÿѭӧc tҥo bӣi bӅ mһt qua tҥi 4 ÿiӇm dӳ liӋu tҥi 4 góc và các ÿѭӡng
cong có phѭѫng trình bұc ba qua chúng, nhѭ vұy 16 vector ÿiӅu kiӋn hay tѭѫng ÿѭѫng vӟi
48 giá trӏ ÿҥi sӕ cҫn thiӃt ÿӇ xác ÿӏnh các hӋ sӕ phѭѫng trình.
Khi nhӳng hӋ sӕ là 4 ÿiӇm dӳ liӋu góc và 8 vector tiӃp tuyӃn tҥi các ÿiӇm ÿó theo
các hѭӟng u,v tѭѫng ӭng cùng 4 vector xoҳn thì mһt cong tҥo thành là mһt cong Hermite.
Phѭѫng trình có dҥng:

120
Chѭѫng 8: Ánh sáng

3 3
Q u , v ¦¦ C u v ij
i j
0 d u, v d 1
i 0 j 0

Q(u, v) = [U ][C ][V]T 0 d u, v d1
Vӟi: u = [ u3u2u1] ,v = [v3 v2 v 1]
Và ma trұn hӋ sӕ [C] là:
ªC 00 C 01 C 02 C 03 º
«C C11 C12 C13 »»
>C @ « 10
«C 20 C 21 C 22 C 23 »
« »
¬C 30 C 31 C32 C 33 ¼

Cuӕi cùng ta thu ÿѭӧc các hӋ sӕ theo phѭѫng trình mӟi có dҥng:
Q(u, v) = [U][MH] [B] [MH]T [V]T u,v  [0,1]

ª 2 2 1 1º
« 3 3  2  1»
>M H @ « »
« 0 0 1 0»
« »
¬ 1 0 0 0¼

Và B là ma trұn ÿiӅu kiӋn biên:
ª P00 P01 Pv 00 Pv 01 º
« »
>B@ « P10 P11 Pv10 Pv11 »
« Pu 00 Pu 01 Puv 00 Puv 01 »
« »
¬ Pu10 Pu11 Puv10 Puv11 ¼

Hay vӟi dҥng thӭc rút gӑn cӫa ma trұn [B] theo các ma trұn ÿiӅu kiӋn biên tѭѫng
ӭng:
[B] ma trұn các giá tӏ tham sӕ
[Pu], [Pv] các vector tiӃp tuyӃn theo u,v tѭѫng ӭng.
[Puv] ma trұn xoҳn trên u,v
ª >P @ >Pv @ º
>B@ « »
¬ >Pu @ >Puv @¼

121
Chѭѫng 8: Ánh sáng

Hình 7.16 Mһt cong Hermite và các ÿiӇm dӳ liӋu


Các vector tiӃp tuyӃn và vector xoҳn cӫa bӅ mһt cong ÿѭӧc biӇu diӉn qua phѭѫng
trình sau:
Qu(u,v) = [U] [MH]u [B] [MH]T [V]T
Qv(u,v) = [U] [MH]v [B] [MH]T [V]T
Quv(u,v) = [U] [MH]uv [B] [MH]T [V]T
Vӟi:
ª0 0 0 0º
« 6 6 3 3 »»
>M H @U & >M H @V «
« 6 6  4  2»
« »
¬0 0 1 0¼
7.2.4.2. M̿t cong Bezier
Mҧnh-patch Bézier

Hình 7.17 Mһt cong Bezier


Mҧnh Bezier ÿѭӧc hình thành trên phép trѭӧt cӫa ÿѭӡng cong Bezier.ViӋc xây dӵng
nên mҧnh Bezier dѭӟi các ÿiӇm kiӇm soát, tҥo nên ÿa diӋn kiӇm soát.
^Pi, j : 0 d i d n,0 d j d m`

Phѭѫng trình tәng quát cӫa mһt cong tham biӃn Bezier có dҥng:
122
Chѭѫng 8: Ánh sáng
m n
P (u , v) ¦¦ P
j 0 i 0
i, j Bi ,n (u ).B j ,m (v) trong ÿó u,v  [0, 1]

Mҧnh Bezier bұc ba:


Mһt cong Bezier bұc ba là mһt phә biӃn nhҩt trong CG, vì ÿi ÿӝ ÿѫn giҧn cӫa nó. Nó
hình thành trên 4x4 ÿiӇm kiӇm soát, công thӭc có dҥng:
3 3
Q u, v ¦¦ B u B v Pn ,i m, j ij
i 0 j 0

Ĉa thӭc Bernstein có dҥng:


B0(t) = (1-t)3
B1(t) = 3t (1-t)2
B2(t) = 3t2 (1-t)
B3(t) = t3
Tính chҩt cӫa mҧnh Bézier
ƒ Tính bao lӗi: Mһt cong Bezier luôn nҵm trong ÿa diӋn lӗi cӫa các ÿiӇm kiӇm soát
ƒ Mһt cong ÿi qua 4 ÿiӇm cұn P00, P01,P10,P11 hay chính xác
Q(0,0)=P00, Q(0,1)=P01, Q(1,0)=P10, Q(1,1)=P11
ƒ Ĉѭӡng cong biên cӫa Mһt Bezier là ÿѭӡng cong Bezier
ƒ Mһt cong là liên tөc và ÿҥo hàm riêng các bұc tӗn tҥi cӫa nó cNJng liên tөc.
ƒ Ĉҥo hàm riêng cӫa mһt cong có dҥng:

Q u , v >U @ >N @ >B @ >M @T >V @T


wQ(0,0) / wu 3( P01  P00 )
wQ(0,0) / wv 3( P01  P00 )
wQ(0,1) / wu 3( P03  P02 )
wQ(1,0) / wv 3( P13  P03 )
Q(u,v) là mӑi ÿiӇm nҵm trên mһt cong và

>V @ >v
3
v2 v 1 @
>U @ >u 3
u2 u 1@
ª 1 3  3 1º
« 3 6 3 0»»
[N] và [M] ÿѭӧc biӇu diӉn = «
« 3 3 0 0»
« »
¬1 0 0 0¼
Nӕi 2 miӃng Bezier Bұc 3(Bi-cubic)

123
Chѭѫng 8: Ánh sáng
ª 1 3  3 1º ª B00 B01 B02 B03 º ª1  3 3  1º ªv 3 º
« »
« 3 6 3 0»» «« B10 B13 »» «0 3  6 3 » «v 2 »
Q u , v >u 3
u2 u 1« @
« 3 3 0 0» « B20
B11
B21
B12
B22
«
B23 » «0 0
»
3  3» « v »
« »« »« »« »
¬1 0 0 0¼ ¬ B30 B31 B32 B33 ¼ ¬0 0 0 1 ¼ «¬ 1 »¼

Hình 7.18 Nӕi hai mҧnh Bezier bұc ba


Hai mҧnh Q và R cùng chung tham biӃn tҥi biên (Giҧ sӱ u), hai ÿѭӡng cong biên
phҧi bҵng nhau Q(1,v)=R(0,v). HӋ sӕ cӫa cӝt cuӕi ma trұn Q = cӝt ÿҫu ma trұn R, tѭѫng
tӵ: nӃu theo hѭӟng cӫa v thì hàng sӁ thay cӝt ma trұn.
Bұc cӫa mһt cong theo mӛi hѭӟng cӫa tham biӃn bҵng sӕ ÿiӇm kiӇm soát trӯ 1.Tính
liên tөc hay ÿҥo hàm cӫa mһt theo mӛi tham biӃn bҵng sӕ ÿiӇm kiӇm soát trӯ 2. Hình dҥng
cӫa mһt biӃn ÿәi theo các cҥnh cӫa ÿa giác kiӇm soát. Mһt lѭӟi chӍ ÿi qua các ÿiӇm góc
cҥnh cӫa ÿa giác kiӇm soát, nó chӍ nҵm trong phҫn giӟi hҥn bӣi lѭӟi cӫa ÿa giác lӗi kiӇm
soát và không thay ÿәi dѭӟi tác ÿӝng cӫa các phép biӃn ÿәi affine. Mӛi ÿѭӡng biên cӫa
mһt Bezier là mӝt ÿѭӡng cong Bezier vӟi mһt cong bұc ba Bezier các ÿѭӡng cong biên
luôn ÿҧm bҧo là các ÿѭӡng Bezier bұc 3. Nhѭ vұy lѭӟi ÿa giác cho bӅ mһt sӁ là 4 x 4.
7.2.4.3. M̿t cong B-Spline
Phѭѫng trình mһt B-spline:
n m
Q ( u , w) ¦¦ N
i 1 j 1
i ,k (u ). M j ,h ( w).Pi , j

Pij là ÿiӇm kiӇm soát

­1 xi d u  xi 1 (u  xi ) N i ,k 1 (u ) ( xi  k  u ).N i 1,k 1 (u )
N i ,k (u ) ® Ni, k (u ) 
¯ 0 otherwise xi  k 1  x i xi  k  xi 1
­ xi 0 1 d i d k
°
® xi i  k (k  1 d i d n)
° x n  k  1(n  1 d i d n  k )
¯ i

124
Chѭѫng 8: Ánh sáng

N và M là ÿa thӭc B-spline
Vӟi các mһt cong mӣ mһt cong phө thuӝc vào các nút vector
Ĉһc ÿiӇm cӫa mһt cong B-Spline
ƒ Sӕ bұc caonhҩt cӫa bӅ mһt theo mӛi hѭӟng thì bҵng sӕ ÿiӇm kiӇm soát -1 theo hѭӟng ÿó.
ƒ Ĉҥo hàm riêng cӫa phѭѫng trình bӅ mһt theo mӛi tham biӃn có bұc bҵng sӕ ÿiӇm kiӇm
soát theo tham biӃn ÿó trӯ 2.
ƒ BӅ mһt B-spline thì không chӏu ҧnh hѭӣng cӫa phép biӃn ÿәi anfine. BӅ mһt sӁ thay ÿәi
nӃu ta thay ÿәi ÿa giác kiӇm soát.
ƒ Ҧnh hѭӣng cӫa mӝt ÿiӇm kiӇm soát ÿѫn ÿѭӧc giӟi hҥn bӣi + - k/2 h/2 khoҧng ÿӕi vӟi mӛi
tham sӕ.
ƒ NӃu sӕ ÿӍnh cӫa ÿa giác kiӇm soát bҵng sӕ bұc theo mӛi tham biӃn và không có ÿiӇm kép
nào thì mһt B-spline sӁ chuyӇn thành mһt Bezier.
ƒ NӃu các ÿa giác kiӇm soát có dҥng tam giác thì lѭӟi ÿa giác kiӇm soát sӁ có hình dáng gҫn
giӕng vӟi bӅ mһt cong.
ƒ Mӛi mһt B-Spline luôn nҵm trong bao lӗi cӫa ÿa giác kiӇm soát .
ƒ Mӛi mһt B-Spline có dáng ÿiӋu luôn bám theo hình dáng cӫa ÿa giác kiӇm soát.

Tóm tҳt:
ViӋc tҥo ra các ÿѭӡng cong theo ý muӕn cNJng là vҩn ÿӅ thѭӡng gһp khi làm viӋc vӟi ÿӗ
hoҥ máy tính. Chúng ta khҧo sát cách tiӃp cұn vӁ ÿѭӡng cong bҵng Hermite, Bezier và B-
spline. Các cách tiӃp cұn này dӵa trên cѫ sӣ vӁ ÿѭӡng cong bҵng mӝt tұp ÿiӇm mô tҧ hình
dáng cӫa ÿѭӡng cong gӑi là tұp ÿiӇm kiӇm soát. Khi thay ÿәi tұp ÿiӇm này, hình dáng cӫa
ÿѭӡng cong sӁ thay ÿәi theo. Cách tiӃp cұn này cho thҩy sӵ thuұn lӧi và linh hoҥt khi cҫn
phҧi vӁ các ÿѭӡng cong phӭc tҥp và do ÿó nó ÿѭӧc dùng nhiӅu trong thiӃt kӃ.
Mӝt nhѭӧc ÿiӇm trong cách vӁ ÿѭӡng cong bҵng Bezier là khi mӝt phҫn cӫa ÿѭӡng
cong ÿã ÿҥt yêu cҫu, nhѭng khi hiӋu chӍnh phҫn còn lҥi sӁ mҩt ÿi phҫn ÿã ÿҥt yêu cҫu, hay
viӋc nӕi trѫn các ÿѭӡng cong sҹn có. ĈӇ khҳc phөc các vҩn ÿӅ này ta có cách tiӃp cұn cҧi
tiӃn vӁ ÿѭӡng cong bҵng B-spline.
Tѭѫng tӵ nhѭ vұy viӋc biӇu diӉn các mһt cong trong ÿӗ hoҥ máy tính cNJng là mӝt
vҩn ÿӅ cҫn thiӃt ÿӇ mô tҧ ÿӕi tѭӧng trong thӃ giӟi thӵc. Chúng ta khҧo sát vӅ các phѭѫng
pháp biӇu diӉn mһt cong thông qua phѭѫng trình tham sӕ. Trong ÿó, phѭѫng trình tham sӕ
cӫa mӝt mһt có dҥng là mӝt phѭѫng trình tham sӕ hai biӃn p(u,v) và mӝt ÿiӇm bҩt kǤ trên
mһt sӁ ÿѭӧc biӇu diӉn dѭӟi dҥng p(u,v)= (x(u,v), y(u,v), z(u,v)). Chúng ta khҧo sát mӝt sӕ
mһt ÿѫn giҧn nhѭ: mһt kҿ, mһt tròn xoay, mһt trѭӧt và mһt Boolean Sum.
Trên cѫ sӣ các ÿѭӡng cong bҵng Hermite, Bezier và B-spline chúng ta cNJng xây
dӵng ÿѭӧc các mһt Hermite, Bezier và B-spline.
Bài tұp:
1. Cho 4 ÿiӇm P0(1,3,6), P1(6,0,3), P2(-1,3,-2) và P3(5,4,1) dùng 4 ÿiӇm trên làm
ÿiӇm kiӇm soát ÿѭa ra phѭѫng trình cӫa ÿѭӡng cong Bezier.

125
Chѭѫng 8: Ánh sáng
2. Cho hai ÿiӇm P1[-2 4 5] và P2[0 1 -6] nҵm trong mһt phҷng xoy. Quay ÿѭӡng
thҷng quanh trөc ox sӁ ÿѭӧc mӝt mһt nón. Xác ÿӏnh ÿiӇm cӫa mһt tҥi t=0.8,
I=S/4.
3. Cài ÿһt thuұt toán vӁ ÿѭӡng cong bҵng Bezier cho phép ngѭӡi dùng ÿӏnh nghƭa tұp
ÿiӇm kiӇm soát mô tҧ hình dҥng ÿѭӡng cong và cho phép ngѭӡi dùng hiӋu chӍnh
mӝt sӕ ÿiӇm kiӇm soát mô tҧ hình dҥng ÿѭӡng cong và cho phép ngѭӡi dùng hiӋu
chӍnh mӝt sӕ ÿiӇm kiӇm soát ÿӇ hiӋu chӍnh ÿѭӡng cong theo ý muӕn.
4. ViӃt phѭѫng trình vӁ ÿѭӡng Spline.

126
Chѭѫng 8: Ánh sáng

CHѬѪNG 8: ÁNH SÁNG

8.1. GIӞI THIӊU


8.1.1. Mөc tiêu chính trong ÿӗ hӑa máy tính
Có hai mөc tiêu chính trong ÿӗ hӑa máy tính mà các nhà ÿӗ hoҥ luôn muӕn chinh phөc ÿó
là thӡi gian thӵc và tính trӵc quan.
Thӡi gian thӵc:
Thӡi gian thӵc qui ÿӏnh mӭc ҧnh hѭӣng thѭӡng xuyên ÿӃn viӋc hình ҧnh có nҵm
trong mӭc dung sai cho phép hay không. Tҩt nhiên, mӭc ÿӝ ҧnh hѭӣng cӫa thӡi gian ӣ
mӛi mӝt ӭng dөng là khác nhau, nhѭ: thӡi gian ÿӕi vӟi mӝt ngѭӡi làm công tác kiӇm ÿӏnh
mã code ÿѭӧc biӇu diӉn bҵng thӡi gian vào khoҧng mӝt vài phút; trong khi ÿó, trong môi
trѭӡng ÿӗ hoҥ 3D thì lҥi qui ÿӏnh thӡi gian thӵc cұp nhұt trong khi lұp thiӃt kӃ.
Tính trӵc quan:
Kӻ thuұt viên thiӃt kӃ ÿӗ hoҥ 3D luôn phҧi làm viӋc vӟi mӝt loҥt ÿѭӡng biên ÿӇ hiӇn
thӏ phӕi cҧnh mà anh ta ÿang tҥo dӵng. Cө thӇ hѫn, lҩy ví dө: nhà ÿӗ hoҥ làm viӋc trong
mӝt công ty sҧn xuҩt phim, anh ta phҧi ÿѭa ra bҧn biӇu diӉn phӕi cҧnh xác thӵc nhҩt cho
hoҥt cҧnh mà anh ta thiӃt kӃ.
Trong mӝt thӡi gian dài hai mөc tiêu này luôn là cái ÿích mà chúng ta muӕn ÿҥt tӟi.
Tuy nhiên, cùng sӵ phát triӇn cӫa phҫn cӭng và các công nghӋ khoa hӑc, các sҧn phҭm ÿӗ
hoҥ ÿã dҫn ÿҥt tӟi ngѭӥng cӫa thӡi gian thӵc. NӃu nói theo lƭnh vӵc cӫa công nghӋ phҫn
cӭng, trong vòng sáu tháng phҫn cӭng cӫa ÿӗ hoҥ ÿã phát triӇn vӟi tӕc ÿӝ gҩp ÿôi. Các
hình mô tҧ dѭӟi ÿây ÿѭӧc minh hoҥ tӯ trò chѫi Doom3.

Hình 8.1 hình minh hoҥ tӯ trò chѫi Doom3


Vҩn ÿӅ chӫ yӃu ӣ ÿây là viӋc tұp trung tұn dөng ÿѭӧc ánh sáng cөc bӝ và tҥo bóng.
Ngoài ra viӋc khuӃch tán bóng cӫa hình ҧnh ÿѭӧc minh hoҥ nhѭ khung hình cornell phía
dѭӟi ÿây, là ÿiӅu không thӇ thӵc hiӋn ÿѭӧc vӟi hӋ thӕng phҫn cӭng ÿѫn lҿ hiӋn có.
8.1.2. Các giҧi pháp trong ÿӗ hӑa máy tính
Nhӳng ÿiӅu mà chúng ta muӕn thӵc hiӋn lҥi không nhѭ trong thӵc tӃ phát tán ánh sáng
ÿѭӧc gây bӣi sӵ tѭѫng tác cӫa các bӅ mһt, bóng cӫa ánh sáng ÿѭӧc gây nên bӣi nhiӅu
nguӗn sáng, rӗi viӋc hiӋu chӍnh sӵ phҧn chiӃu ánh sáng... Thuұt toán chiӃu sáng toàn cөc
(the Global illumination Algorithm) ÿã thoҧ mãn ÿѭӧc các ÿiӅu kiӋn ÿem lҥi nhӳng bӭc

127
Chѭѫng 8: Ánh sáng
ҧnh có ÿӝ trung thӵc cao. Chѭѫng này ÿi sâu vào nghiên cӭu chi tiӃt ba giҧi pháp cӫa
thuұt toán chiӃu sáng toàn cөc:
ƒ Raytracing
ƒ Radiosity
ƒ Photon mapping
8.1.2.1. Raytracing - d͹ng ÿ͛ th͓ tia
VӅ cѫ bҧn cӫa Raytracing hoҥt ÿӝng dӵa trên phѭѫng pháp dӵng các tia ÿӗ thӏ qua các
ÿiӇm ҧnh trong vùng thҩp cӫa màn hình và khung nhìn ÿѭӧc tác ÿӝng ÿӃn. Giá trӏ ánh
sáng cӫa mӛi ÿiӇm ҧnh phө thuӝc vào vectѫ pháp tuyӃn chuҭn hoá và vӏ trí ÿiӇm giao
nhau cӫa mӛi ÿӕi tѭӧng cNJng nhѭ vӏ trí cӫa ánh sáng.
Cѫ bҧn phѭѫng pháp Raytracing không hoàn toàn là phѭѫng pháp chiӃu sáng toàn
cөc bӣi phѭѫng thӭc cӫa ánh sáng chӍ là cөc bӝ. Nó hoҥt ÿӝng dӵa trên viӋc ÿѭa nhiӅu
nguӗn sáng vào viӋc tҥo bóng, kӃt hӧp vӟi ÿa dҥng ánh sáng phҧn chiӃu, ÿӝ khúc xҥ,…… tӯ
ÿó có thӇ cho ta nhӳng bӭc ҧnh vô cùng sҳc nét mà có thӇ ÿánh lӯa thӏ giác cӫa nhӳng
ngѭӡi xem dӉ tính. Mӝt dҩu hiӋu dӉ nhұn biӃt phѭѫng pháp raytracing ÿó là hҫu hӃt các
bӭc ҧnh ÿӅu trông rҩt thұt, nhѭ : bóng ÿә cӭng và khung cҧnh ÿѭӧc hӧp thành bӣi nhiӅu
yӃu tӕ lung linh. Do vұy phѭѫng pháp Ratracing có thӇ mӣ rӝng thành phѭѫng pháp chiӃu
sáng toàn cөc ÿҫy ÿӫ, nhѭ path tracing - lҫn theo dҩu vӃt ÿѭӡng dүn.

Hình 8.2 Raytraced Cornell box


8.1.2.2. Radiosity
Radiosity vӅ phѭѫng pháp thì ngѭӧc vӟi raytracing, vì nó chӍ giҧi quyӃt các phҫn vӅ
khuӃch tán trong thuұt bӕ trí ánh sáng.
Thuұt giҧi cӫa radiosity chính là viӋc chia nhӓ tҩt cҧ bӅ mһt cӫa vұt thành mӝt sӕ
mҧnh hình chӳ nhұt. Giá trӏ ánh sáng cӫa mӝt mҧnh sӁ là tәng các giá trӏ ánh sáng do nó
phát ra cӝng vӟi tҩt các các ánh sáng nó nhұn ÿѭӧc mӝt cách trӵc tiӃp hoһc gián tiӃp tӯ
các mҧnh (patch) khác. Vì quá trình này ÿѭӧc áp dөng lһp ÿi lһp lҥi cho tҩt cҧ các mҧnh,
cuӕi cùng nó ÿӗng qui vӅ giҧi pháp chiӃu sáng toàn cөc.
Vì phѭѫng pháp này chӍ nghiên cӭu vӅ giҧi pháp khuӃch tán ánh sáng, và giҧi thuұt
này vӅ mһt tәng quan vӕn ÿã ÿѭӧc mô tҧ mӝt cách ÿӝc lұp. ĈiӅu ÿó có nghƭa là giҧi thuұt
này có thӇ ÿѭӧc xӱ lý trѭӟc, sau ÿó nó ÿѭӧc hiӇn thӏ dѭӟi mӑi góc ÿӝ. Tҩt nhiên, nӃu bҩt

128
Chѭѫng 8: Ánh sáng
kǤ mӝt ánh sáng hay ÿӕi tѭӧng nào trong tәng thӇ bӏ dӏch chuyӇn thì giҧi thuұt này sӁ phҧi
tính toán lҥi.
Vӟi nhӳng nguyên nhân ÿѭӧc trình bày ӣ trên, Radiosity không hoàn toàn là giҧi
thuұt chiӃu sáng toàn cөc. Mӝt giҧi pháp chѭa hoàn toàn chính xác nhѭng vүn có thӇ ÿáng
tin cұy, nӃu nó chuҭn theo kӻ thuұt tiӅn xӱ lý cӫa radiosity vӟi viӋc thӵc hiӋn mӝt
raytracing trong suӕt quá trình tô trát (render).

Hình 8.3 Phѭѫng pháp radiosity


8.1.2.3. Photon Mapping
Photon mapping là thuyӃt minh vӅ chiӃu sáng toàn cөc gҫn ÿây nhҩt. Phѭѫng pháp này
giҧi quyӃt ÿѭӧc phҫn viӋc cӫa tán xҥ ánh sáng và các vҩn ÿӅ cӫa phҧn chiӃu ánh sáng. Tuy
nhiên, xӱ lý raytracing lҫn thӭ hai phө thuӝc hoàn toàn vào giҧi pháp bҳt ÿiӇm phҧn chiӃu.
Khái niӋm cӫa giҧi pháp này khá ÿѫn giҧn: mӛi ánh sáng phát ra x hҥt photon. Khi
các hҥt này gһp phҧi mӝt vұt gì ÿó thì vӏ trí và giá trӏ cӫa ánh sáng cӫa chúng sӁ ÿѭӧc lѭu
lҥi trong mӝt cҩu trúc dӳ liӋu thông minh. Dӵa vào cѫ sӣ dӳ liӋu trên cùng vӟi kӻ thuұt
render, tӯ các hҥt này ta sӁ lҫn ngѭӧc lҥi dҩu vӃt ánh sáng trong thӃ giӟi thӵc thӇ ÿӇ ÿánh
giá lҥi cѭӡng ÿӝ ánh sáng tҥi tӯng ÿiӇm xác ÿӏnh trong khoҧng ÿang xét.

Hình 8.4 ánh xҥ photon


8.2. CÁC KӺ THUҰT CHIӂU SÁNG TRONG ĈӖ HӐA MÁY TÍNH
8.2.1. Ĉánh giá vӅ cѭӡng ÿӝ ánh sáng
Khái Ĉӏnh nghƭa
niӋm
P P là ÿiӇm mà ta tính toán các giá trӏ màu sҳc

129
Chѭѫng 8: Ánh sáng
N N là vectѫ pháp tuyӃn chuҭn hoá cӫa bӅ mһt (vectѫ trӵc chuҭn) tҥi ÿiӇm P
Q Q: vӏ trí cӫa ánh sáng
L L là vécto ánh sáng tӯ ÿiӇm Q tӟi P. Do vұy giá trӏ cӫa L sӁ ÿѭӧc tính nhѭ
sau:
L=P - Q
V V là vectѫ quan sát.
R R là giá trӏ phҧn chiӃu xung quanh V, nó ÿѭӧc tính toán nhѭ sau:
R N  V * (( N * V ) * 2)

H Trong thӡi gian trѭӟc, khi tӕc ÿӝ cӫa máy tính chѭa nhanh ÿѭӧc nhѭ ngày
nay, ÿӇ tính ÿӵѫc giá trӏ R ÿòi hӓi chi phí nhiӅu vӅ thӡi gian và tiӅn bҥc nên
ngѭӡi ta dùng mӝt giá trӏ xҩp xӍ ÿӇ thay thӃ là H:
(L  V )
H
2
8.2.2. Cѭӡng ÿӝ ánh sáng
Trong nghiên cӭu, thiӃt kӃ cѭӡng ÿӝ ánh sáng có hai phѭѫng pháp:
Phѭѫng pháp thӭ nhҩt ÿѭӧc ÿҥi diӋn bҵng mӝt bӝ 3 vectѫ ÿѫn, mӛi giá trӏ ÿѭӧc giӟi
hҥn tӯ 0-1. Trong phѭѫng pháp này, cùng lúc 3 vectѫ ÿѭӧc dùng ÿӇ xác ÿӏnh tҩt cҧ các
thuӝc tính màu cӫa vұt.
Phѭѫng pháp thӭ hai, mӛi thuӝc tính ánh sáng sӁ ÿѭӧc biӇu diӉn bӣi mӝt bӝ 3 vectѫ.
Do vұy mӛi mӝt giá trӏ ánh sáng sӁ bao gӗm mӝt giá trӏ màu bao quanh, mӝt giá trӏ màu
khuӃch tán ...
Phѭѫng pháp thӭ nhҩt thì mô tҧ thұt hѫn, trong khi phѭѫng pháp thӭ hai lҥi ÿҥt hiӋu
quҧ cao trong viӋc tҥo hiӋu ӭng nghӋ thuұt. HiӋn nay thì xu hѭӟng chung không còn quá
coi trӑng viӋc mô tҧ chính xác sӵ vұt hiӋn tѭӧng.
Hàm phân phӕi phҧn xҥ hai chiӅu –– BRDF
NӃu nhìn tӯ cҥnh cӫa vұt, ánh sáng nҵm rҧi rác tҥi tӯng ÿiӇm ÿѫn lҿ trên khҳp bӅ
mһt vӟi cѭӡng ÿӝ sáng sӁ thay ÿәi liên tөc qua các góc.

Hình 8.5 BRDF


ViӋc cӕ gҳng ÿѭa mӝt mô hình ánh sáng vӅ mӝt mүu chính là hàm phân phӕi hӋ sӕ
phҧn xҥ hai chiӅu (BRDF). Chӭc năng cӫa BRDF ÿѭӧc ÿӏnh nghƭa nhѭ sau :

130
Chѭѫng 8: Ánh sáng
I O , r (O , T r , I r , T i , I i )
p " (O , T r , I r , T i , I i ) r
O r I O ,r (O , T i , Ii ) cos(T i dZ i )
r

Các thuұt ngӳ ÿѭӧc ÿӏnh nghƭa nhѭ sau :

Khái niӋm Ĉӏnh nghƭa


Ir Cѭӡng ÿӝ phҧn chiӃu cӫa ánh sáng hѭӟng ra
Ii Cѭӡng ÿӝ phҧn chiӃu cӫa ánh sáng hѭӟng vào
O Bѭӟc sóng

U”” HӋ sӕ Quang Phә cӫa tia phҧn xҥ

(Tr,Ir) hѭӟng tia ÿi ra

(Ti,Ii) Hѭӟng tia ÿi vào


BRDF ÿѭӧc ÿӏnh nghƭa là tӹ lӋ cӫa cѭӡng ÿӝ ánh sáng ÿi ra theo mӝt hѭӟng ÿһc biӋt
và cѭӡng ÿӝ luӗng sáng ÿi vào ÿѭӧc ÿánh dҩu bҵng ÿiӇm P.
Theo công thӭc ӣ trên thì nó chѭa hoàn toàn hӳu ích cho nhӳng công viӋc mang tính
thӵc hành cao. Do vұy các nhà nghiên cӭu ÿã bӓ nhiӅu công sӭc vào viӋc nghiên cӭu tìm
ra nhӳng mô tҧ, ӭng dөng mang tính thӵc tiӉn cao hѫn cӫa BRDF.
Màu sҳc truyӅn thӕng cӫa mӛi vұt chҩt tҥi ÿiӇm P sӁ ÿѭӧc chia ra thành 3 yӃu tӕ
riêng biӋt: Bao quanh (ambient), phҧn chiӃu (specular) và khuӃch tán (diffuse).
8.2.3. Nhӳng thuӝc tính bao quanh cӫa vұt chҩt
Thuӝc tính bao quanh không phҧi là mӝt thuӝc tính reallife thӵc sӵ, nhѭng nó thѭӡng
ÿѭӧc ӭng dөng cao trong nghӋ thuұt và viӋc gӥ lӛi (debug). Màu bao quanh có thӇ ÿѭӧc
mô tҧ bҵng màu ÿӗng nhҩt cӫa chúng, mà không thay ÿәi cѭӡng ÿӝ trên toàn bӝ bӅ mһt.
Vì thӃ giá trӏ ánh sáng cӫa mӝt ÿӕi tѭӧng bao quanh tҥi mӝt bӅ mһt ÿѭӧc xây dӵng
trong ÿoҥn giҧ mã sau:
Ambient Color Calculation
Surface S = Surface that P lies on;
Color C = S.Material.Ambient;
return C;
Và chúng ta có thӇ nhұn thҩy rҵng, ánh sáng toàn cөc là tәng thӇ cӫa nhӳng tác ÿӝng
tӵ nhiên cӫa sӵ chiӃu sáng và các ÿiӅu kiӋn cӫa bӅ mһt. Và là mӝt ánh sáng liên tөc.

Hình 8.6 hình cҫu Raytraced chӍ vӟi thành phҫn bao quanh.

131
Chѭѫng 8: Ánh sáng
8.2.4. Thuӝc tính khuӃch tán cӫa vұt chҩt
Màu khuӃch tán là sӵ trҧi ra nhѭ nhau theo mӑi phѭѫng hѭӟng, và vì thӃ chӍ phө thuӝc
trên vectѫ ánh sáng ÿҫu vào L, và vectӓ pháp tuyӃn trӵc chuҭn N. Hình vӁ sau cho thҩy ý
tѭӣng ÿó:

Hình 8.7 Mô tҧ ánh sáng khuӃch tán


Mô hình Phong sau khi thӵc hiӋn thành phҫn phҧn chiӃu:
Specular Color Calculation
ReflectionVector R
IntersectionNormal N
IntersectionPoint P
Surface S = Surface P lies on
float glossiness = S.material.glossiness
float angle = R.dot(N)
float intensity = Light.Color * S.material.specular
return intensity * pow(angle,glossiness)

Hình 8.8 hình cҫu Raytraced chӍ vӟi thành phҫn phҧn chiӃu
Mô Hình Phong:
Ĉa sӕ vұt thӇ không chӍ ÿѭӧc mô tҧ ÿѫn thuҫn bҵng mӛi thuӝc tính phҧn xҥ hay
khuӃch tán, mà nó là sӵ kӃt hӧp cӫa cҧ hai yӃu tӕ này thұm chí là cҧ các thuӝc tính bao
quanh nӃu cҫn.
Mô hình Phong ÿѭӧc ÿӏnh nghƭa trong BRDF nhѭ sau:

Khái niӋm Ĉӏnh nghƭa


Diffuse Phҫn nhӓ năng lѭӧng phҧn chiӃu
Specular Phҫn nhӓ cӫa năng lѭӧng khuyӃch tán phҧn chiӃu
I Góc giӳa hѭӟng tia tӟi R và hѭӟng nhìn V

132
Chѭѫng 8: Ánh sáng

Hình 8.9 Phân phӕi cӫa Phong.


Ĉa sӕ viӋc mӣ rӝng thӵc thi ÿӅu ÿѭa tӟi:

Ĉoҥn mã rút gӑn:


Phong Calculation
return
AmbientColorCalculation()+DiffuseColorCalculation()+SpecularColorCalculation();
Lѭu ý: nӃu ta dùng màu sҳc theo hѭӟng trӵc quan hoá thì sӁ cҫn dùng ÿӃn phѭѫng
pháp chӗng chҩt màu.

Hình 8.10 Hình cҫu Raytraced vӟi ánh sáng Phong


8.2.5. Sӵ tѭѫng tác bӅ mһt/ánh sáng
Mӛi bӅ mһt tѭѫng tác ánh sáng theo nhӳng cách khác nhau tuǤ theo thuӝc tính riêng cӫa
nó.
Absorbance
Trong thӃ giӟi thұt mӝt bӅ mһt luôn thu hút mӝt vài luӗng ánh sáng khác nhau nào
ÿó. ĈiӅu ÿó lý giҧi cho sӵ tán sҳc nhiӋt. Và ÿa sӕ nhӳng thuӝc tính này ÿӅu bӏ bӓ qua khi
render. Ĉôi khi quá trình render cNJng phҧi sӱ dөng mӝt sӕ vұt thay thӃ ngүu nhiên (fake)
ÿӇ tránh các vòng ÿӋ quy vô hҥn.
Reflectance
Mӝt bӅ mһt phҧn chiӃu ánh sáng dӵa trên các yӃu tӕ nhѭ: bӅ mһt bình thѭӡng cӫa
vұt, hѭӟng nhìn, và góc tӟi cӫa ánh sáng. Tham sӕ hӋ sӕ phҧn xҥ chính là giá trӏ cѭӡng ÿӝ
ánh sáng trong khu vӵc xem xét ÿѭӧc mô tҧ ӣ trên.
8.2.6. Sӵ khúc xҥ và sӵ truyӅn sáng
Bҩt kǤ mӝt vұt thӇ nào vӟi mӝt ÿӝ trong suӕt nhҩt ÿӏnh thì ÿӅu truyӅn sáng. Ĉó là hiӋn
tѭӧng ánh sáng ÿi qua các ÿiӇm cong P, tuân theo luұt Snell. HiӋn tѭӧng này dӉ thҩy nhҩt
khi ta quan sát mӝt cӕc nѭӟc, nѫi mà các ÿӕi tѭӧng ӣ mӝt mһt khác hay ӣ dѭӟi bӅ mһt

133
Chѭѫng 8: Ánh sáng
quan sát có vҿ ÿѭӧc chuyӇn vӏ trí. Vì thӃ nӃu mӝt tia tӟi trong môi trѭӡng vұt chҩt m1 (lúc
này không khí và chân không ÿӅu ÿѭӧc coi là vұt chҩt) vӟi hӋ sӕ khúc xҥ n1 ӣ mӝt góc ș1,
ÿӃn môi trѭӡng vұt chҩt m2 có hӋ sӕ khúc xҥ n2; thì luұt Snell ÿӏnh nghƭa là:

Ĉây ÿѭӧc gӑi là phѭѫng trình khúc xҥ cӫa tia T.

R là tia tӟi cӫa ánh sáng.


Biên giӟi giӳa hai môi trѭӡng vұt chҩt ÿѭӧc gӑi là giao diӋn.
8.3. CÁC CÔNG NGHӊ
8.3.1. Raytracing
8.3.1.1. Giͣi thi͏u
Raytracing bҳt ÿҫu ÿѭӧc sӱ dөng trong ÿӗ hӑa máy tính tӯ khoҧng 1980 nhѭ là mӝt sӵ thӱ
nghiӋm sӟm nhҩt trong viӋc giҧi quyӃt vҩn ÿӅ chiӃu sáng tәng thӇ. Sau ÿó ÿã có vô sӕ cҧi
tiӃn ÿѭӧc ÿѭa ra, nhѭng chúng ta chӍ diӉn tҧ mӝt ý tѭӣng cѫ bҧn và nhӳng phҫn liên quan.
Phҫn này có nhiӅu ѭu ÿiӇm hѫn và cNJng chӭa mӝt vài kӻ thuұt mӟi hѫn, tuy không cҧi
thiӋn chҩt lѭӧng hình ҧnh nhѭng lҥi tăng tӕc ÿӝ trong viӋc xӱ lý biӇu diӉn.
8.3.1.2. Thu̵t toán
Ý tѭӣng cѫ bҧn trong raytracing là lҫn theo dҩu vӃt cӫa các phҫn tӱ ánh sáng ngѭӧc chiӅu
vӟi nguӗn phát sáng, ví dө tӯ mҳt ÿӃn khung cҧnh. Khi mӝt tia sáng tiӃp xúc vӟi ÿӕi
tѭӧng trong khung cҧnh có ánh sáng cѭӡng ÿӝ mҥnh tҥi ÿiӇm giao nhau ÿѭӧc tính toán
cho phѭѫng ÿӕi diӋn vӟi tia sáng. Cѭӡng ÿӝ này chính là ““màu”” cӫa tia sáng.
ĈӇ tính toán cѭӡng ÿӝ, chúng ta sӱ dөng công thӭc sau:
I = Ilocal + kr*Ireflected + kt*Itransmitted
Trong ÿó:
Ilocal: ánh sáng trӵc tiӃp
Kr : nhân tӕ phө thuӝc vұt chҩt ÿҥi diӋn sӵ phҧn chiӃu
Ireflected: cѭӡng ÿӝ ánh sáng ÿӃn tӯ nguӗn phҧn chiӃu
K t: nhân tӕ phө thuӝc vұt chҩt ÿҥi diӋn ÿӝ chҳn sáng
Itransmitted: cѭӡng ÿӝ ánh sáng truyӅn xuyên qua ÿӕi tѭӧng
Ilocal:(ánh sáng trӵc tiӃp) có thӇ ÿѭӧc tính toán sӱ dөng bҩt kǤ sӵ phҧn chiӃu mô hình
cөc bӝ nào, nhѭng trong thӵc tӃ ÿiӅu này ÿa sӕ luôn luôn là mô hình Phong ÿѭӧc mô tҧ
trong phҫn trѭӟc cӫa tài liӋu. Mô hình thѭӡng ÿѭӧc tăng cѭӡng và ÿѭӧc gӑi là ““bóng nhҥy
sáng””(Shadow feelers). Bóng nhҥy sáng là tia sáng ÿѭӧc ném xuyên qua khung cҧnh tӯ
ÿiӇm giao nhau ÿӃn mӛi nguӗn sáng ÿӇ xác ÿӏnh nӃu có tҫm nhìn (line of sight) hoһc nӃu
ánh sáng bӏ chһn lҥi bӣi mӝt vài ÿӕi tѭӧng khác. NӃu mӝt nguӗn sáng bӏ chһn lҥi thì nó bӏ

134
Chѭѫng 8: Ánh sáng
bӓ qua trong mô hình cөc bӝ. Mô hình Phong có thӇ ÿѭӧc tính toán tӯ ÿiӇm giao nhau và
tҥi ÿiӇm bӅ mһt thông thѭӡng.
Cҧ Ireflectted và Itransmitted ÿӅu ÿѭӧc xác ÿӏnh bҵng viӋc bҳn mӝt tia sáng mӟi xuyên qua
khung cҧnh cNJng giӕng nhѭ tia sáng ÿѭӧc bҳn xuyên qua ÿiӇm ҧnh cӫa hình ҧnh. ĈiӇm
bҳt ÿҫu cӫa chuӛi tia sáng này là ÿiӇm giao nhau, có phѭѫng là phѭѫng phҧn chiӃu cӫa
Ireflected và hѭӟng khúc xҥ cӫa Itransmitted. ViӋc tính toán nhӳng phѭѫng hѭӟng này ÿѭӧc biӇu
diӉn (covered) bên dѭӟi:
Phѭѫng hѭӟng ÿѭӧc tính toán nhѭ sau:
R = 2(N*L)N - L
Trong ÿó: N : pháp tuyӃn trӵc chuҭn tҥi ÿiӇm giao nhau
L: phѭѫng ÿӕi diӋn vӟi tia sáng ÿӃn
ĈiӅu khiӇn viӋc truyӅn tia sáng (khúc xҥ):
T = (n1/n2)L - (cos(ij) + (n1/n2)(L*N))N
Trong ÿó: n1: chӍ sӕ khúc xҥ cӫa vұt chҩt ÿӃn
n2: chӍ sӕ khúc xҥ cӫa vұt chҩt ÿi
ij: ÿѭӧc xác ÿӏnh bҵng công thӭc sau:
(sin ij/sin ș) = (n1/n2) và ș là góc giӳa L và N
Mӝt khi bҳn mӝt tia sáng mӟi tӟi mӛi ÿiӇm giao nhau (ÿӇ tính toán Ireflected và
Itransmitted) raytracing sӱ dөng mӝt hàm ÿӋ quy. ĈiӅu kiӋn giӟi hҥn cho ÿӋ quy có thӇ hoһc
là ÿӏnh trѭӟc chiӅu sâu phép ÿӋ quy cӵc ÿҥi có thӇ ÿҥt ÿӃn hoһc khi tia sáng không chҥm
tӟi bҩt kǤ ÿӕi tѭӧng nào trong khung cҧnh trong trѭӡng hӧp nào ÿó ÿѭӧc cҩp phát mӝt
màu nӅn.
Rõ ràng ÿӝ sâu hѫn mà ta cho phép phép ÿӋ quy sӁ làm thӡi gian dӏch lâu hѫn nhѭng
chiӅu sâu phép ÿӋ quy cӵc tiӇu có thӇ làm cho mӝt phҫn nhҩt ÿӏnh cӫa hình ҧnh bӏ mҩt.
ViӋc tìm chính xác chiӅu sâu cӫa phép ÿӋ quy cӵc ÿҥi ÿӇ sӱ dөng là mӝt vҩn ÿӅ cӫa viӋc
vһn và kiӇm tra cho ÿӃn khi kӃt quҧ hình ҧnh nhìn ÿѭӧc tӕt.
Mӝt ví dө làm cách nào ÿӇ xác ÿӏnh trѭӟc chiӅu sâu phép ÿӋ quy có thӇ ҧnh hѭӣng
ÿӃn hình ҧnh cuӕi cùng có thӇ ÿѭӧc nhìn thҩy trong ҧnh dѭӟi. Hình ҧnh ÿҫu tiên hiӇn thӏ
mӝt cҧnh tәng quan vӟi ÿӝ sâu phép ÿӋ quy là 5. Trong nhӳng ҧnh tiӃp theo, ta có cái nhìn
cұn cҧnh mӝt phҫn bên trong thú vӏ - tӭc là ӣ ÿâu có 2 hình cҫu tѭѫng tác vӟi nhau. Ҧnh 2
cho thҩy chiӅu sâu phép ÿӋ quy 0, ví dө chӍ mô hình phҧn xҥ cөc bӝ (Phong trong trѭӡng
hӧp này) ÿѭӧc sӱ dөng. Ҧnh 3 biӇu diӉn chiӅu sâu phép ÿӋ quy 1. Ӣ ÿây ta có thӇ nhìn
thҩy 2 hình cҫu phҧn chiӅu lүn nhau mӝt lҫn. Hình cҫu cӵc tҧ (leftmost) cNJng sáng hѫn khi
màu nӅn cӫa cҧnh ÿѭӧc cho phép nҧy ra khӓi nó. Ҧnh còn lҥi cho thҩy chiӅu sâu phép ÿӋ
quy 2, 3 và 4. Chú ý thông sӕ tѭѫng ӭng cӫa hình cҫu phҧn chiӃu lүn nhau và thұt khó ÿӇ
nhұn ra sӵ khác nhau giӳa 2 lҫn cuӕi.

135
Chѭѫng 8: Ánh sáng

1 2 3

4 6
5
Hình 8.11 Hình các quҧ cҫu phҧn chiӃu
Raytracing có thӇ ÿѭӧc nhìn nhѭ mӝt cây- xӱ lý tҥo thành tӯ mӛi va chҥm tia làm
phát sinh ra nhiӅu hѫn 2 tia: 1 phѭѫng phҧn chiӃu và 1 phѭѫng khúc xҥ. Nhӳng tia này
ÿѭӧc giҧ thiêt rҩt mӓng và không dàn trҧi. KӃt quҧ này trong mӝt sӕ vҩn ÿӅ ÿѭӧc mô tҧ
phía dѭӟi nhѭng cNJng có nghƭa 1 raytracer có thӇ phҧi ÿӫ nhanh mӝt khi sӕ ÿiӇm giao
nhau trên 1 pixel có hҥn bӣi 2n vӟi n là chiӅu sâu cӫa phép ÿӋ quy. Có thӇ thҩy chiӅu sâu
cӫa phép ÿӋ quy không phҧi rҩt cao- thông thѭӡng giӳa 4 và 8 là ÿӫ. 256 ÿiӇm giao nhau
bӣi vұy là cӵc ÿҥi và trong trѭӡng hӧp nhӳng ÿӕi tѭӧng mӡ ÿөc chӍ có 1 tia trên 1 ÿiӇm
giao nhau thì sinh ra 1 khӕi lѭӧng lӟn sӕ giao ÿiӇm trên 1 pixel tӟi 8. ĈiӅu này có nghƭa là
nhӳng cҧnh có ÿӝ phӭc tҥp vӯa phҧi có thӇ biӇu diӉn lҥi trong 10 phҫn giây (tens of
second) trên phҫn cӭng hiӋn tҥi và thұm chí khung hình thӡi gian thӵc (realtime
framerates) là có thӇ nӃu thuұt giҧi ÿѭӧc tӕi ѭu hóa.
Chú ý: cҧ 3 thành phҫn trong công thӭc tính cѭӡng ÿӝ có thӇ ÿѭӧc tính toán tӯ ÿiӇm
giao nhau và vectӓ pháp tuyӃn trӵc chuҭn trên ÿiӇm ÿó.
Mã giҧ cho toàn bӝ thuұt giҧi nhѭ sau:
Color traceRay(Vector start, Vector direction, int depth){
if (depth < 0) return BLACK;
Object hitObject;
Vector hitPoint;
if (rayHit(start, direction, &hitObject, &hitPoint)) {
Color result;
result = calculateLocalContribution(hitObject, hitPoint);
result += calculateReflection(hitObject, hitPoint,
traceRay(hitPoint, reflectedDirection, depth - 1));
result += calculateRefraction(hitObject, hitPoint,
traceRay(hitPoint, refractedDirection, depth - 1));
return result;
}
else
return BACKGROUND_COLOR;
}
Image raytraceImage(Vector eye) {

136
Chѭѫng 8: Ánh sáng
Image image;
for(each scanline Y) {
for(each pixel X) {
image[X][Y] = traceRay(eye,directionFromEyeToXY, RECURSION_DEPTH);
}
}
return image;
}
8.3.1.3. Màu g͙c (Primitives)
Cҧnh raytraced phҧi bao gӗm nhӳng ÿӕi tѭӧng (ÿѭӧc gӑi là nhӳng màu gӕc) mà có thӇ
tính toán ÿѭӧc giao ÿiӇm vӟi mӝt tia và vectӓ pháp tuyӃn trӵc chuҭn tҥi ÿiӇm ÿó. Mһt
khác chúng yêu cҫu mӝt raytracer và bӣi vұy nó dӉ dàng ÿѭӧc thêm vào nhӳng màu gӕc-
chӍ mӝt trong sӕ ÿó phҧi viӃt hàm ÿӇ thӵc hiӋn nhiӋm vө này.
8.3.1.4. Màu g͙c chính xác (Mathematical primitives)
Nhӳng ÿӕi tѭӧng nhѭ nhӳng hình cҫu và mһt phҷng thì dӉ dàng ÿӇ ÿiӅu khiӇn trong mӝt
raytracer tӯ tia sáng –– sӵ giao nhau và thông thѭӡng rҩt dӉ ÿӇ tính toán. Nhӳng ÿiӅu này
cNJng có thӇ ÿѭӧc tính toán trong mӝt khoҧng thӡi gian không thay ÿәi và vӟi ÿӝ chính xác
tùy ý (ÿây không phҧi là trѭӡng hӧp cho màu gӕc ÿѭӧc mô tҧ bên dѭӟi). Ӣ ÿây không ÿi
vào chi tiӃt vӅ tia sáng –– tính toán cҳt ngang (intersect), chúng có thӇ ÿѭӧc tìm thҩy trong
[6] và viӋc thӵc hiӋn có thӇ ÿѭӧc tìm thҩy trong code.
8.3.1.5. L˱ͣi ÿa giác (Polygon meshes)
Lѭӟi ÿa giác rҩt hӳu ích ÿӇ mô hình hóa nhӳng ÿӕi tѭӧng tùy chӑn và rҩt thích hӧp ÿӇ hӛ
trӧ nhѭ viӋc vӁ lҥi màu gӕc trong mӝt tia vҥch nӃu muӕn vӁ lҥi khung cҧnh hiӇn thӏ ÿӕi
tѭӧng tӯ thӃ giӟi thӵc nhѭ là ô tô, cái bàn, máy bay hay ngôi nhà…… - tҩt cҧ nhӳng ÿӕi
tѭӧng khó hoһc không thӇ mô hình hóa thӵc sӵ mà chӍ sӱ dөng mӝt thuұt toán ÿӕi tѭӧng
nhѭ là hình cҫu, mһt phҷng…… Trong trѭӡng hӧp ӣ ÿây chӍ làm viӋc vӟi nhӳng lѭӟi ÿa giác
nѫi mà tҩt cҧ ÿa giác ÿӅu là tam giác. Ĉây là cách truyӅn thӕng ÿӇ biӇu diӉn mӝt lѭӟi ÿa
giác và nhѭ vұy cNJng không bӏ quá hҥn chӃ.
Vӟi bҩt kǤ màu gӕc nào trong mӝt tia vҥch tҩt cҧ chúng ta cҫn có thӇ vӁ lҥi nó là mӝt
cách ÿӇ tính toán ÿiӇm giao nhau vӟi mӝt tia sáng ÿã cho và mӝt bӅ mһt bình thѭӡng mà
có ÿiӇm ÿó bên trong. Vӟi nhӳng ÿӕi tѭӧng toán hӑc ÿѭӧc miêu tҧ ӣ trên ta có thӇ nhanh
chóng tính toán chính xác. Vӟi mӝt lѭӟi ÿa giác có phҫn khó hѫn và ta sӁ hѭӟng vào 2
nhiӋm vө lҫn lѭӧt ӣ bên dѭӟi.
Vҩn ÿӅ tính toán giao ÿiӇm giӳa mӝt lѭӟi ÿa giác và mӝt tia sáng có thӇ bӏ phá vӥ
trong viӋc tính toán giao ÿiӇm giӳa tia sáng và tҩt cҧ các hình tam giác mà tҥo ra lѭӟi. Cái
gҫn nhҩt cӫa nhӳng ÿiӅu này là rҩt nhiӅu sӵ giao nhau là mӝt cái mà chúng ta sӱ dөng
ÿiӇm giao nhau giӳa lѭӟi và tia sáng.
Nhѭ vұy chúng ta gһp phҧi thách thӭc vӟi viӋc tính toán giao ÿiӇm giӳa mӝt tam
giác và mӝt tia sáng. Nhӳng ÿһc trѭng ÿѭӧc làm trѭӟc bӣi viӋc tính toán giao ÿiӇm giӳa
tia sáng và mһt phҷng mà có tam giác ӣ ÿó. Mӝt ÿiӇm nhѭ vұy sӁ luôn tӗn tҥi trӯ phi tia
sáng song song tuyӋt ÿӕi vӟi mһt phҷng tam giác. NӃu trѭӡng hӧp chúng ta có thӇ quyӃt
ÿӏnh ngay tam giác ÿó không ÿѭӧc cҳt ngang bӣi tia sáng. NӃu tia sáng ÿó cҳt mһt phҷng
137
Chѭѫng 8: Ánh sáng
tam giác thì chúng ta tiӃp tөc kiӇm tra nӃu ÿiӇm ÿó nҵm trong hình tam giác. Có rҩt nhiӅu
cách ÿӇ làm viӋc này và giҧi thuұt mà chúng ta chӑn ÿӇ sӱ dөng chi tiӃt vӅ cѫ bҧn nó tҥo
mӝt nӱa mһt phҷng tӯ mӛi hình tam giác 3 ÿoҥn, tҩt cҧ hѭӟng sao cho nhӳng ÿiӇm trӵc
giao (normal) cӫa chúng hoһc chӍ ÿi vào trong tam giác hoһc ra khӓi tӯ nó. Mӝt ÿiӇm
trong vҩn ÿӅ là bên trong tam giác nӃu nó hoһc nҵm giӳa mһt phҷng hoһc ÿҵng sau tҩt cҧ 3
nӱa mһt phҷng (phө thuӝc vào cách chӑn phѭѫng hѭӟng cӫa nӱa mһt phҷng).
Bây giӡ chúng ta trӣ lҥi vӟi nhiӋm vө tính toán trӵc giao nhѭ là mӝt giao ÿiӇm. Ý
tѭӣng hiӇn nhiên và trѭӟc hӃt là có thӇ ÿѫn giҧn trҧ lҥi trӵc giao cӫa mһt phҷng có tam
giác nҵm trên ÿó. Mӝt hѭӟng khác có thӇ phҧn ÿӕi rҵng ÿiӅu này sӁ thӵc sӵ là ÿúng trӵc
giao cӫa hҫu hӃt nhӳng ÿiӇm bên trong hình tam giác ÿó. Tuy nhiên, lѭӟi tam giác cNJng
thѭӡng ÿѭӧc sӱ dөng ÿӇ làm mӅm hѫn mô hình, uӕn cong bӅ mһt và sau ÿó làm nhҹn bӅ
ngoài cӫa mһt ÿѭӧc nhìn thҩy cӫa lѭӟi tam giác. NӃu sӱ dөng nhӳng mһt phҷng tam giác
trӵc giao nhѭ là giao cҳt thông thѭӡng thì kӃt quҧ ta ÿѭӧc giӳa các cҥnh vӟi các hình tam
giác ÿѫn lҿ.
Giҧi pháp phә biӃn nhҩt là tính toán cái gӑi là ÿӍnh trӵc giao cho lѭӟi. ĈiӅu này có
nghƭa là mӛi tam giác sӁ có 2 trӵc giao liên quan ÿӃn nó –– 1 cho mӛi ÿӍnh trong tam giác ––
và nhӳng hình tam giác ÿó sӁ chia sҿ 1 ÿӍnh cNJng sӁ chia sҿ nhӳng ÿӍnh trӵc giao tѭѫng
ӭng. ĈӍnh trӵc giao ÿѭӧc tính toán bҵng cách lҩy trung bình cӫa mһt phҷng trӵc giao cho
nhӳng tam giác mà có ÿӍnh ÿѭӧc sӱ dөng. HiӋu ӭng này có nghƭa là ÿӍnh ÿó ÿһt trên 1
cҥnh (mép) giӳa 2 hình tam giác mà ӣ 1 góc nhҩt ÿӏnh ÿӕi vӟi mӛi góc khác sӁ chӍ trong 1
phѭѫng có phҫn giӳa mһt phҷng trӵc giao cӫa tam giác và sӁ làm mӅm ӣ ngoài ánh sáng ӣ
mép. Trӵc giao cho 1 ÿiӇm ÿã cho bên trong hình tam giác ÿѭӧc tính toán bӣi phép nӝi
suy tuyӃn tính giӳa 3 ÿӍnh trӵc giao (xem thêm chi tiӃt cho giҧi thuұt này trong code).

Hình 8.12 lѭӟi ÿa giác


TӘNG KӂT: ÿiӇm giao nhau ÿѭӧc tính toán bӣi viӋc kiӇm tra mӛi tam giác trong
lѭӟi cho sӵ giao nhau vӟi tia sáng và sau ÿó sӱ dөng giao ÿiӇm gҫn nhҩt. Trӵc giao cho
mӛi giao ÿiӇm ÿѭӧc tính toán bӣi phép nӝi suy giӳa 3 ÿӍnh trӵc giao cӫa hình tam giác.
8.3.2. Radiosity
8.3.2.1. Giͣi thi͏u
Phѭѫng pháp Radiosity là mӝt phҫn giҧi pháp làm sáng tӓ vҩn ÿӅ toàn cҫu, tұp trung vào
giҧi quyӃt sӵ phҧn xҥ trӵc tiӃp(interreflection) giӳa nhӳng bӅ mһt khuӃch tán bên trong
mӝt môi trѭӡng ÿóng. Phѭѫng pháp không gӱi nhӳng vҩn ÿӅ vӟi khuӃch tán –– phҧn chiӃu,
phҧn chiӃu –– khuӃch tán hoһc phҧn chiӃu –– phҧn xҥ phҧn chiӃu trӵc tiӃp.
138
Chѭѫng 8: Ánh sáng
8.3.2.2. T͝ng quan v͉ ph˱˯ng pháp Radiosity (Overview of the radiosity method)
Mӝt khái niӋm chính cӫa phѭѫng pháp radiosity là nhӳng miӃng vá (patches), mà là
nhӳng vùng hình chӳ nhұt ÿѭӧc phát và nhұn radiosity cӫa nhӳng miӃng vá khác, nhѭ vұy
mô phӓng sӵ tѭѫng tác nhҽ.
Hình hӑc cӫa môi trѭӡng ÿѭӧc chia ra thành nhӳng miӃng vá. Nhӳng miӃng vá, mà
không phҧi là nhӳng nguӗn sáng, thoҥt tiên cho phép cѭӡng ÿӝ là không, trong khi nhӳng
miӃng vá có nguӗn sáng ÿѭӧc ÿһt ӣ mӝt lѭӧng năng lѭӧng ban ÿҫu, phө thuӝc vào cѭӡng
ÿӝ cӫa nguӗn sáng.
Mөc ÿích là tính toán tәng lѭӧng bӭc xҥ cӫa mӛi miӃng vá nhұn ÿѭӧc tӯ môi trѭӡng,
nhѭ ÿây là mӝt ѭӟc lѭӧng cӫa cѭӡng ÿӝ ánh sáng phân tán. ĈiӅu này ÿѭӧc làm lһp ÿi lһp
lҥi (iteratively), bҵng cách tính toán radiosity tҥi tҩt cҧ các miӃng vá cho ÿӃn lѭӧng năng
lѭӧng tӕi ÿa ÿѭӧc tách ra dѭӟi mӝt ngѭӥng nhҩt ÿӏnh. ĈiӇm tұn cùng ÿѭӧc ÿҧm bҧo bӣi
thӵc tӃ, mӝt lѭӧng nhҩt ÿӏnh năng lѭӧng tӓa ra ÿѭӧc nhұn lҥi thì lҥi ÿѭӧc hút lҥi tҥo mӛi
tѭѫng tác.
Sӵ tѭѫng tác bӭc xҥ giӳa nhӳng miӃng vá phҧi tính ÿӃn vài thӭ: khoҧng cách, góc và
diӋn tích miӃng vá, và xa hѫn nӳa bҩt kǤ sӵ can thiӋp nào vào nhӳng miӃng vá cNJng mang
lҥi nhӳng giҧi pháp.
Nhӳng vҩn ÿӅ này ÿѭӧc ÿһt ra bӣi Form Factors. Form Factors miêu tҧ phҫn nhӓ cӫa
sӵ bӭc xҥ tách khӓi mӝt miӃng vá và ÿӃn bҩt kǤ mӝt miӃng vá khác. HiӇu ÿѭӧc Form
Factors là trung tâm ÿӇ hiӇu vӅ phѭѫng pháp radiosity
Phѭѫng pháp radiosity sҧn sinh mӝt giҧi pháp nhìn ÿӝc lұp, nhѭ tính toán cѭӡng ÿӝ
nhӳng radiosity thì chӍ ҧnh hѭӣng bӣi cҩu trúc hình hӑc và vӏ trí cӫa nguӗn sáng.
Mӝt cҧnh tӯ viӋc thӵc thi, chú ý sӵ ÿә màu trên chiӃc hӝp

Hình 8.13 phѭѫng pháp radiosity


8.3.2.3. M͡t s͙ gi̫ thi͇t v͉ nhͷng mi͇ng vá (Some assumptions about Patches)
Nhӳng miӃng vá là nhӳng hình chӳ nhұt, ÿѭӧc giҧ thiӃt ÿӇ có cùng radiosity trên mӑi
vùng cӫa chúng. Ĉӗng thӡi, nhӳng miӃng vá ÿѭӧc giҧ thiӃt là mӝt bӅ mһt Lambertian
khuӃch tán hoàn hҧo (Lambertian= mһt phҷng hoàn hҧo), không chӍ có vұy các bӅ mһt
phía dѭӟi (subsurface) rҧi rác cӫa ánh sáng ÿһt vào vӏ trí ( khuӃch tán hoàn hҧo = phҧn
chiӃu radiosity ÿӃn ngang bҵng trong mӑi phѭѫng).

139
Chѭѫng 8: Ánh sáng
Nhӳng miӃng vá ÿѭӧc xây dӵng dӵa trên hình hӑc cӫa khung cҧnh. Sӵ chính xác
cӫa giҧi pháp (influcenced) ҧnh hѭӣng phҫn lӟn bӣi vұt chҩt (granularity) cӫa miӃng vá,
nhiӅu miӃng vá mang lҥi (yield) mӝt giҧi pháp tӕt hѫn, nhѭng cNJng tăng thêm thӡi gian
tính toán.
Giҧi pháp cho sӵ chia nhӓ thích ӭng cӫa miӃng vá cNJng tӗn tҥi. Nhӳng giҧi thuұt này
chia nhӓ miӃng vá vào trong nhӳng miӃng vá nhӓ hѫn trong mӝt khu vӵc mà sӵ thay ÿәi
quyӃt ÿӏnh cӫa radiosity, ví dө trong nhӳng ranh giӟi bóng ÿә. Cái này ÿѭӧc so sánh là
giҧi pháp tӕt hѫn vӟi ít công viӋc thӵc hiӋn hѫn, so sánh tӟi sӵ bӕ trí vұt chҩt cӫa tҩt cҧ
khung cҧnh cao hѫn. Sӵ chia nhӓ sӁ không ÿѭӧc mô tҧ ӣ ÿây.
Sӵ thӵc thi cӫa chúng ta sӱ dөng nhӳng hình tam giác nhѭ nhӳng miӃng vá, dù sӵ
ÿӏnh nghƭa cӫa chúng là hình chӳ nhұt:

Hình 8.14 Sӱ dùng hình tam giác nhѭ hình miӃng vá


Radiosity cӫa mӝt miӃng vá trong toàn bӝ sӕ lѭӧng năng lѭӧng phát ra tӯ miӃng vá,
mà cho bҵng nhau cӫa tәng sӕ bӭc xҥ nhұn ÿѭӧc và bӭc xҥ phát ra.
Nhân tӕ mүu(Form Factors)
Nhân tӕ mүu Fij cӫa 2 vùng (miӃng vá) Ai và Aj là phҫn nhӓ cӫa sӵ bӭc xҥ phát ra
khӓi Ai và ÿҥt ÿӃn Aj:

Nhân tӕ mүu ÿѭӧc tính toán tӯ sӵ tѭѫng tác bӭc xҥ giӳa nhӳng bӅ mһt rҩt nhӓ, mang
lҥi toàn bӝ phѭѫng trình:

Mӝt ÿiӅu nӳa khá khó ÿӇ tính toán phân tích cho hình hӑc chung, bӣi vұy cách tiӃp
cұn khác ÿӇ giҧi quyӃt phѭѫng trình ӣ trên là cҫn thiӃt. Mӝt giҧi pháp sӁ sӱ dөng mӝt
hemicube.
Sӱ dөng hemicube trong xác ÿӏnh nhân tӕ mүu, nhân tӕ mүu hemicube là mӝt hiӋu
quҧ nhѭng giҧi pháp áng chӯng ÿӇ hình thành sӵ xác ÿӏnh nhân tӕ mүu.

140
Chѭѫng 8: Ánh sáng
Sӵ biӋn hӝ cӫa hemicube thì ÿӉ thҩy tӯ bên dѭӟi bӭc tranh.

Hình 8.15 MiӃng vá sӱ dөng nhân tӕ mүu hemicube


MiӃng vá A và B có cùng khu vӵc khi chiӃu tӟi bán cҫu (cùng chiӃu tӟi khu vӵc C).
Nguyên do thӭ 2 ӣ trên là sӵ hӧp nhҩt qua mӝt bán cҫu. ViӋc tìm vùng trên mӝt hình
cҫu là ÿiӅu khó hѫn so vӟi chӍ ÿѫn giҧn là tìm vùng cӫa mӝt hình tӭ giác, tӯ ÿây là sӱ
dөng mӝt hemicube.
Hemicube ÿѭӧc ÿһt ÿúng tâm cӫa miӃng vá, hѭӟng ÿӍnh cӫa hemicube trӵc giao vӟi
véc-tѫ trӵc giao cӫa miӃng vá, có thӇ nhìn ӣ bên dѭӟi.

Hình 8.16 Hemicube ÿһt ӣ tâm miӃng vá mһt thì chia nhӓ
Năm mһt cӫa hemicube ÿѭӧc chia thành nhӳng mҧnh nhӓ, giӟi hҥn ““pixels””. ĈӇ dò
tìm nhân tӕ mүu giӳa 2 miӃng vá Pi và Pj, trѭӟc tiên tҩt cҧ miӃng vá ÿѭӧc chiӃu lên trên
hemicube.

Hình 8.17 mô tҧ dò tìm nhân tӕ mүu trong hemicube

141
Chѭѫng 8: Ánh sáng
Sau ÿó nhân tӕ mүu ÿѭӧc tính toán bҵng cách cӝng nhӳng vùng cӫa tҩt cҧ các pixels
cӫa miӃng vá PJ ÿѭӧc chҥm tӟi. Nhân tӕ mүu Fij thì bҵng vùng này.
ViӋc chiӃu cNJng giҧi quyӃt vҩn ÿӅ vӟi viӋc xen vào giӳa miӃng vá (giҧ thiӃt sӱ dөng
mӝt bӝ ÿӋm Z):

Hình 8.18 tính toán nhân tӕ mүu


Vùng cӫa mӛi ÿiӇm ÿѭӧc gӑi là ““nhân tӕ mүu Denta”” ÿѭӧc tính toán theo cách:

Hình 8.19 tính nhân tӕ mүu Denta


Cho ÿӍnh cӫa hemicube:

Cho các mһt bên:

ViӋc tính toán nhân tӕ mүu ÿѭӧc thӵc hiӋn cho mӛi miӃng và lҫn lѭӧt. Chú ý rҵng
viӋc tính toán nhӳng nhân tӕ mүu chӍ phө thuӝc vào hình hӑc / nhӳng miӃng vá, nhѭ vұy
thay ÿәi trong màu sҳc cӫa ánh sáng nguӗn và vӏ trí (tӟi nhӳng miӃng vá khác) sӁ không
yêu cҫy 1 sӵ tính toán mӟi cӫa nhӳng nhân tӕ mүu (nhѭng mӝt giҧi pháp mӟi cӫa mӝt ma
trұn radiosity sӁ ÿѭӧc tính toán, xem ӣ bên dѭӟi).
Ghi chú thӵc hiӋn: mӝt cách dӉ ÿӇ kiӇm tra tính toán nhӳng nhân tӕ mүu, mà tәng
cӫa tҩt cҧ nhân tӕ mүu ӣ tҥi mӝt miӃng vá phҧi cân bҵng vӟi :

142
Chѭѫng 8: Ánh sáng
8.3.2.4. Thu̵t toán Radiosity (The Radiosity algorithm)
Tóm lҥi, radiosity Bi cӫa miӃng vá Pi là tәng cӫa nhӳng radiosity phát ra và radiosity nhұn
ÿѭӧc tӯ nhӳng miӃng vá khác:

Tӯ khi :

Ĉã cho ta nhӳng mӕi quan hӋ radiosity cѫ bҧn:

M có thӇ ÿѭӧc biӇu thӏ trong mӝt ma trұn sau:

Giҧi pháp cӫa ma trұn phҧi ÿѭӧc thӵc hiӋn cho mӛi bѭӟc sóng –– trong trѭӡng hӧp
RGB nghƭa là giá trӏ màu ÿӓ, xanh lá cây và xanh lөc. Giҧi pháp ÿҥt ÿӃn ÿѭӧc bӣi viӋc
giҧi quyӃt ma trұn lһp ÿi lһp lҥi cho ÿӃn khi sӵ bӭc xҥ tӕi ÿa luân phiên bӣi 2 miӃng vá ӣ
bên dѭӟi là mӝt ngѭӥng nhҩt ÿӏnh. Tӯ P là ít hѫn mӝt (mà có nghƭa là miӃng vá hút mӝt ít
bӭc xҥ), toàn bӝ lѭӧng bӭc xҥ ÿang giҧm bӟt lһp ÿi lһp lҥi, bҧo ÿҧm sӵ kӃt thúc viӋc lһp ÿi
lһp lҥi.
8.3.3. Photon Mapping
Trong phҫn này chúng ta sӁ miêu tҧ cách tiӃp cұn photon mapping. Phѭѫng pháp này có
vài lӧi thӃ so vӟi kӻ thuұt radiosity, trong khi nó không bӏ giҧm mҩt chҩt lѭӧng tӯ lѭӟi giҧ
(artifacts) và ÿiӅu khiӇn cҧ khuӃch tán –– phҧn xҥ khuӃch tán và phҧn chiӃu –– phҧn xҥ
khuӃch tán. Hѫn nӳa photon mapping cung cҩp mӝt giҧi pháp dӉ dàng và tao nhã (elegant)
ÿӇ trҧ lҥi tө quang.
8.3.3.1. Gi̫i thu̵t (The Algorithm)
Có 2 bѭӟc hay sӵ chuyӇn tiӃp trong giҧi thuұt:
ƒ Xây dӵng photon mapping sӱ dөng vҥch dҩu
ƒ Tái sӱ dөng lҥi nhӳng photon mapping này
Bѭӟc ÿҫu tiên: vҥch dҩu Photon (First Pass: The Photon Tracing)
Trong giai ÿoҥn này, photon ÿѭӧc bҳn ra tӯ nguӗn sáng sӱ dөng kӻ thuұt raytracing
chuҭn. Khi 1 photon chҥm tӟi 1 ÿӕi tѭӧng nó có thӇ cNJng ÿѭӧc phҧn chiӃu, truyӅn hoһc
hút. ViӋc gì sӁ xҧy ra ÿѭӧc quyӃt ÿӏnh bӣi xác suҩt và tham sӕ cӫa bӅ mһt vұt chҩt. Kӻ

143
Chѭѫng 8: Ánh sáng
thuұt ÿã ÿѭӧc sӱ dөng ÿӇ quyӃt ÿӏnh này ÿѭӧc gӑi là Russian Roulette. Ý tѭӣng cѫ bҧn là
không phҧi tҩt cҧ photon ÿӅu cҫn phҧi ÿѭӧc cho phép tiӃp tөc (survice) khi chҥm 1 vұt
chҩt, mӝt khi kӃt quҧ này trong 1 sӕ mNJ cӫa sӕ photon ÿѭӧc lѭu trӳ, và có lӁ phép ÿӋ quy
vô hҥn. Thay vào ÿó là phҧn chiӃu photon khác, vұn chuyӇn hoһc hút. Cách này theo lý
thuyӃt xác suҩt thì tҩt cҧ các photon sӁ dҫn dҫn ÿѭӧc hút.
Nhӳng photon ÿѭӧc lѭu giӳ trong bҧn ÿӗ photon thì chӍ ÿѭӧc lѭu trӳ khi chúng
ÿѭӧc phҧn chiӃu. ViӋc lѭu giӳ nhӳng photon trên sӵ phҧn xҥ phҧn chiӃu không cho bҩt kǤ
thông tin hӳu ích nào, trong khi nhӳng ÿiӅu ÿó ÿѭӧc trҧ lҥi khá tӕt sӱ dөng kӻ thuұt
raytracing chuҭn. Mӝt photon có thӇ ÿѭӧc lѭu giӳ vài lҫn dӑc theo ÿѭӡng dүn cӫa nó, và
mӛi lҫn 1 photon ÿѭӧc lѭu vӏ trí, năng lѭӧng photon ÿi vào và ÿiӅu khiӇn vào ÿѭӧc cҩt
giӳ. Cҩu trúc dӳ liӋu cho viӋc cҩt giӳ photon sӁ trông nhѭ sau:
typedef struct Photon {
Vector pos;
Vector power;
Vector dir;
short flag;
};
Jensen gӧi ý mӝt cҩu trúc dӳ liӋu gӑn hѫn nѫi anh ta ÿóng gói năng lѭӧng và
phѭѫng hѭӟng vào và ít byte hѫn. Trong sӵ thӵc hiӋn, chúng ta ÿѭӧc chӑn ÿӇ tұp trung
vào sӵ rõ ràng cӫa mã thay vì kích cӥ và tӕc ÿӝ. Tuy nhiên vӟi 1 sӕ lѭӧng rҩt lӟn photon
chúng ta gһp vài vҩn ÿӅ hiӋu năng bӣi viӋc tҧi bӝ nhӟ rҩt nһng. Cҩu trúc cӫa photon sӱ
dөng 38 byte ngѭӧc lҥi vӟi 20 bytes mà Jensen gӧi ý trong tài liӋu cӫa anh ҩy. BiӃn cӡ
ÿѭӧc sӱ dөng trong KD –– sӵ thӵc hiӋn cây.
Chuҭn bӏ Photon mapping cho sӵ chuyӇn trӣ lҥi (Preparing the photonmap for the
rendering pass). Trong thӡi gian trҧ lҥi, chúng ta cҫn ÿӏnh vӏ nhӳng photon ÿóng tӟi 1
ÿiӇm tùy ý trong không gian 3D nhiӅu thӡi gian, vài cҩu trúc dӳ liӋu cho phép tìm nhanh
hѫn ӣ nhӳng photon liӅn kӅ, và cNJng ÿiӅu khiӇn tӕt nhӳng nhӳng phân phӕi không ÿӗng
dҥng. VӅ ÿiӅu này, Jensen gӧi ý 1 cây kd cân bҵng. ĈiӅu này cho thӡi gian tìm kiӃn tӕt
hѫn và cân bҵng cӫa cây kd có thӇ thӵc hiӋn trong thӡi gian O(nlog(n)) nѫi mà n là 1 sӕ
photon trong photon mapping. Sӵ cân bҵng cӫa cây kd ÿѭӧc thӵc hiӋn bӣi viӋc tìm kiӃm
ÿiӇm giӳa cӫa trөc lӟn nhҩt và chӑn ÿó nhѭ là mӝt ÿѭӡng chia (splitplane). Mã giҧi ÿӇ xây
dӵng mӝt cây kd cân bҵng:
balance(photons P) {
find the bounding box of P
choose the largest axis A as splitplane
find the median of P in axis A
divide the pointsets into S1 and S2 according to median
balance(S1)
balance(S2)
}
Nhѭ ÿѭӧc tìm thҩy trong nhӳng hình ҧnh chúng ta thӱ các kiӇu khác nhau cӫa
nguӗn sáng, chӍ vӟi ÿiӇm nguӗn sáng xuyên qua. Tuy nhiên mӝt ÿһc tính mҥnh mӁ khác
tìm ÿѭӧc bӣi viӋc sӱ dөng photon mapping, có thӇ vӅ cѫ bҧn dù mүu nào hoһc hình dҥng
nào cӫa nguӗn sáng mà ta muӕn. Tӯ thӭ duy nhҩt cҫn thay ÿәi là phѭѫng hѭӟng và nguӗn
144
Chѭѫng 8: Ánh sáng
gӕc thӵc tӃ cӫa lightrays. Chú ý làm sao ÿӇ 2 ҧnh dѭӟi ÿây sӱ dөng nhӳng mô hình phân
phӕi khác nhau, và hiӋu ӭng ÿó có trên kӃt quҧ cuӕi cùng. Ĉҫu tiên mӝt cái ÿѭӧc bҳn tҥi
tҩt cҧ các phѭѫng, nѫi mà ngay lұp tӭc ÿѭa nhiӅu phѭѫng sáng theo hѭӟng cӱa cӫa phòng.
Sau ÿó khi photon mapping ÿѭӧc làm cho trӵc quan sӱ dөng mӝt sӵ chiӃu sáng ÿánh giá
nhӳng sӵ khác nhau này trӣ nên thұm chí còn sáng hѫn nӳa.
Bѭӟc 2: trҧ lҥi bҧn ÿӗ photon (Second Pass: Rendering The Photon Map)
Bây giӡ vӟi sӵ xây dӵng photon mapping và khҧ năng nhanh chóng xem nhӳng
photon trong ÿó, chúng ta sҹn sàng ÿӇ bҳt ÿҫu trҧ lҥi khung cҧnh thӵc tӃ.
8.3.3.2. Ĉánh giá chi͇u sáng (The Radiance Estimate)
Chúng ta nhìn thҩy photon mapping nhѭ sӵ trình bày cӫa dòng ÿӃn. ĈӇ tính toán sӵ chiӃu
sáng cho mӝt ÿiӇm x ÿã cho trong khung cҧnh, ta cҫn sӵ toàn vҽn thông tin. ĈӇ làm ÿiӅu
này ta sӱ dөng biӇu thӭc cho sӵ phҧn chiӃu:

Lr là sӵ phҧn chiӃu tҥi x trong phѭѫng w. ȍx là hình cҫu cӫa phѭѫng ÿӃn, fr là
BRDF. Ta có thӇ xҩp xӍ ÿѭӧc dòng ÿӃn sӱ dөng photon mapping cӫa ta bҵng cách ÿӏnh vӏ
n photon gҫn nhҩt ÿӃn x. Khi giҧ thiӃt rҵng mӛi photon p cҳt ngang bӅ mһt tҥi x. ǻĭp là
năng lѭӧng cӫa photon p. Chúng ta có ÿánh giá sau:

Trong thӵc tӃ ta ÿӏnh nghƭa 1 bán kính tìm kiӃm r và nhìn vào khu lân cұn vòng
quanh x. Trong khu lân cұn này ta sӱ dөng n photon gҫn nhҩt ÿӇ ÿánh giá sӵ chiӃu sáng.
Khi giҧ thiӃt rҵng bӅ mһt xung quanh x là mһt phҷng cөc bӝ ta có thӇ tính toán diӋn tích
này dӵa trên viӋc chiӃu hình cҫu lên trên bӅ mһt và sӱ dөng vùng cӫa nhӳng vòng tròn kӃt
quҧ ÿӇ ÿánh giá vùng:

Nhѭ vұy viӋc có sӵ chiӃu sáng sau sӵ ÿánh giá xҩp xӍ:

Ĉánh giá này dӵa trên nhiӅu giҧ thiӃt và sӵ chính xác phө thuӝc nhiӅu vào sӕ nhӳng
photon sӱ dөng và bán kính cӫa sӵ tìm kiӃm. Hѫn nӳa có thӇ bao gӗm nhӳng photon sai
trong góc cӫa mӝt hӝp cho ví dө. Sӵ chính xác có thӇ giҧm bӟt bӣi viӋc sӱ dөng mӝt ÿƭa
thay vì mӝt hình cҫu. Tӯ viӋc sӱ dөng mӝt hình cҫu sӁ hiӇn nhiên có lӧi thӃ tính toán hѫn
(ví dө tính toán viӋc chiӃu mӝt vùng và khoҧng cách dӵ kiӃn là mӝt hàm dӉ) ta ÿã không
theo ÿuәi cách tiӃp cұn này trong viӋc thӵc hiӋn và nhӳng hiӋn tѭӧng giҧ cҥnh nhҩt ÿӏnh
bӣi vұy có thӇ cҫn phҧi chú ý.

145
Chѭѫng 8: Ánh sáng
8.3.3.3. L͕c (Filtering)
ĈӇ xúc tiӃn viӋc giҧm bӟt nhӳng photon rò rӍ vào trong nhӳng vùng và sӵ chiӃu sáng
blurry, viӋc lӑc có thӇ sӱ dөng ÿӇ giҧm bӟt nhӳng hiӋn tѭӧng giҧ. Ý tѭӣng cӫa viӋc lӑc là
làm nhӳng photon tӟi gҫn ÿiӇm x quan trӑng hѫn hѫn là ra khӓi. Ta ÿã thӱ lӑc hình nón và
lӑc gaussian ÿӇ làm giҧm nhiӉu và kém chính xác. Nhѭng tӯ ÿó chúng ta ÿã bӏ giӟi hҥn
kiӇm tra trên nhӳng tө quang mà không ÿѭӧc chú ý.
a. Ĉӏnh vӏ photon(Locating the Photons )
ViӋc ÿӏnh vӏ nhӳng photon ÿѭӧc làm bҵng cách tìm xuyên qua cây KD và ÿӏnh vӏ n
ÿiӇm gҫn nhҩt tӟi x. Ta thӵc hiӋn mӝt giҧi thuұt tìm kiӃm nhӳng photon láng giӅng chung.
Nó bҳt ÿҫu tҥi nút gӕc cӫa cây KD và sau ÿó thêm photon vào mӝt danh sách nӃu chúng ӣ
trong mӝt tҫm nhҩt ÿӏnh. Cho n photon gҫn nhҩt trong danh sách ÿѭӧc sҳp xӃp, sao cho
photon xa nhҩt ÿѭӧc xóa và thêm mӝt photon tӟi gҫn nӃu danh sách ÿã chӭa n photon. ĈӇ
ÿҥt ÿѭӧc ÿiӅu này chúng ta sӱ dөng mӝt hàng ÿӧi có quyӅn ѭu tiên ÿӇ giӳ phҫn thông tin
tìm kiӃm photon.
Cho giҧi thuұt tìm kiӃm này chúng ta cҫn mӝt bán kính tìm kiӃm ban ÿҫu. Trong quá
trình thӵc hiӋn bán kính này ÿѭӧc thao tác bҵng tay cho mӛi khung cҧnh riêng biӋt. Mӝt
ÿiӅu rҩt quan trong là chӑn ÿѭӧc bán kính tӕt, nӃu nó quá lӟn thì viӋc tìm kiӃm sӁ rҩt
chұm, và nӃu nó nhӓ quá thì không ÿӫ sӕ photon tìm thҩy, nên cҫn mӝt mӭc ÿӝ ÿiӅu
chӍnh. Ta cNJng cӕ ÿӇ thӵc hiӋn viӋc xác ÿӏnh bán kính tìm kiӃm, khӣi ÿӝng vӟi mӝt bán
kính nhӓ và tăng dҫn nó nӃu sӕ photon tìm thҩy vүn chѭa ÿӫ. Chúng ta không có bҩt cӭ sӵ
cҧi tiӃn nào do ÿiӅu này, bӣi viӋc tìm kiӃm hai hoһc ba lҫn là quá lӟn.
Dѭӟi ÿây ta có thӇ nhìn thҩy mӝt vұt lai (hybrid) cӫa góc hӝp trҧ lҥi vӟi 20000
photon, nhѭng vӟi bán kính tìm kiӃm là 5 trên 2 lҫn ÿҫu và 15 trên 2 lҫn cuӕi. Ta cNJng có
thӇ nhìn thҩy sӵ khác nhau sӱ dөng phân phӕi xác suҩt khác nhau cӫa nhӳng photon mô tҧ
trong phҫn ÿҫu. Cӝt ÿҫu tiên là phân phӕi bình thѭӡng , cӝt thӭ 2 là phân phӕi xuӕng phía
dѭӟi GAUSS.

1 2 3 4

Hình 8.20 Giҧi thuұt tìm kiӃm dùng ÿӏnh vӏ photon


b. Tô trát (Rendering)
Mӝt lҫn ánh xҥ photon ÿã ÿѭӧc phát sinh theo vài cách ÿӇ trӵc quan hѫn. Photon
mapping là mӝt cái nhìn ÿӝc lұp, nên nó có thӇ sӱ dөng tӯ góc nhìn nào ÿó trong khung
cҧnh. Mӝt cách làm trӵc quan photon mapping rҩt nhanh là tính toán giá trӏ chiӃu cho mӛi
ÿӍnh trong khung cҧnh và sau ÿó sӱ dөng sӵ chiӃu sáng ÿӍnh ÿѭӧc hӛ trӧ bӣi ÿa sӕ phҫn
cӭng 3D trҧ lҥi cҧnh cho bҩt kǤ góc nhìn nào. Mӝt cách khác, hãy trӵc tiӃp tҥo nên sӵ trӵc

146
Chѭѫng 8: Ánh sáng
quan cho ánh xҥ. Mà ÿѫn giҧn cho mӛi pixel theo vӃt cӫa mӝt tia xuyên qua khung cҧnh
và tính toán ÿánh giá sӵ chiӃu sáng ÿӃn bӅ mһt ÿiӇm. Ĉây là cách tiӃp cұn mà chúng ta sӱ
dөng. Trong tài liӋu Jensen gӧi ý trҧ lҥi hình ҧnh cuӕi cùng sӱ dөng phân tán raytracing,
nѫi mà sӵ chiӃu sáng ÿѭӧc ÿánh giá trung bình mӝt sӕ ÿánh giá mүu. Mӛi mүu gӗm vӃt
cӫa mӝt tia tӯ mҳt xuyên qua ÿiӇm tӟi khung cҧnh. Sӵ chiӃu sáng trӣ lҥi bӣi mӛi tia, cân
bҵng vӟi sӵ chiӃu sáng ÿang rӡi khӓi theo hѭӟng tia sáng ÿӇ cho ÿiӇm giao nhau tҥi bӅ
mһt bӏ cҳt ngang ÿҫu tiên bӣi tia sáng.
Công thӭc quá trình chiӃu sáng có thӇ chia ra thành tӯng phҫn vào trong 4 phҫn sӱ
dөng kiӃn thӭc cӫa ta vӅ BRDF. Ĉӏnh hѭӟng chiӃu sáng, phҧn xҥ bóng loáng và lҩp lánh,
tө quang (caustics) và sӵ phҧn xҥ ÿa khuӃch tán. ViӋc làm trӵc quan hѫn photon mapping
trӵc tiӃp sӱ dөng raytracing mүu mang lҥi kӃt quҧ tӕt, nhѭng yêu cҫu nhiӅu photon ÿӇ ÿҥt
ÿѭӧc kӃt quҧ tӕt. Ĉһc biӋt tө quang thì khó ÿӇ làm ÿúng mӭc nӃu không có mӝt photon
mapping chuyên dөng nào ÿӇ ÿiӅu khiӇn tө quang. Trӯ phi toàn bӝ nhӳng kӃt quҧ không
tӕt nhѭ mӝt trong sӕ ÿó. Ĉây phҫn lӟn là cách tiӃp cұn thiӃu mӝt raytracing phân tán thu
nhһt. Tuy nhiên viӋc sӱ dөng mӝt cách tiӃp cұn trӵc quan hóa trӵc tiӃp làm cho nó dӉ
chuyӇn tӯ photon mapping vào trong ÿӗ hӑa thӡi gian thӵc, nѫi mà photon mapping có thӇ
sӱ dөng ÿӇ trҧ lҥi kӃt cҩu cho bҧn ÿӗ cNJng ÿѭӧc gӑi là lightmap, nhѭ vұy viӋc làm cho nó
có thӇ cho thӡi gian thӵc sӱ dөng vӟi viӋc sӱ dөng mӝt bѭӟc tiӅn xӱ lý. ĈӇ có thêm chi
tiӃt hãy xem Radiosity Using Photon Maps
Dѭӟi ÿây là mӝt vài bӭc ҧnh ÿѭӧc tô trát:

Hình 8.21 các bӭc ҧnh ÿѭӧc tô trát


8.4. SӴ SO SÁNH GIӲA CÁC KӺ THUҰT (COMPARISON OF
TECHNIQUES)
Trong phҫn này ta sӁ ÿánh giá 3 thuұt giҧi và chú ý ÿӃn năm khía cҥnh sau:
ƒ Tӕc ÿӝ - lѭӧng thӡi gian (bao gӗm cҧ quá trình tiӅn xӱ lý) yêu cҫu ÿӇ trҧ lҥi mӝt
hình ҧnh.
ƒ Chҩt lѭӧng ҧnh –– cách tҥo ra hình ҧnh, tùy chӑn theo yêu cҫu –– xӱ lý tham sӕ ÿѭӧc
yêu cҫu ÿӇ ÿҥt ÿѭӧc kӃt quҧ mong muӕn.
ƒ Sӵ hҥn chӃ hình hӑc –– kӻ thuұt có thӇ ÿiӅu khiӇn nhӳng cҧnh chuyên biӋt hoһc có
hҥn chӃ. Có thӇ sӁ tӕt hѫn ӣ mӝt vài khung cҧnh so vӟi nhӳng cҧnh khác.
ƒ Sӵ thӵc hiӋn khó khăn –– mҩt nhiӅu công sӭc ÿӇ thӵc hiӋn giҧi thuұt.

147
Chѭѫng 8: Ánh sáng
8.4.1. Raytracing
Raytracing là mӝt giҧi thuұt khá nhanh. Thӡi gian trҧ lҥi thѭӡng nҵm trong ÿѫn vӏ
giây thұm chí cho nhӳng khung cҧnh khó vӟi mӝt sӵ thӵc hiӋn cҭn thұn.
Nhӳng hình ҧnh sҧn sinh thì ҩn tѭӧng nhѭng lҥi rҩt xa thӵc tӃ và nó thѭӡng ÿѭӧc
nhìn thoáng qua rҵng hình ҧnh ÿó ÿѭӧc tҥo ra bӣi mӝt raytracer. Tӯ tӕt nhҩt ÿӇ mô tҧ hình
ҧnh ““siêu thӵc””. Nhӳng phҧn xҥ xuҩt hiӋn vӟi ÿӝ sҳc không giҧm và hình bóng thì rҩt sҳc.
Raytracing bӣi vұy cho kӃt quҧ rҩt thӵc tӃ trên khung cҧnh nѫi mà nhӳng ÿһc tính này thì
rҩt nәi bұt nhѭ là khung cҧnh vӟi nhiӅu kính, gѭѫng và kim loҥi bóng. Mһt khác khung
cҧnh vӟi ÿӕi tѭӧng ““khuӃch tán”” giӕng nhѭ thҧm và nguӗn sáng bӅ mһt hoһc cҧnh ngoài
trӡi không thӇ ÿѭӧc trҧ lҥi chân thӵc vӟi mӝt raytracer cѫ bҧn. KӃt luұn là sӵ tѭѫng tác
khuӃch tán ánh sáng thì nәi bұt trong thӵc tӃ nhѭng nó chѭa ÿѭӧc sӱ dөng ÿúng mӭc vào
trong mӝt raytracer.
Có rҩt ít các yêu cҫu cӫa khách hàng và không có sӵ hҥn chӃ vӅ hình hӑc. Hѫn nӳa
viӋc thӵc hiӋn giҧi thuұt thì khá dӉ.
8.4.2. Radiosity
Radiosity thì khá chұm so vӟi raytracing nhѭng tӯ giҧi thuұt không tính ÿӃn sӵ tѭѫng tác
phҧn chiӃu vӟi giҧi pháp trҧ lҥi cҧnh quan ÿӝc lұp. Giҧi pháp có thӇ ÿѭӧc sӱ dөng bӣi mӝt
bӝ phҫn cӭng tăng tӕc trҧ lҥi tiêu chuҭn, ví dө: toàn bӝ radiosity tính toán có thӇ là tӕn
kém vӟi bѭӟc tiӅn xӱ lý sau ÿó sӵ tѭѫng tác tӹ lӋ khung hình (framerates) là có thӇ.
Chҩt lѭӧng hình ҧnh cӫa nhӳng radiosity phát sinh có thӇ là rҩt tӕt cho khung cҧnh,
mà không có sӵ tѭѫng tác lóng lánh nào nhѭng nhӳng khung cҧnh nhѭ vұy thì không dӉ
tìm thҩy trong thӵc tӃ (nhѭng dӉ hѫn ÿӇ tìm khung cҧnh chӍ vӟi sӵ tѭѫng tác lóng lánh
cho cái mà raytracing tӕt nhҩt). Tӯ khi sӵ tѭѫng tác lóng lánh ÿѭӧc hoàn toàn lӡ ÿi bӣi
thuұt giҧi, khung cҧnh mà chӭa ÿӵng ÿiӅu này thì không thӇ trҧ lҥi khung cҧnh hiӋn thӵc.
Vài yêu cҫu cӫa khách hàng vӅ mӝt khung cҧnh là cҫn thiӃt ÿӇ ÿҥt ÿѭӧc nhӳng kӃt
quҧ mong muӕn. Ĉһc biӋt kích cӥ cӫa miӃng vá và năng lѭӧng cӫa ánh sáng có thӇ khó
ÿánh giá sӟm ÿѭӧc.
Giҧi thuұt sӱ dөng miӃng vá hình chӳ nhұt xҩp xӍ hình hӑc khi tính toán giҧi pháp và
tӯ sӵ phӭc tҥp cӫa sӕ miӃng vá hình vuông ÿó cNJng không quá nhiӅu. ĈiӅu này có nghƭa
là muӕn uӕn cong nhӳng bӅ mһt nhѭ mӝt hình cҫu toán hӑc có thӇ chӍ xҩp xӍ tӟi ÿӝ nào ÿó
hoһc sӵ tính toán sӁ rҩt lâu. Sӵ phӭc tҥp cӫa khung cҧnh không thӇ quá cao cho cùng mӝt
lý do.
Sӵ thӵc hiӋn giҧi thuұt có thӇ sӱ dөng lѭӧng thӡi gian khá lӟn chӫ yӃu vì ӣ ÿó có
mӝt sӕ bѭӟc quan trӑng.
8.4.3. Photon mapping
Photon mapping có thӇ nhanh hѫn raytracing nӃu chӍ có vài photon ÿѭӧc sӱ dөng. Tuy
nhiên trong khi cҧ chҩt lѭӧng hình ҧnh và thӡi gian trҧ lҥi tăng lên theo sӕ lѭӧng photon
ÿѭӧc sӱ dөng có lӁ nó sӁ có phҫn chұm hѫn raytracer khi sӱ dөng trong thӵc tӃ.
Tӯ khi giҧi pháp photon mapping thѭӡng ÿѭӧc sӱ dөng ÿӇ xây dӵng phía trên cӫa 1
raytracer bình thѭӡng thì nó có thӇ sҧn sinh tҩt cҧ các hình ҧnh ÿó nhѭ mӝt raytracer bình

148
Chѭѫng 8: Ánh sáng
thѭӡng. HiӋu năng cӫa phѭѫng pháp photon mapping là nó có khҧ năng mô hình hóa rҩt
nhiӅu hiӋn tѭӧng-vұt kǤ lҥ (phenomeanas) trong thӃ giӟi thӵc mà ÿây là ÿiӅu không thӇ
ÿӕi vӟi mӝt mình raytracing (nhѭ là màu máu tѭѫi, tө quang, hình bóng mӅm ……). Hình
ҧnh sӁ rҩt tӕt và hiӋn thӵc khi có ÿӫ sӕ photon ÿѭӧc sӱ dөng.
Xuҩt hiӋn vҩn ÿӅ làm sao sӱ dөng ÿӇ cho mӝt kӃt quҧ tӕt yêu cҫu rҩt nhiӅu sӵ ngҳt
quãng, và nhѭ vұy nó không dӉ ÿӇ trҧ lҥi hình ҧnh hoàn hҧo ӣ lҫn thӱ ÿҫu tiên. Tӭc là
photon mapping không ÿһt nhӳng sӵ hҥn chӃ vӅ khung cҧnh, photon có thӇ chӭa bҩt kǤ
loҥi hình hӑc nào miӉn là ÿiӇm giao nhau có thӇ ÿѭӧc tính toán và sӵ thӵc hiӋn cӫa
phѭѫng pháp khá tiên tiӃn mӟi lҥ. Phҫn khó nhҩt là ngҳt quãng nó vào trong viӋc sҧn sinh
mӝt kӃt quҧ có sӭc thuyӃt phөc.
Tóm tҳt:
Ánh sáng là phҫn rҩt quan trӑng trong ÿӗ hoҥ máy tính. Trong chѭѫng này ÿi sâu
vào xét các giҧi thuұt ÿӗ hoҥ ánh sáng, cө thӇ là các giҧi thuұt chiӃu sáng toàn cөc:
Raytracing, Radiosity và Photo mapping.
Mӛi mӝt thuұt toán ÿӅu xét ÿһc ÿiӇm, trình bày các bѭӟc và các công thӭc trong giҧi
thuұt, cuӕi cùng ÿánh giá ѭu nhѭӧc ÿiӇm cӫa tӯng giҧi thuұt.
KӃt thúc chѭѫng là so sánh ba giҧi thuұt ÿѭӧc ÿѭa ra.

149
Chѭѫng 9: Hình hӑc Fractal

CHѬѪNG 9: HÌNH HӐC FRACTAL

9.1. SӴ RA ĈӠI VÀ CÁC ӬNG DӨNG CӪA HÌNH HӐC PHÂN HÌNH
9.1.1. Sӵ ra ÿӡi cӫa lý thuyӃt hình hӑc phân hình
Trong nhiӅu thұp kӹ nӛ lӵc giҧi quyӃt các vҩn ÿӅ nan giҧi trong nhiӅu ngành khoa hӑc
chính xác, ÿһc biӋt là vұt lý và toán hӑc. Mӝt cách cө thӇ, lý thuyӃt hình hӑc phân hình
ÿѭӧc xây dӵng dӵa trên hai vҩn ÿӅ lӟn ÿѭӧc quan tâm ӣ nhӳng thұp niên ÿҫu thӃ kӹ 20.
Các vҩn ÿӅ ÿó bao gӗm:
ƒ Tính hӛn ÿӝn cӫa các quá trình phát triӇn có quy lӵc trong tӵ nhiên.
ƒ Sӵ mӣ rӝng khái niӋm sӕ chiӅu và ÿӝ ÿo trong lý thuyӃt hình hӑc Euclide cә ÿiӇn.
Các công thӭc lһp có dҥng:
Xn+1=f(Xn)
Thѭӡng ÿѭӧc sӱ dөng trong các ngành khoa hӑc chính xác ÿӇ mô tҧ các quá trình
lһp ÿi lһp lҥi có tính xác ÿӏnh. Các quá trình ÿѭӧc xác ÿӏnh bӣi công thӭc trên, trong ÿó f
thӇ hiӋn mӕi liên hӋ phi tuyӃn giӳa hai trҥng thái nӕi tiӃp nhau Xn và Xn+1, ÿѭӧc quan tâm
ÿһc biӋt. Các khҧo sát trong nhӳng thұp niên gҫn ÿây ÿã phát hiӋn ra các cѭ xӱ kǤ dӏ cӫa
các tiӃn trình lһp nhѭ vұy.
Vào các năm 1890 & 1891, trong khi tìm kiӃm các ÿһc trѭng bҩt biӃn cӫa các ÿӕi
tѭӧng hình hӑc qua các phép biӃn ÿәi ÿӗng phôi trong lý thuyӃt topo, các nhà toán hӑc
Peano & Hilbert ÿã phát minh ra các ÿѭӡng cong có tính chҩt rҩt ÿһc biӋt. Ĉó là các
ÿѭӡng cong không tӵ cҳt theo mӝt quy luұt ÿѭӧc chӍ ra bӣi Peano và Hilbert, chúng lҩp
ÿҫy mӑi miӅn hӳu hҥn cӫa mһt phҷng. Hình hӑc Euclide cә ÿiӇn quan niӋm các ÿѭӡng
cong nhѭ vұy vүn chӍ là các ÿӕi tѭӧng mӝt chiӅu nhѭ các ÿѭӡng thҷng. Tuy nhiên trӵc
quan cho thҩy cách nhìn nhѭ vұy vӅ sӕ chiӅu là rҩt gò bó. Do ÿó ngѭӡi ta bҳt ÿҫu nghƭ ÿӃn
mӝt sӵ phân lӟp mӟi, trong ÿó các ÿѭӡng có sӕ chiӅu bҵng 1 ÿѭӧc ÿҥi diӋn bӣi ÿѭӡng
thҷng, các ÿӕi tѭӧng hai chiӅu ÿѭӧc ÿҥi diӋn bӣi mһt phҷng, còn các ÿѭӡng cong lҩp ÿҫy
mһt phҷng ÿҥi diӋn cho các ÿӕi tѭӧng có sӕ chiӅu giӳa 1 và 2. Ý tѭӣng cách mҥng này ÿã
dүn ÿӃn viӋc hình thành và giҧi quyӃt bài toán sӕ chiӅu hӳu tӹ gây ra nhiӅu tranh luұn toán
hӑc trong các thұp kӹ gҫn ÿây.
TiӃp sau ÿó, vào năm 1904 nhà toán hӑc Thөy ĈiӇn Helge Koch ÿã ÿѭa ra mӝt loҥi
ÿѭӡng cong khác vӟi nhӳng ÿѭӡng cong cӫa Peano và Hilbert. Các ÿѭӡng cong Von
Koch không lҩp ÿҫy mһt phҷng nhѭng lҥi có ÿӝ dài thay ÿәi mӝt cách vô hҥn mһc dù
chúng ÿѭӧc chӭa trong mӝt miӅn hӳu hҥn. Nhӳng ÿѭӡng cong nhѭ vұy có rҩt nhiӅu trong
tӵ nhiên, ví dө nhѭ các ÿѭӡng bӡ biӇn, ÿѭӡng biên cӫa mӝt bông hoa tuyӃt, các ÿám mây,
vv…… Tҩt vҧ các ÿѭӡng cong này ÿӅu mӝt tính chҩt ÿһc trѭng là ÿӗng dҥng. Nó ÿѭӧc biӇu
hiӋn bӣi sӵ giӕng nhau giӳa mӝt phҫn rҩt nhӓ cӫa ÿѭӡng cong ÿѭӧc phóng lӟn vӟi mӝt
phҫn khác lӟn hѫn cӫa cùng mӝt ÿѭӡng cong ÿó. Tính chҩt này giӳ mӝt vӏ trí quan trӑng
trong viӋc hình thành nên các dҥng cҩu trúc vô cùng phӭc tҥp cӫa tӵ nhiên, nhѭng vào
thӡi Von Koch lҥi ÿѭӧc hiӇu biӃt rҩt sѫ lѭӧc.

150
Chѭѫng 9: Hình hӑc Fractal
ChӍ vӟi sӵ giúp ÿӥ cӫa máy tính ÿiӋn tӱ, bҧn chҩt cӫa tính ÿӗng dҥng mӟi ÿѭӧc
nghiên cӭu ÿҫy ÿӫ và chi tiӃt trong tác phҭm ““Hình hӑc phân hình trong tӵ nhiên”” cӫa
Benoit B. Mandelbrot xuҩt bҧn năm 1982. Trong tác phҭm cӫa mình, Mandelbrot ÿã phân
rã các dҥng cҩu trúc phӭc tҥp cӫa tӵ nhiên thành các thành phҫn cѫ bҧn gӑi là fractal. Các
fractal này chӭa ÿӵng các hình dáng tӵ ÿӗng dҥng vӟi nhiӅu kích thѭӟc khác nhau.
Mandelbrot ÿã tҥo nên nhӳng bӭc tranh fractal trӯu tѭӧng ÿҫu tiên và nhұn thҩy rҵng ÿҵng
sau các ÿӕi tѭӧng tӵ nhiên nhѭ các ÿám mây, các dãy núi, các khu rӯng, vv…… là các cҩu
trúc toán hӑc tѭѫng tӵ nhau. Chúng có khuynh hѭӟng hài hoà vӅ màu sҳc và cân ÿӕi vӅ
hình thӇ. Ngoài ra Mandelbrot cNJng thiӃt lұp cách xác ÿӏnh sӕ chiӅu và ÿӝ dài cӫa các
dҥng fractal cѫ sӣ. Chính vӟi ÿӏnh nghƭa vӅ sӕ chiӅu này, bài toán sӕ chiӅu không nguyên
mӟi ÿѭӧc giҧi quyӃt mӝt cách hoàn chӍnh. Có thӇ nói công trình cӫa Benoit B.Mandelbrot
ÿã chính thӭc khai sinh lý thuyӃt hình hӑc phân hình sau hѫn nӱa thӃ kӹ nghiên cӭu liên
tөc.
KӇ tӯ khi ra ÿӡi mӝt cách chính thӭc vào năm 1982 cho ÿӃn nay, lý thuyӃt hình hӑc
phân hình hӑc phân hình ÿã phát triӇn mӝt cách nhanh chóng.
9.1.2. Các ӭng dөng tәng quát cӫa hình hӑc phân hình
HiӋn nay có 3 hѭӟng ӭng dөng lӟn cӫa lý thuyӃt hình hӑc phân hình, bao gӗm:
ƒ Ӭng dөng trong vҩn ÿӅ tҥo ҧnh trên máy tính.
ƒ Ӭng dөng trong công nghӋ nén ҧnh.
ƒ Ӭng dөng trong nghiên cӭu khoa hӑc cѫ bҧn.
9.2. MӜT SӔ KӺ THUҰT CÀI ĈҺT HÌNH HӐC PHÂN HÌNH
9.2.1 Hӑ ÿѭӡng VONKOCK
Trong phҫn này chúng ta sӁ cùng nhau thҧo luұn các fractal ÿѭӧc phát sinh bҵng cách sӱ
dөng ÿӋ qui initiator / generator vӟi kӃt quҧ là các hình tӵ ÿӗng dҥng hoàn toàn. Các hình
này có sӕ chiӅu tӵ ÿӗng dҥng, sӕ chiӅu fractal và sӕ chiӅu Hausdorff-Besicovitch bҵng
nhau.
Sӕ chiӅu ÿѭӧc tính theo công thӭc sau:
log( N )
D
§1·
log¨ ¸
©R¹
Trong ÿó:
N: Là sӕ ÿoҥn thҷng.
R: Là sӕ chiӅu dài cӫa mӛi ÿoҥn.
Chúng ta bҳt ÿҫu bҵng mӝt initiator, nó có thӇ là mӝt ÿoҥn thҷng hay mӝt ÿa giác.
Mӛi cҥnh cӫa initiator ÿѭӧc thay thӃ bӣi mӝt generator, mà là tұp liên thông cӫa các ÿoҥn
thҷng tҥo nên bҵng cách ÿi tӯ ÿiӇm bҳt ÿҫu ÿӃn ÿiӇm cuӕi cӫa ÿѭӡng thay thӃ (Thông
thѭӡng các ÿiӇm cӫa generator là mӝt lѭӟi vuông hay mӝt lѭӟi tҥo bӣi các tam giác ÿӅu).
Sau ÿó mӛi ÿoҥn thҷng cӫa hình mӟi ÿѭӧc thay thӃ bӣi phiên bҧn nhӓ hѫn cӫa generator.

151
Chѭѫng 9: Hình hӑc Fractal
Quá trình này tiӃp tөc không xác ÿӏnh ÿѭӧc. Sau ÿây là mӝt sӕ ÿѭӡng Von Kock quan
trӑng.
9.2.1.1. Ĉ˱ͥng hoa tuy͇t VON KOCK-NOWFLAKE:
Ĉѭӡng hoa tuyӃt ÿѭӧc xây dӵng bӣi nhà toán hӑc Helge Von Kock vào năm 1904. Ӣ ÿây
chúng ta bҳt ÿҫu vӟi initiator là mӝt ÿoҥn thҷng. Còn generator ÿѭӧc phát sinh nhѭ sau:

Hình 9.1 Generator cӫa ÿѭӡng von kock


Chúng ta chia ÿoҥn thҷng thành ba phҫn bҵng nhau. Sau ÿó thay thӃ mӝt phҫn ba
ÿoҥn giӳa bҵng tam giác ÿӅu và bӓ ÿi cҥnh ÿáy cӫa nó. Sau ÿó chúng ta lһp lҥi quá trình
này cho mӛi ÿoҥn thҷng mӟi. Nghƭa là chia ÿoҥn thҷng mӟi thành ba phҫn bҵng nhau và
lһp lai các bѭӟc nhѭ trên.
Ta thҩy quá trình xây dӵng là tӵ ÿӗng dҥng, nghƭa là mӛi phҫn trong 4 phҫn ӣ bѭӟc
thӭ k là phiên bҧn nhӓ hѫn 3 lҫn cӫa toàn bӝ ÿѭӡng cong ӣ bѭӟc thӭ (k––1).
Nhѭ vұy mӛi ÿoҥn thҷng cӫa generator có chiӅu dài R = 1/3 (giҧ sӱ chiӅu dài ÿoҥn
thҷng ban ÿҫu là 1) và sӕ ÿoҥn thҷng cӫa generator N = 4. Do vұy sӕ chiӅu fractal cӫa
ÿѭӡng hoa tuyӃt là:
log( N ) log 4
D | 1,2618
§ 1 · log 3
log¨ ¸
©R¹

ĈӇ viӃt mӝt ÿoҥn mã cho viӋc phát sinh ra ÿѭӡng hoa tuyӃt, chúng ta cҫn phҧi trình
bày vӅ ÿӗ hoҥ con rùa (turtle graphic).
Chҷng hҥn sau ÿây là mӝt minh hoҥ cho hình vӁ trình bày ӣ mӭc 3 cӫa ÿѭӡng Von
Kock-Snowflake.

Hình 9.2 Ĉѭӡng Von Kock-Snowflake mӭc 3


9.2.1.2. Ĉ˰ͤNG VON KOCK-GOSPER:
Mӝt dҥng khác cӫa ÿѭӡng Von Kock ÿѭӧc phát hiӋn bӣi W.Gosper. Trong ÿѭӡng mӟi
này, initiator là mӝt lөc giác ÿӅu và generator chӭa ba ÿoҥn nҵm trên mӝt lѭӟi cӫa các tam
giác ÿӅu. Hình sau cho chúng ta thҩy generator bӕ trí trên lѭӟi:
152
Chѭѫng 9: Hình hӑc Fractal

Hình 9.3 dҥng cӫa ÿѭӡng Von Kock


Ta thҩy ÿѭӡng này có chút khác biӋt so vӟi ÿѭӡng hoa tuyӃt ӣ chә ÿoҥn thҷng ÿѭӧc
thay thӃ không nҵm trên bҩt kǤ các ÿѭӡng nào cӫa lѭӟi.
ĈӇ tính sӕ chiӅu fractal cӫa ÿѭӡng Gosper trѭӟc hӃt ta tính chiӅu dài mӛi ÿoҥn cӫa
generator. Giҧ sӱ chiӅu dài tӯ ÿҫu mút cӫa generator ÿӃn ÿҫu mút khác là 1.
Ĉһt:
AC = R => AE = 3AC = 3R
AB2 = AE2 + EB2 –– 2AE.EB.Cos(600)
Ta có:
Mà AB = 1, AE = 3R, EB = AC = R

Ÿ 1 9 R 2  R 2  2 3R R / 2 7R 2
1
ŸR
7
EB 2
AE 2  AB 2  2 AEAB cos D
1
1 8
AB 2  AE 2  EB 2 1  9R 2  R 2 1  8R 2 7 5 7
Ÿ cos D
2 AEAB 2 3R 1 6R 1 14
6
7
| 0 ˜ 94491
Ÿ D | 19 01'

Vì N = 3 nên sӕ chiӅu fractal cӫa ÿѭӡng Gosper là:


log 3
D | 1.1291
log 7

Hình sau là mӭc ÿҫu tiên cӫa ÿѭӡng Gosper.

153
Chѭѫng 9: Hình hӑc Fractal

Hình 9.4 ÿѭӡng Gosper


Ĉoҥn mã ÿӕi vӟi ÿѭӡng Gosper giӕng nhѭ ÿoҥn mã cӫa ÿѭӡng hoa tuyӃt, trong ÿó:
NumLines = 3
Mҧng Angle có giá trӏ sau: {19.1, -60.0 }
Ngoài ra, ÿѭӡng Gosper có các mӭc khác nhau thì tѭѫng ӭng vӟi các hình dҥng khác
nhau.
Hình sau là mӭc 3 cӫa ÿѭӡng Gosper.

Hình 9.5 Ĉѭӡng Gosper ӣ mӭc 3.


9.2.2. Ĉѭӡng SIERPINSKI
Ĉѭӡng Sierpinski ÿѭӧc trình bày sau ÿây là mӝt ÿѭӡng cong rҩt ÿһc biӋt, bӣi vì có rҩt
nhiӅu cách phát sinh ra nó vӟi các khӣi ÿӝng ban ÿҫu hoàn toàn khác nhau nhѭng lҥi kӃt
thúc ӣ viӋc sinh ra mӝt loҥi ÿѭӡng cong duy nhҩt.
Chúng ta ÿã quen vӟi phѭѫng pháp ÿҫu tiên ÿӇ phát sinh ra tam giác Sierpinski bҵng
cách sӱ dөng kӻ thuұt initiator / generator ÿѭӧc mô tҧ ӣ các phҫn trѭӟc. Ĉӕi vӟi ÿѭӡng
này, initiator là mӝt ÿoҥn thҷng.
Generator ÿӕi vӟi ÿѭӡng cong này và các ÿѭӡng ÿѭӧc sinh ra ӣ mӭc 1, 2 và 3 ÿѭӧc
minh hoҥ nhѭ sau:

Hình 9.6 Generator cӫa tam giác Sierpinski mӭc 2.

154
Chѭѫng 9: Hình hӑc Fractal

Hình 9.7 Generator cӫa tam giác Sierpinski Mӭc 1

Hình 9.8 Mӭc 3


Và ÿây là ÿѭӡng Sierpinski ӣ mӭc 4 và 8:

Hình 9.9 Mӭc 4 và 8


ĈӇ phát sinh ra ÿѭӡng này ta dùng kӻ thuұt giӕng nhѭ các ÿѭӡng hӑ Von Kock và
Peano.
9.3. CÂY FRACTAL
Trong các phҫn trѭӟc, chúng ta ÿã tҥo ra các ÿѭӡng fractal bҵng cách thay thӃ mӝt cách
lһp lҥi cӫa các ÿoҥn thҷng vӟi các mүu thu nhӓ cӫa mӝt generator mүu, kӃt quҧ là các
ÿѭӡng có tính tӵ ÿӗng dҥng. Bây giӡ, chúng ta sӁ tҥo ra ÿѭӡng cong theo mӝt hѭӟng khác.
Chúng ta sӁ bҳt ÿҫu vӟi mӝt thân cây tҥi ÿҫu mút cӫa nó chúng ta tách thân cây thành hai
hѭӟng và vӁ hai nhánh. Chúng ta sӁ lһp lҥi quá trình này tҥi các ÿҫu mút cӫa mӛi nhánh.
KӃt quҧ chúng ta sӁ ÿѭӧc mӝt cây. Trѭӟc khi chúng ta biӇu diӉn các cây tӵ nhiên, ÿҫu tiên
chúng ta thҧo luұn vài ÿiӅu vӅ các cây thӵc tӃ.
9.3.1. CÁC CÂY THӴC Tӂ:
Chúng ta phác thҧo quá trình tҥo cây ÿѭӧc cho ӣ trên. Tҥi mӛi nút trong quá trình tҥo cây,
chúng ta tách làm hai hѭӟng. KӃt quҧ ta ÿѭӧc mӝt cây hai chiӅu. Chúng ta hy vӑng nó có
mӝt sӕ quan hӋ vӟi cây thӵc tӃ 3 chiӅu. Trѭӟc khi ÿi xa hѫn, chúng ta quan sát mӝt vài
cây tӵ nhiên. Ĉҫu tiên, có hai lӟp cây là lӟp cây rөng lá (deciduous) mӛi năm và lӟp cây
tùng bách (conifers). Hai lӟp cây này hoàn toàn khác nhau. Cây tùng bách có khuynh
hѭӟng có các vòng cӫa các nhánh ӣ tҥi các ÿӝ cao khác nhau vòng quanh trung tâm cӫa

155
Chѭѫng 9: Hình hӑc Fractal
thân cây. ĈiӅu này dѭӡng nhѭ không thích hӧp vӟi tҩt cҧ các quá trình rӁ nhánh nhӏ phân
và chúng ta sӁ thҩy các cây sau ÿây do chúng phát sinh không bao giӡ giӕng vӟi cây tùng
bách thұt sӵ.
Thӭ hai, ÿӕi vӟi cây rөng lá mһc dù sӵ xuҩt hiӋn cӫa chúng rҩt gҫn vӟi mô hình cӫa
chúng ta, thӃ nhѭng vүn còn rҩt nhiӅu phӭc tҥp trong cҩu trúc cӫa chúng. Trong khi ÿó,
viӋc rӁ nhánh nhӏ phân thѭӡng có qui luұt và ÿѫn giҧn hѫn nhiӅu, chӍ ngoҥi trӯ mӝt vài
thân cây có khҧ năng tách ra nhiӅu hѫn hai nhánh.
9.3.2. BIӆN DIӈN TOÁN HӐC CӪA CÂY:
Theo Leonardo da Vinci quan sát, kӃt quҧ ÿó là do tәng sӕ các vùng cҳt ngang cӫa các
nhánh cây ӣ mӝt ÿӝ cao cho trѭӟc là hҵng sӕ. ĈiӅu này không gây ngҥc nhiên vì cây ÿòi
hӓi chuyӇn dinh dѭӥng tӯ gӕc ÿӃn lá và cho trѭӟc mӝt lѭӧng dinh dѭӥng, mӝt ngѭӡi nghƭ
rҵng thiӃt diӋn cҫn thiӃt cho sӵ vұn chuyӇn sӁ không ÿәi bҩt kӇ chiӅu cao hay sӕ ӕng dүn.
Khi chúng ta chuyӇn sӵ quan sát này vào các ÿѭӡng kính (hay các chiӅu rӝng khi chúng ta
vӁ thành cây hai chiӅu ) thì chúng ta có ÿѭӧc biӇu thӭc sau:
DD DD  DD
0 1 2
Ӣ ÿây D0, D1, D2 là ÿѭӡng kính cӫa hai nhánh chia cây làm ÿôi, D = 2 theo da Vinci.
Do ÿó các dҥng các dҥng cҩu trúc giӕng cây, mô hình ÿѫn giҧn ÿѭӧc cho ӣ trên có khҧ
năng áp dөng cho các hӋ thӕng sông tӕt hѫn các cây, vì thѭӡng có nhiӅu hѫn hai con sông
nhánh cӫa mӝt hӋ thӕng sông sӁ nӕi vӟi nhau ӣ cùng mӝt nѫi. Các cây khác ÿѭӧc tìm thҩy
trong cѫ thӇ con ngѭӡi là hӋ thӕng ÿӝng mҥch và cuӕng phәi dùng ÿӇ vұn chuyӇn máu và
oxy, trong ÿó D ÿӕi vӟi hӋ thӕng cuӕng phәi là 3 và ÿӕi vӟi ÿӝng mҥch là 2.7.
Khi chúng ta xây dӵng cây chúng ta sӁ sӱ dөng biӇu thӭc:

1
B 2 D Bn (a)
n1

Ӣ ÿây Bn là ÿѭӡng kính cӫa nhánh ӣ mӭc thҩp hѫn. Bn+1 biӇu diӉn ÿѭӡng kính mӛi
nhánh con khi Bn tách thành hai nhánh.
Chúng ta cNJng cҫn xem xét chiӅu dài mӛi nhánh. McMahon nghiên cӭu các loҥi cây
kiӇu mүu khác nhau và ÿѭa ra công thӭc nhѭ sau cho chiӅu dài:
2
L 2 3D Ln (b)
n1

Vӟi Ln là chiӅu dài cӫa nhánh trѭӟc ÿó và Ln+1 chiӅu dài cӫa mӛi nhánh trong hai
nhánh kӃ sau khi nhánh trѭӟc ÿó ÿѭӧc tách ra làm hai.
ĈӇ tҥo thành mӝt cây, ӣ ÿây chúng ta sӱ dөng ÿӗ hoҥ con rùa.
Gӑi:
(X,Y) là toҥ ÿӝ cӫa gӕc cây.
Height, Width là chiӅu cao và chiӅu rӝng cӫa cây.

156
Chѭѫng 9: Hình hӑc Fractal
Letf_Alpha, Right_Alpha là góc Alpha bên trái và góc Alpha bên phҧi.
Left_Angle, Right_Angle là góc rӁ bên trái và góc rӁ bên phҧi cӫa nhánh.
Level là mӭc cӫa cây.
Color1 là màu cӫa thân cây.
Color2 là màu cӫa tѭӟc cây.
Color3 là màu cӫa lá cây.
Thuұt toán:
(i) Tính các hӋ sӕ:
+ ChiӅu rӝng trái và phҧi theo công thӭc (a).
Left_Width_Factor = pow (2, -1.0 / Left_Alpha );
Right_Width_Factor = pow (2, -1.0 / Right_Anpha );
+ ChiӅu cao trái và phҧi theo công thӭc (b)
Left_Height_Factor = pow (2, -2.0 / (3 * Left_Alpha));
Right_Height_Factor = pow (2, -2.0 / (3 * Right_Alpha));
(ii) Xác ÿӏnh toҥ ÿӝ ngӑn cӫa thân cây:
X1 = X;
Y1 = Y + Height;
(iii) VӁ thân cây tӯ (X, Y) ÿӃn (X1, Y1) vӟi màu Color1 và chiӅu rӝng là Width.
DrawLine (X, Y, X1,Y1, Color1, Width);
(iv) Phát sinh nhánh bên trái:
Xác ÿӏnh gӕc giӳa thân cây và trөc x (tӭc là góc cӫa con rùa)
Turtle_Theta = Point (X, Y, X1, Y1);
Quay con rùa vӅ phía bên trái mӝt góc Left
Turn (Left_Angle, &Turtle_Theta);
Sau ÿó gӑi hàm Generator ÿӇ phát sinh ra nhánh bên trái.
Generator (X1, Y1,Left_Width_Factor * Width, Left_Height_Factor * Height,
Level);
v) Phát sinh bên nhánh bên phҧi:
a) Xác ÿӏnh gӕc giӳa thân cây và trөc x (tӭc là góc cӫa con rùa)
Turtle_Theta = Point (X, Y, X1, Y1);
b) Quay con rùa vӅ phía phҧi mӝt góc Right_Angle
Turn (-Right_Angle, &Turtle_Theta);
c) Sau ÿó gӑi hàm Generator ÿӇ phát sinh ra nhánh bên phҧi
Generator (X1, Y1, Right_Width_Factor * Width, Right_Height_Factor * Height,
Level);
Hàm Generator có ÿoҥn mã nhѭ sau:

157
Chѭѫng 9: Hình hӑc Fractal
Generator (float X, float Y,float Width, float Height, unsigned char Level){
(i) Xác ÿӏnh vӏ trí con rùa hiӋn tҥi và chiӅu dài mӝt bѭӟc cӫa con rùa
Turtle_X = X;
Turtle_Y = Y;
Turtle_R = Height;
(ii) Xác ÿӏnh ngӑng cӫa tѭӟc mӟi phát sinh và giҧm mӭc ÿi mӝt ÿѫn vӏ.
Step (&Turtle_X, &Turtle_Y, Turtle_R, Turtle_Theta);
X2 = Turtle_X;
Y2 = Turtle_Y;
Level--;
(iii) VӁ ÿoҥn thҷng tӯ (X, Y) ÿӃn (X2, Y2) vӟi ÿӝ rӝng là Width và
màu ÿѭӧc xác ÿӏnh nhѭ sau:
+ NӃu Level < 3 thì màu hiӋn thӡi là Color2.
+ NӃu Level >= 3 thì màu hiӋn thӡi là Color3.
If (Level < 3)
DrawLine (X, Y, X2, Y2, Width, Color2);
Else
DrawLine (X, Y, X2, Y2, Width, Color3);
iv) NӃu Level > 0 thì chúng ta tiӃp tөc phân làm hai nhánh trái và phҧi.
if (Level > 0){
Turtle_Theta = Point(X, Y, X2, Y2);
Turtle (Left_Angle, &Turtle_Theta);
Generator (Turtle_X, Turtle_Y, Left_Width_Factor * Width,
Left_Height_Factor * Height, Level )
Turntle_Theta = Point (X, Y, X2, Y2);
Turn (- Right_Angle, &Turtle_Theta);
Generator (X2, Y2, Right_Width_Factor * Width,
Right_Height_Factor * Height, Level);
}
}
Sau ÿây là hình minh hoҥ mӝt cây fractal vӟi Level = 14, Height = 80, Width = 20,
Left_Alpha = 2.0, Right_Alpha = 2.2, Left_Angle = 20, Right_Angle = 28.

158
Chѭѫng 9: Hình hӑc Fractal

Hình 9.10 Minh hoҥ cây Fractal


9.4. TҰP MANDELBROT
9.4.1. Ĉһt vҩn ÿӅ
Trong nhiӅu thұp niên cӫa thӃ kӹ XX, các nhà toán hӑc ÿã ÿӇ tâm nghiên cӭu ÿӃn mӝt loҥi
biӇu thӭc phӭc tҥp xác ÿӏnh bӣi:
zn+1 = zn2 + c, trong ÿó zi  C, i  N & c  C (1)
ĈӇ ÿѫn giҧn hoá vҩn ÿӅ, trѭӟc hӃt ta xét trѭӡng hӧp c = 0 và z0  R. Khi ÿó có 3
trѭӡng hӧp sau:
+ z0 = 1 : khi ÿó zn = 1, n t 1.
+ z0 < 1 : khi ÿó zn o 0 khi n o f.
+ z0 > 1 : khi ÿó zn o f khi n o f.
Ӣ ÿây tӕc ÿӝ tiӃn ÿӃn 0 hay tiӃn ÿӃn f cӫa dãy (zn) ÿѭӧc quyӃt ÿӏnh bӣi giá trӏ ban
ÿҫu z0 cӫa dãy. Trong trѭӡng hӧp z0 < 1, giá trӏ z0 càng nhӓ thì dãy (zn) tiӃn ÿӃn 0 càng
nhanh. Ngѭӧc lҥi khi z0 > 1, giá trӏ z0 càng lӟn thì dãy (zn) càng tiӃn nhanh ra f.
Trong trѭӡng hӧp tәng quát, dãy (zn) ÿѭӧc xác ÿӏnh bӣi công thӭc (1) ӣ trên rҩt khó
khҧo sát vӅ mһt lý thuyӃt. ChӍ ÿӃn năm 1979, Mandelbrot mӟi thành công trong viӋc quan
sát dãy này vӟi sӵ hӛ trӧ cӫa máy tính ÿiӋn tӱ. KӃt quҧ ÿѭӧc Mandelbrot quan sát thҩy là
mӝt trong nhӳng cҩu trúc fractal phӭc tҥp và ÿҽp. Nó ÿã ÿѭӧc ÿһt tên Mandelbrot ÿӇ ghi
nhӟ công lao cӫa tác giҧ, ngѭӡi ÿã khai sinh ra lý thuyӃt hình hӑc phân hình.
9.4.2. CÔNG THӬC TOÁN HӐC
Ký hiӋu zn = ( xn , yn), c = (p,q), trong ÿó:
xn = Re(zn), p = Re(c), yn = Im(zn), q = Im(c), n t 0 thì hӋ thӭc truy hӗi xác ÿӏnh ӣ
(1) có thӇ ÿѭӧc viӃt lҥi theo dҥng ÿѫn giҧn hѫn nhѭ sau:
xn+1 = xn2 –– yn2 + p
yn+1 = 2xn .yn + q (2)
Ngoài ra khi khҧo sát dãy (zn) ta tìm ÿѭӧc tính chҩt sau:

159
Chѭѫng 9: Hình hӑc Fractal
Tính chҩt vӅ sӵ hӝi tө cӫa dãy (zn):
NӃu tӗn tҥi k  N sao cho | zk | > 2 thì dãy (zn) hӝi tө ÿӃn vô cӵc.
NӃu tӗn tҥi k  N sao cho | zt | < 2, t : k d t d 1, vӟi 1 là hҵng sӕ hӳu hҥn thì cNJng
có | zn | < 2, n t k. (Ký hiӋu | z | chӍ modul cӫa sӕ phӭc z).
9.4.3. THUҰT TOÁN THӆ HIӊN TҰP MANDELBROT
9.4.3.1. Xây d͹ng thu̵t toán:
Tұp Mandelbrot là hình ҧnh cӫa dãy (zn), vӟi giá trӏ khӣi ÿҫu z0 = 0. Khi ÿó màn hình máy
tính sӁ chuyӇn ÿәi thành mӝt mһt phҷng phӭc thu hҽp vӟi:
ƒ Trөc x biӇu diӉn phҫn thӵc cӫa sӕ phӭc c (giá trӏ p ÿѭӧc nêu ӣ phҫn 2/).
ƒ Trөc y biӇu diӉn phҫn ҧo cӫa sӕ phӭc c (giá trӏ q ÿѭӧc nêu ӣ phҫn 2/).
Tӯ tính chҩt vӅ sӵ hӝi tө cӫa dãy (zn) ӣ phҫn 2 chúng ta có thӇ chia tұp các giá trӏ
cӫa c trên mһt phҷng phӭc thành 2 lӟp:
Lӟp 1:
Gӗm các giá trӏ c làm cho dãy (zn) không tiӃn ra vô cӵc mà ÿѭӧc giӟi hҥn trong mӝt
vòng tròn bán kính 2. Mӝt cách cө thӇ, ÿó là các giá trӏ c sao cho khi xuҩt phát tӯ chúng,
ta luôn có | zi | < 2, i = 1, 2, ……, l, trong ÿó l do ta chӑn trѭӟc. ĈӇ ý là giá trӏ l càng lӟn
thì tính hӝi tө cӫa dãy (zn) tѭѫng ӭng vӟi mӝt giá trӏ cө thӇ càng ÿѭӧc kiӇm tra chһt chӁ và
chính xác. Tuy nhiên khi ÿó thӡi gian tính toán ÿӇ xác ÿӏnh tính hӝi tө sӁ tăng lên gҩp
nhiӅu lҫn.
Lӟp 2:
Gӗm các giá trӏ phӭc c làm cho dãy (zn) hӝi tө vӅ vô cӵc. Cө thӇ ÿó là các giá trӏ c
khӣi ÿҫu dүn ÿӃn | zn | > 2 ӣ mӝt ngѭӥng k hӳu hҥn nào ÿó.
Vҩn ÿӅ ÿһt ra ӣ ÿây là cҫn quan sát tính hӛn ÿӝn cӫa dãy (zn). Do ÿó chúng ta tұp
trung các quan sát vào các giá trӏ c thuӝc lӟp 2. Muӕn nhѭ vұy các giá trӏ này phҧi ÿѭӧc
thӵc hiӋn mӝt cách nәi bұt trên màn hình máy tính bӣi các màu khác nhau. Chúng ta sӁ tô
màu mһt phҷng phӭc màn hình theo qui tҳc sau:
ƒ Các giá trӏ c thuӝc lӟp 1 ÿѭӧc tô màu ÿen vì không có tính chҩt gì ÿáng chú ý.
ƒ Các giá trӏ c thuӝc lӟp 2 ÿѭӧc tô bҵng các màu khác nhau ӭng vӟi các ngѭӥng tiӃn
ra vô hҥn k khác nhau. Do sӕ lѭӧng màu có thӇ hiӇn thӏ trên mӝt màn hình ÿӗ hoҥ
là hӳu hҥn, viӋc tô màu các giá trӏ này sӁ ÿѭӧc thӵc hiӋn theo kӻ thuұt tô màu xoay
vòng ÿѭӧc chӍ ra ӣ các phҫn tiӃp sau ÿây.
9.4.3.2. Thu̵t toán t͝ng quát ÿ͋ th͋ hi͏n t̵p Mandelbrot:
Thuұt toán gӗm các bѭӟc sau:
Bѭӟc 1:
Xuҩt phát vӟi mӝt giá trӏ khӣi ÿҫu c = (p,q).
Bѭӟc 2:
KiӇm tra c thuӝc lӟp 1 hay lӟp 2.
Bѭӟc 3:
160
Chѭѫng 9: Hình hӑc Fractal
NӃu c thuӝc lӟp 1 thì tô ÿiӇm ҧnh tѭѫng ӭng vӟi c trên màn hình bҵng màu ÿen,
ngѭӧc lҥi tô ÿiӇm ҧnh này bӣi màu tѭѫng ӭng xác ÿӏnh tӯ kӻ thuұt tô xoay vòng.
Bѭӟc 4:
Chӑn mӝt giá trӏ c mӟi và trӣ lҥi bѭӟc 1 cho ÿӃn khi quét hӃt toàn bӝ giá trӏ c cҫn
khҧo sát (ÿôi khi chúng ta không cҫn khҧo sát toàn bӝ mà chӍ khҧo sát mӝt miӅn con ÿѭӧc
yêu cҫu cӫa mһt phҷng phӭc). Khi ÿó thuұt toán kӃt thúc.

Hình 9.11 tұp Mandelbrot


9.5. TҰP JULIA
9.5.1. Ĉһt vҩn ÿӅ:
Ĉӕi vӟi biӇu thӭc zn+1 = zn2 + c, ngoài hѭӟng ÿã khҧo sát nhѭ ÿã trình bày trong phҫn tұp
Mandelbrot, còn có hѭӟng khҧo sát khác bҵng cách cho c cӕ ÿӏnh và xem xét dãy (zn) ӭng
vӟi mӛi giá trӏ khác cӫa z0. Theo hѭӟng này chúng ta sӁ thu ÿѭӧc 1 lӟp các ÿӕi tѭӧng
fractal mӟi ÿѭӧc gӑi là tұp Julia.
Tұp Julia và tұp Mandelbrot là hai lӟp các ÿӕi tѭӧng fractal có mӕi liên hӋ rҩt chһt
chӁ vӟi nhau. Mӝt tính chҩt ÿáng chú ý là tұp Mandelbrot có thӇ xem nhѭ mӝt loҥi ““bҧn
ÿӗ”” Mandelbrot có thӇ cho ra các dҥng tұp Julia ÿҫy sӭc lôi cuӕn. Các vӏ trí nhѭ vұy ÿѭӧc
quan sát thҩy ӣ gҫn biên cӫa tұp Mandelbrot. Nhҩt là gҫn các chӓm nhӑn. Ngoài ra khi
phóng to mӝt phҫn cӫa tұp Mandelbrot, ta sӁ thu ÿѭӧc mӝt hình rҩt giӕng vӟi tұp Julia
ÿѭӧc tҥo bӣi giá trӏ cӫa tâm phҫn ÿѭӧc phóng to.
9.5.2. Công thӭc toán hӑc:
ĈӇ thӇ hiӋn tұp Julia trên màn hình máy tính, ta vүn sӱ dөng các công thӭc nhѭ trong phҫn
tұp Mandelbrot, nhѭ là:
xn+1 = xn2 –– yn2 + p
yn+1 = 2xnyn + q
Ngoài ra các tính chҩt ÿã nêu vӅ giӟi hҥn cӫa dãy (z0) vүn ÿѭӧc sӱ dөng cho tұp
Julia.
9.5.3. Thuұt toán thӇ hiӋn tұp Julia
ĈiӇm khác biӋt so vӟi tұp Mandelbrot ӣ ÿây là giá trӏ p và q ÿѭӧc giӳ cӕ ÿӏnh, mһt
phҷng màn hình biӃn ÿәi thành mһt phҷng phӭc thu hҽp biӇu diӉn các giá trӏ cӫa x0 vӟi:
161
Chѭѫng 9: Hình hӑc Fractal
Trөc x biӇu diӉn phҫn thӵc cӫa sӕ phӭc z0.
Trөc y biӇu diӉn phҫn ҧo cӫa sӕ phӭc z0.
Ngoài ra còn có sӵ phân lӟp các giá trӏ cӫa z0 nhѭ sau:
Lӟp 1:
Bao gӗm các giá trӏ (z0) có | zk | < 2, vӟi 0 d k d N trong ÿó N là hҵng sӕ hӳu hҥn.
Tӭc là lӟp 1 gӗm các giá trӏ z0 làm cho dãy (z0) không tiӃn ra vô cӵc.
Lӟp 2:
Bao gӗm các giá trӏ (z0) có | zn | > 2, vӟi n t k, k  Z+, tӭc là gӗm các giá trӏ làm cho
dãy (zn) tiӃn ra vô cӵc.
Ngѭӧc lҥi vӟi tұp Mandelbrot, khi thӇ hiӋn tұp Julia trên màn hình, chúng ta quan
tâm ÿӃn các giá trӏ z0 làm cho dãy (zn) không hӝi tө ÿӃn vô cӵc. Do ÿó kӻ thuұt tô màu cӫa
tұp Julia vүn là kӻ thuұt xoay vòng nhѭng hoàn toàn ngѭӧc lҥi vӟi kӻ thuұt tô màu tұp
Mandelbrot. Trong kӻ thuұt tô màu này:
Các ÿiӇm ҧnh tѭѫng ӭng vӟi các giá trӏ z0 thuӝc lӟp 1, sӁ ÿѭӧc gán màu tùy thuӝc ÿӝ
lӟn cӫa | zl| vӟi l là ngѭӥng quyӃt ÿӏnh hӝi tө cӫa dãy (zn) ÿã nêu trong ÿӏnh nghƭa vӅ lӟp
1.
Các ÿiӇm ҧnh tѭѫng ӭng vӟi giá trӏ z0 thuӝc lӟp 2 sӁ ÿѭӧc gán màu trùng vӟi màu
nӅn cӫa bҧng màu ÿang sӱ dөng.
Vӟi các thay ÿәi nhѭ vұy, tұp Julia sӁ ÿѭӧc thӇ hiӋn bҵng thuұt toán trình bày nhѭ
sau:
Thuұt toán tәng quát ÿӇ thӇ hiӋn tұp Julia:
Gӗm các bѭӟc sau:
Bѭӟc 1:
Xuҩt phát vӟi 1 giá trӏ khӣi ÿҫu z0 = (x0, y0) và giá trӏ cӕ ÿӏnh c = (p, q).
Bѭӟc 2:
KiӇm tra z0 thuӝc lӟp 1 hay 2.
Bѭӟc 3:
Tô màu ÿiӇm ҧnh tѭѫng ӭng vӟi z0 theo kӻ thuұt tô màu ÿѭӧc nêu ӣ trên.
Bѭӟc 4:
Chӑn giá trӏ z0 mӟi và lһp lҥi bѭӟc 1 cho ÿӃn khi ÿã quét hӃt tҩt cҧ các giá trӏ z0 cҫn
khҧo sát.

162
Chѭѫng 9: Hình hӑc Fractal

Hình 9.12 Minh hoҥ tұp Julia


9.6. HӐ CÁC ĈѬӠNG CONG PHOENIX
Hӑ các ÿѭӡng cong Phoenix do Shigehiro Ushiki ӣ trѭӡng ÿҥi hӑc Kyoto tìm ra. Phѭѫng
trình cӫa ÿѭӡng cong ÿѭӧc xác ÿӏnh bӣi:
Zn+1 = zn2 + p + q.zn-1
Trong ÿó:
Zi  C i, N.
p = (p, 0) C.
q = (q, 0)  C.
Phѭѫng trình ÿѭӧc khai triӇn thành các phҫn thӵc và ҧo cӫa zn có dҥng:
xn+1 = xn2 –– yn2 + p + q.xn-1
yn+1 = 2xn.yn + q.yn-1
vӟi: xn+1 = Re(zn+1);
yn+1 = Im(zn+1).
Khi ÿó viӋc thӇ hiӋn ÿѭӡng cong này lên màn hình gҫn giӕng vӟi viӋc thӇ hiӋn tұp
Julia. Tuy nhiên có hai ÿiӇm thay ÿәi quan trӑng:
Thay ÿәi 1:
Trөc x cӫa màn hình biӇu thӏ phҫn ҧo cӫa sӕ phӭc z0.
Trөc y cӫa màn hình biӇu thӏ phҫn thӵc cӫa sӕ phӭc z0.
Ӣ ÿây chúng ta ÿҧo ngѭӧc các trөc thӵc và ҧo cӫa mһt phҷng phӭc thông thѭӡng là
ÿӇ thӇ hiӋn hình ҧnh theo chiӅu ÿӭng chӭ không phҧi chiӅu ngang. Hình 14.1 trình bày 1
loҥi ÿѭӡng cong loҥi này vӟi yêu cҫu rõ ràng là phҧi ÿәi vai trò cӫa trөc x và y ÿӇ hình
ҧnh có thӇ ÿѭӧc thӇ hiӋn tӕt trên màn hình. Do ÿó tѭѫng ӭng vӟi mӝt ÿiӇm ҧnh (Col,
Row) trên màn hình sӁ là sӕ phӭc z = (x, y) có dҥng:
x = ymax –– Row * 'x;
y = ymin –– Col * 'y;
163
Chѭѫng 9: Hình hӑc Fractal
Vӟi:
y max  y
'x min
Max _ Row
xmax  x
'y min
Thay ÿәi 2: Max _ Col
Thay ÿәi vӅ thuұt toán tô màu. Ӣ ÿây vӟi các ÿiӇm thuӝc lӟp 1 (theo ÿӏnh nghƭa ÿã
nêu ӣ phҫn vӅ tұp Julia) chúng ta sӁ sӱ dөng 3 loҥi màu tuǤ theo ngѭӥng hӝi tө:
Màu 1: ÿѭӧc sӱ dөng ÿӇ tô các ÿiӇm z0 cho ra giá trӏ | zk | < 2 vӟi tӕi ÿa k = 32 lҫn
lһp.
Màu 2: ÿѭӧc sӱ dөng ÿӇ tô các ÿiӇm z0 cho ra giá trӏ | zk | < 2 vӟi sӕ lҫn lһp tӯ 33
ÿӃn 64.
Màu 3: ÿѭӧc sӱ dөng ÿӇ tô các ÿiӇm z0 cho ra giá trӏ | zk | < 2 vӟi sӕ lҫn lһp vѭӧt quá
64 lҫn.
Còn ÿӕi vӟi các ÿiӇm thuӝc lӟp 2, chúng ta sӁ tô chúng bҵng mӝt màu khác vӟi màu
nӅn hiӋn tҥi.
Vӟi các thay ÿәi nhѭ vұy, ÿoҥn mã dùng xác ÿӏnh giá trӏ z0 thuӝc lӟp 1 hay 2, cùng
vӟi kӻ thuұt tô màu ÿiӇm ҧnh sӁ ÿѭӧc viӃt dѭӟi dҥng:
for(Col = 0; Col<Max_Col; ++Col) {
for(Row=0; Row<= Max_Row; ++Row){
xn = ymax - Row* ǻx;
yn = xmin + Col* ǻy;
X =Y= 0;
Count = 0;
While((Count < Max_Iterations) & (X+Y < 4)){
X = x n2 ;
Y = y n2 ;
yn+1 = 2xnyn + q yn-1;
yn-1 = yn ;
xn+1 = X–– Y + qxn-1 + p;
xn-1 = xn;
xn = xn+1;
yn = yn+1;
++Count;
}
if(Count > Max_Iterations)
Tô màu ÿiʀm ɠnh (Col, Row) bɮng màu dành cho các ÿiʀm loɞi 2;
else
if (Count >= 64)
Tô màu ÿiӅm (Col, Row) bҳng màu 3;
else
if (Color >= 32)
Tô ÿiӅm ҥnh (Col, Row) bҳng màu 2;
else
Tô ÿiӅm ҥnh (Col, Row) bҳng màu 1;
}
}

164
Chѭѫng 9: Hình hӑc Fractal
Ĉây là ҧnh cӫa ÿѭӡng cong Phoenix

Hình 9.13 Ĉѭӡng cong Phoenix

Bài tұp
1. ViӃt chѭѫng trình sinh ÿѭӡng C_curve.
2. ViӃt chѭѫng trình sinh ÿѭӡng Dragons.
3. ViӃt chѭѫng trình sinh ÿѭӡng Kon.
4. ViӃt chѭѫng trình sinh ÿѭӡng Mandelbrot.
5. ViӃt chѭѫng trình sinh ÿѭӡng Pythagoras.

165
Mөc lөc

PHӨ LӨC

Hѭӟng dүn sӱ dөng thѭ viӋn ÿӗ hoҥ trong C/C++ hay BC


1. Yêu cҫu
Phҧi có tұp tin ÿiӅu khiӇn màn hình EGAVGA.BGI (thông thѭӡng tӋp này thѭӡng
nҵm trong thѭ mөc \BC\BGI hay TC\BGI khi cài ÿһt).
NӃu chúng ta có sӱ dөng tӟi font chӳ thì cҫn phҧi có thêm các file (*.CHR) nhѭ:
GOTH.CHR (chӳ Gothic), LITT.CHR (chӳ Small Font), SANS.CHR (chӳ Sans Serif),
TRIP.CHR (chӳ cao gҩp 3).
ĈӇ dùng ÿѭӧc thѭ viӋn các hàm ÿӗ hoҥ cҫn có dòng lӋnh:
#include <graphics.h> và ÿһt mөc chӑn Graphics library là ON ([x] trong menu
Options/Linker/Libraries.
Khi cҫn tham khҧo cú pháp, cách sӱ dөng cӫa bҩt kǤ mӝt hàm ÿӗ hoҥ nào, ÿѭa con
trӓ vӅ tên hàm trong chѭѫng trình sau ÿó nhҩn tә hӧp phím CTRL+F1. Muӕn tham khҧo
danh sách toàn bӝ các hàm cӫa thѭ viӋn ÿӗ hoҥ nhҩn tә hӧp phím CTRL+F1 ngay tҥi
dòng chӳ <graphics.h>.
2. Khӣi tҥo và ÿóng chӃ ÿӝ ÿӗ hoҥ
Ĉӝ phân giҧi cӫa màn hình ÿѭӧc ÿo bҵng sӕ ÿiӇm theo chiӅu ngang nhân vӟi sӕ
ÿiӇm theo chiӅu dӑc cӫa màn hình ÿӗ hoҥ. Toҥ ÿӝ gӕc cӫa màn hình ÿӗ hoҥ (0,0) là ÿiӇm
nҵm tҥi góc trên cùng phía bên trái. Mӛi kiӇu ÿӗ hoҥ dùng mӝt hӋ toҥ ÿӝ riêng. HӋ toҥ ÿӝ
cho màn hình VGA là 640x480.
Khӣi ÿӝng ÿӗ hoҥ vӟi màn hình ngҫm ÿӏnh:
#include <graphics.h>
void main(void){
int gdriver, gmode, errocode;
gdriver = DETECT;//ngҩm ÿӍnh
initgraph(&gdriver,&gmode,””C:\TC\BGI““); //tìm mode màn hình trong
thѬ mӧc BGI
errorcode = graphresult();
if (errorcode !=grOk) {
printf(““\n Không khӡi tңo ÿѬӥc””);
getch();exit(1);
}
...................// Các thao tác ÿӕ hoң tiӁp theo
closegraph();
}
Ví dө: viӃt chѭѫng trình hai ÿѭӡng thҷng cҳt nhau
#include <conio.h>
#include <graphics.h>
#include <math.h>
// hӉ sӓ ÿӗi tӭ ÿӛ sang radian
#define RADS 0.017453293

166
Mөc lөc
void giaodiem(double x1, double y1, double x2, double y2,
double a1, double b1, double a2, double b2) {
double dx, dy, da, db, x, y, t, tich;
dx = x2 - x1;
dy = y2 - y1;
da = a2 - a1;
db = b2 - b1;
tich = db * dx - da * dy;
if (tich != 0) {
t = ((a1 - x1) * dy - (b1 - y1) * dx) / tich;
if (t>=0.0 && t<=1.0) {
x = t * (a2 - a1) + a1;
y = t * (b2 - b1) + b1;
line(x1, y1, x2, y2);
line(a1, b1, a2, b2);
setfillstyle(SOLID_FILL, RED);
fillellipse(x, y, 3, 3);
}
}
}
void main() {
int gr_drive = DETECT, gr_mode;
double x1, y1, x2, y2, a1, b1, a2, b2;
printf("\nNhap vao toa do doan thang thu nhat: ");
scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
printf("\nNhap vao toa do doan thang thu hai: ");
scanf("%lf%lf%lf%lf", &a1, &b1, &a2, &b2);
initgraph(&gr_drive, &gr_mode, "");
giaodiem(x1, y1, x2, y2, a1, b1, a2, b2);
getch();
closegraph(); //ÿóng chӁ ÿӛ ÿӕ hoң
}

3. Các hàm cѫ bҧn


3.1. Bҧng màu cӫa màn hình ÿӗ hoҥ.
Setbkcolor(int color) thiӃt lұp màu nӅn cho màn hình ÿӗ hoҥ
setcolor(int color) ÿһt màu vӁ cho nét vӁ hiӋn tҥi
getmaxcolor() lҩy sӕ màu cao nhҩt ÿѭӧc sӱ dөng trong chӃ ÿӝ ÿӗ hoҥ hiӋn tҥi
setallpalette(struct palettetype far sӁ làm thay ÿәi toàn bӝ màu trong bҧng màu palette
*palette)
setpalette( int colox, int colory) sӁ làm thay ÿәi màu thӭ colorx thành màu colory
getpalette(struct palettetype far sӁ lҩy lҥi giá trӏ cӫa palette ÿang dùng
*palette)
textheight(““W””) lҩy chiӅu cao cӫa dòng văn bҧn
outextxy(int x, int y, char * msg) ChӍ thӏ ÿѭa xâu kí tӵ msg ra màn hình ÿӗ hoҥ tҥi vӏ trí (x,y)

167
Mөc lөc
3.2. ĈiӇm
Ĉѫn giҧn nhҩt chính là ÿiӇm, mӑi ÿӕi tѭӧng khác ÿӅu ÿѭӧc xây dӵng nên tӯ ÿiӇm.
int getmaxx() Sӕ chҩm ÿiӇm lӟn nhҩt theo chiӅu ngang trong chӃ ÿӝ ÿӗ hoҥ hiӋn tҥi
int getmaxy() Sӕ chҩm ÿiӇm lӟn nhҩt theo chiӅu dӑc trong chӃ ÿӝ ÿӗ hoҥ hiӋn tҥi
putpixel( x, y, color) ĈӇ vӁ mӝt ÿiӇm sáng lên màn hình tҥi ÿiӇm (x, y) có màu color
getpixel(x,y) nhұn biӃt màu hiӋn tҥi cӫa ÿiӇm (x, y)
3.3. Ĉѭӡng
Các hàm cho ÿѭӡng:
moveto(int x, int y) di chuyӇn vӏ trí con trӓ hiӋn tҥi cӫa màn hình ÿӗ hoҥ tӟi toҥ ÿӝ (x,y)
getx(), gety() lҩy toҥ ÿӝ cӫa con trӓ hiӋn tҥi theo chiӅu ngang và chiӅu dӑc màn hình ÿӗ
hoҥ
lineto(int x, int y) vӁ mӝt ÿѭӡng thҷng tӯ vӏ trí con trӓ hiӋn tҥi tӟi vӏ trí có toҥ ÿӝ (x, y) trên
màn hình ÿӗ hoҥ
line(int x1, int y1, int x2, VӁ mӝt ÿѭӡng thҷng tӯ toҥ ÿӝ (x1,y1) ÿӃn toҥ ÿӝ (x2, y2) trên màn hình
int y2) ÿӗ hoҥ. Ĉѭӡng thҷng mӟi ÿѭӧc vӁ không phө thuӝc vào vӏ trí hiӋn thӡi cӫa
con trӓ màn hình
linerel(int dx, int dy) VӁ mӝt ÿoҥn thҷng tӯ vӏ trí con trӓ hiӋn tҥi tӟi vӏ trí (x +dx, y+dy). Sau khi
vӁ con trӓ chuyӇn tӟi vӏ trí mӟi (x+dx, y+dy)
3.4. Hình chӳ nhұt
rectangle(int x1, int y1, int x2, int y2) vӁ hình chӳ nhұt có toҥ ÿӝ phía góc trên bên
trái là (x1, y1) và góc dѭӟi bên phҧi có toҥ ÿӝ (x2,y2).
bar(int x1, int y1, int x2, int y2) vӁ hình chӳ nhұt có tô màu phía trong. Hai chӍ thӏ
rectangle và bar khác nhau ӣ chӛ rectangle chӍ tҥo nên mӝt hình chӳ nhұt vӟi ÿѭӡng viӅn
bao quanh.
bar3d(int x1,int y1,int x2,int y2,int depth, int top) vӁ khӕi hӝp chӳ nhұt, mһt ngoài
cӫa nó là hình chӳ nhұt xác ÿӏnh bӣi các toҥ ÿӝ (x1,y1,x2,y2) hình chӳ nhұt này ÿѭӧc tô
màu, depth là chiӅu sâu cӫa khӕi 3 chiӅu, top nhұn giá trӏ 1 hoһc 0 ÿӇ khӕi 3 chiӅu có nҳp
hay không có nҳp.
3.5. Hình tròn
Tҩt cҧ các hàm dѭӟi ÿây, góc tính theo ÿӝ và giá trӏ tӯ 00 ÿӃn 3600 .
arc(int x, int y, int gd,int gc,int r) vӁ cung tròn có (x,y) tӑa ÿӝ tâm tròn, r bán kính,
gd góc ÿҫu, gc góc cuӕi.
circle( int x, int y, int r) là hàm vӁ hình tròn có tâm tҥi ÿiӇm (x,y) vӟi bán kính r.
ellipse(int x, int y,int gd, int gc,int xr, int yr) vӁ 1 hình ellipse có (x,y) toҥ ÿӝ tâm
cung, gd góc ÿҫu, gc góc cuӕi, xr là bán trөc ngang, yr là bán trөc ÿӭng.
pieslice(int x, int y, int gd, int gc, int r) vӁ và tô màu hình quҥt có (x,y) là toҥ ÿӝ tâm
quҥt, gd là góc ÿҫu, gc là góc cuӕi, r là bán kính.

168
Mөc lөc
3.6. Ĉa giác
drawpoly(int numpoints, int far *polypoints) sӁ vӁ nên mӝt ÿѭӡng gҩp khúc bҩt kǤ
vӟi numpoints là sӕ ÿiӇm mà ÿѭӡng gҩp khúc ÿi qua, polypoints (mҧng) toҥ ÿӝ ÿiӇm
(x1,y1,x2,y2....). Khi ÿiӇm cuӕi (xn,yn) trùng vӟi ÿiӇm ÿҫu (x1,y1) thì ÿѭӧc mӝt ÿa giác.
fillpoly(int numpoints, int *polypoints) sӁ tô màu ÿa giác bҵng màu hiӋn thӡi.
setfillstyle(int pattern, int color) dùng ÿӇ xác ÿӏnh mүu tô cho ÿa giác, trong ÿó mүu
tô là các hҵng sӕ nguyên ÿѭӧc ÿӏnh nghƭa nhѭ sau:
Tên hҵng mүu Giá trӏ Mô tҧ
EMPTY_FILL 0 Tô bҵng màu nӅn
SOLID_FILL 1 Tô bҵng nét liӅn
LINE_FILL 2 Tô ------
LTSLASH_FILL 3 Tô ////
SLASH_FILL 4 Tô ///// in ÿұm
BKSLASH_FILL 5 Tô \\\\\ in ÿұm
LTBKSLASH_FILL 6 Tô \\\\
HATCH_FILL 7 Tô ÿѭӡng gҥch bóng nhҥt
XHATCH_FILL 8 Tô ÿѭӡng gҥch bóng chӳ thұp
INTERLEAVE_FILL 9 Tô ÿѭӡng ÿӭt quãng
WIDE_DOT_FILL 10 Tô bҵng dҩu chҩm thѭa
CLOSE_DOT_FILL 11 Tô bҵng dҩu chҩm dày
3.7. Văn bҧn
outtext( char far *textstring) sӁ hiӇn thӏ nӝi dung xâu textstring tҥi vӏ trí hiӋn thӡi
cӫa màn hình ÿӗ hoҥ.
outtextxy(int x, int y, char far *textstring) hiӇn thӏ nӝi dung xâu textstring tҥi toҥ ÿӝ
(x, y) trong màn hình ÿӗ hoҥ.
settextstyle(int font, int direction, int charzise) dùng ÿӇ xác lұp kiӇu chӳ vӟi các font
chӳ khác nhau.
Trong ÿó int font ÿѭӧc xác lұp thông qua các hҵng sau:
TÊN FONT Giá trӏ Ý nghƭa
DEFAULT_FONT 0 Font 8x8 bit-mapped
TRIPLEX_FONT 1 Stroked triplex font
SMALL_FONT 2 Stroked small font
SANS_SERIF_FONT 3 Stroked sans-serif font
GOTHIC_FONT 4 Stroked gothic font

169
Mөc lөc
int direction ÿѭӧc xác ÿӏnh nӃu HORIZ_DIR = 0 là nҵm ngang tӯ trái qua phҧi,
VERT_DIR =1 là thҷng ÿӭng tӯ dѭӟi lên trên.
int charsize nhұn giá trӏ tӯ 1 ÿӃn 10 là hӋ sӕ phóng ÿҥi chӳ.
settextjustification( int hoz, int vert) xác ÿӏnh vӏ trí dòng văn bҧn ÿѭӧc ÿѭa ra màn
hình ÿӗ hoҥ bӣi outtext() và outtextxy().
Trong ÿó int hoz có thӇ nhұn mӝt trong các hҵng sau:
LEFT_TEXT =0 văn bҧn xuҩt hiӋn phía bên trái con trӓ màn hình ÿӗ hoҥ
CENTER_TEXT =1 văn bҧn xuҩt hiӋn ӣ giӳa vӟi tâm là con trӓ màn hình ÿӗ
hoҥ
RIGHT_TEXT =2 văn bҧn xuҩt hiӋn phía bên phҧi con trӓ màn hình ÿӗ hoҥ
Còn int vert là tham sӕ có thӇ nhұn các giá trӏ sau:
BOOTTOM_TEXT=0 văn bҧn xuҩt hiӋn ӣ phía trên con trӓ
CENTER_TEXT=1 văn bҧn xuҩt hiӋn ӣ quanh con trӓ
TOP_TEXT=2 văn bҧn xuҩt hiӋn ӣ phía dѭӟi con trӓ
textheight(char *s) trҧ vӅ chiӅu cao (theo pixel) cӫa chuӛi do s trӓ tӟi. Vӟi 8x8 bit
map Font và hӋ sӕ khuyӃch ÿҥi chӳ là 1 thì textheight(““H””)=8
textwidth(char *s) trҧ vӅ chiӅu dài cӫa chuӛi tính theo pixel.
3.8. Cӱa sә (viewport)
viewport là 1 vùng hình chӳ nhұt trên màn hình ÿӗ hoҥ giӕng nhѭ window trong
textmode.
setviewport(int x1, int y1, int x2, int y2, int clip) trong ÿó (x1,y1,x2,y2) là góc trái
trên và góc phҧi dѭӟi thoҧ mãn ÿiӅu kiӋn nhѭ sau:
0<=x1 <= x2 và 0<= y1 <= y2
Tham sӕ clip: clip=1 không cho phép vӁ ra ngoài viewport
clip=0 cho phép vӁ ra ngoài viewport
getviewsettings(struct viewporttype *vp) nhүn viewport hiӉn hành,
struct viewporttype {
int left,top,right,bottom;
int clip;
}
clearviewport(void) xoá viewport
cleardevice(void) xoá mӑi thӭ trên màn hình và ÿѭa con trӓ vӅ toҥ ÿӝ (0,0) cӫa màn
hình
Chú ý: nhӡ sӱ dөng viewport ta có thӇ viӃt các chѭѫng trình ÿӗ hoҥ có trөc toҥ ÿӝ,
bҵng cách thiӃt lұp viewport vӟi clip=0 (cho phép vӁ ra ngoài giӟi hҥn)
3.9. Tҥo hình ҧnh chuyӇn ÿӝng
Nguyên sѫ mӟi mà chúng ta sӁ xây dӵng là tҥo hình ҧnh chuyӇn ÿӝng trên màn hình
ÿӗ hoҥ. VӅ nguyên tҳc, ÿӇ có thӇ tҥo nên nhӳng hình ҧnh chuyӇn ÿӝng chúng ta cҫn có
mӝt hình mүu, sau ÿó lѭu hình mүu trên màn hình ÿӗ hoҥ lҥi bҵng chӍ thӏ getimage(int x1,
170
Mөc lөc
int y1, int x2, int y2, void far *bitmap); trong ÿó bitmap là miӅn nhӟ dùng ÿӇ lѭu hình ҧnh
cӫa hình chӳ nhұt có toҥ ÿӝ (x1,y1) và (x2, y2) trên màn hình ÿӗ hoҥ.
ChӍ thӏ getimagesize(int x1, int y1, int x2, int y2) dùng ÿӇ xác ÿӏnh kích thѭӟc bӝ
nhӟ dùng ÿӇ cҩt hình ҧnh giӟi hҥn trong hình chӳ nhұt có toҥ ÿӝ (x1, y1), (x2,y2).
ChӍ thӏ putimage(int x, int y, void far * bitmap, int copymode) dùng ÿӇ khôi phөc
lҥi hình ҧnh ÿã ÿѭӧc cҩt giӳ bҵng getimage(). ChӍ thӏ putimage() kӃt hӧp vӟi chӍ thӏ làm
trӉ (delay() ) sao cho sӕ các hình ҧnh hiӇn thӏ trên màn hình ÿӗ hoҥ khoҧng 24 hình/giây
chúng ta sӁ nhұn ÿѭӧc mӝt hình ҧnh chuyӇn ÿӝng.
Ví dͭ 1: Tҥo hình ҧnh chuyӇn ÿӝng là mӝt mNJi tên.
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define ARROW_SIZE 10
void draw_arrow(int x, int y);
int main(void) {
/* request autodetection */
int gdriver = DETECT, gmode, errorcode;
void *arrow;
int x, y, maxx;
unsigned int size;
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "\\TC\\BGI");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) { /* an error occurred */
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
maxx = getmaxx(); x = 0;
y = getmaxy() / 2;
/* draw the image to be grabbed */
draw_arrow(x, y);
/* calculate the size of the image */
size = imagesize(x, y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE);
/* allocate memory to hold the image */
arrow = malloc(size);
/* grab the image */
getimage(x, y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE, arrow);
/* repeat until a key is pressed */
while (!kbhit()){
/* erase old image */
putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);
x += ARROW_SIZE;
if (x >= maxx)
x = 0;
/* plot new image */
putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);

171
Mөc lөc
}
/* clean up */
free(arrow);
closegraph();
return 0;
}
void draw_arrow(int x, int y) {
/* draw an arrow on the screen */
moveto(x, y);
linerel(4*ARROW_SIZE, 0);
linerel(-2*ARROW_SIZE, -1*ARROW_SIZE);
linerel(0, 2*ARROW_SIZE);
linerel(2*ARROW_SIZE, -1*ARROW_SIZE);
}

Các code chѭѫng trình ví dө cho bài tұp lұp trình


Bài 1: quay ÿӕi tѭӧng
#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
#include<math.h>
#include<alloc.h>
#define RADS 0.017453293
struct point{
int x,y,z;
}
a[4]={
{110,180,80},
{10,200,80},
{120,50,80},
{110,180,250}
};
int noi[4][4];
void Bresenham_Line(int x1,int y1, int x2, int y2, int c){
if(x1 == x2){
int i;
if(y1 < y2)
for(i = y1; i <= y2;i ++){
putpixel(x1,i,c); delay(10);
}
else
for(i = y2; i<= y1; i ++){
putpixel(x1,i,c); delay(10);
}
}
if(y1 == y2){
int i;
if(x1 < x2)
for(i = x1; i <= x2; i ++){
putpixel(i,y1,c);delay(10);

172
Mөc lөc
}
else
for(i = x2; i <= x1; i ++){
putpixel(i,y1,c); delay(10);
}
}
if(x1 < x2){
if(y1 < y2) {
if((y2 - y1)/(x2-x1) < 1){
int i;
int Dx = x2 - x1;
int Dy = y2 - y1;
int p = 2*Dy - Dx;
putpixel(x1,y1,c);
for(i = x1; i < x2; i ++){
if(p < 0)
p += 2*Dy;
else{
p += 2*(Dy - Dx);
y1 ++;
}
x1 ++;
putpixel(x1,y1,c); delay(10);
}
}
else{
int i;
int Dx = x2 - x1;
int Dy = y2 - y1;
int p = 2*Dx - Dy;
putpixel(x1,y1,c);
for(i = y1; i < y2; i ++){
if(p < 0)
p += 2*Dx;
else{
p += 2*(Dx - Dy);
x1 ++;
}
y1 ++;
putpixel(x1,y1,c); delay(10);
}
}
}
if(y1 > y2)
{ if((y2 - y1)/(x2 - x1)> -1 ){
int i;
int Dx = x2 - x1;
int Dy = y2 - y1;
int p = 2*Dy + Dx;
putpixel(x1,y1,c);
for(i = x1; i <= x2; i ++){
if(p > 0)
p += 2*Dy;

173
Mөc lөc
else{
p += 2*(Dy + Dx);
y1-- ;
}
x1 ++;
putpixel(x1,y1,c); delay(10);
}
}
else {
int i;
int Dx = x2 - x1;
int Dy = y2 - y1;
int p = 2*Dx + Dy;
putpixel(x1,y1,c);
for(i = y1; i >= y2; i --){
if(p < 0)
p += 2*Dx;
else{
p += 2*(Dx + Dy);
x1++ ;
}
y1 --;
putpixel(x1,y1,c); delay(10);
}
}
}
}
if(x1 > x2){
if(y1 < y2)
{ if((y2-y1)/(x2-x1) > -1){
int i;
int Dx = x2 - x1;
int Dy = y2 - y1;
int p = -2*Dy - Dx;
putpixel(x1,y1,c);
for(i = x1; i > x2; i --){
if(p < 0){
p=p - 2*Dy - 2*Dx;
y1 ++;
}
else
p =p - 2*Dy;
x1 --;
putpixel(x1,y1,c);delay(10);
}
}
else {
int i;
int Dx = x2 - x1;
int Dy = y2 - y1;
int p = -2*Dx - Dy;
putpixel(x1,y1,c);
for(i = y1; i < y2; i ++){

174
Mөc lөc
if(p < 0)
p -= 2*Dx;
else{
p -= 2*(Dx + Dy);
x1 --;
}
y1 ++;
putpixel(x1,y1,c); delay(10);
}
}
}
if(y1 > y2){
if((y2-y1)/(x2-x1) < 1) {
int i;
int Dx = x2 - x1;
int Dy = y2 - y1;
int p = 2*Dy - Dx;
putpixel(x1,y1,c);
for(i = x1; i > x2; i --){
if(p > 0){
p =p - 2*Dy +2*Dx ;
y1--;
}
else
p -= 2*Dy;

x1 --;
putpixel(x1,y1,c); delay(10);
}
}
else {
int i;
int Dx = x1 - x2;
int Dy = y1 - y2;
int p = 2*Dx + Dy;
putpixel(x1,y1,c);
for(i = y1; i > y2; i --){
if(p < 0) {
p =p - 2*Dx + 2*Dy ;
x1 --;
}
else
p =p - 2*Dx ;
y1 --;
putpixel(x1,y1,c); delay(10);
}
}

}
}
}
void Dothi(){

175
Mөc lөc
Bresenham_Line(getmaxx()/2,getmaxy()/2,getmaxx()-10,getmaxy()/2,15);
Bresenham_Line(getmaxx()/2,10,getmaxx()/2,getmaxy()/2,15);
Bresenham_Line(getmaxx()/2,getmaxy()/2,getmaxx()/2-
170,getmaxy()/2+170,15);
Bresenham_Line(getmaxx()/2-170,getmaxy()/2+170,getmaxx()/2-
170,getmaxy()/2+166,15);
Bresenham_Line(getmaxx()/2-170,getmaxy()/2+170,getmaxx()/2-
163,getmaxy()/2+167,15);
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy(getmaxx()-9,getmaxy()/2+1," ");
outtextxy(getmaxx()-9,getmaxy()/2+10,"y");
outtextxy(getmaxx()/2,10,"-");
outtextxy(getmaxx()/2 - 10,10,"z");
outtextxy(getmaxx()/2-155,getmaxy()/2+170,"x");
}
point Diem3d(int x , int y , int z){
point p;
if(x>=0&&y>=0&&z>=0) {
p.x = int(getmaxx()/2+y - x*cos(RADS*45));
p.y = int(getmaxy()/2-z + x*cos(RADS*45));
}
if(y>=0&&x<0&&z>=0) {
p.x = int(y+getmaxx()/2-x*cos(RADS*45));
p.y = int(getmaxy()/2-z+x*cos(RADS*45));
}
if(x>=0&&y<0&&z>=0) {
p.x = int(getmaxx()/2+y-x*cos(RADS*45));
p.y = int(getmaxy()/2-(z-x*cos(RADS*45)));
}
if(x>=0&&y>=0&&z<0) {
p.x = int(getmaxx()/2+y-x*cos(RADS*45));
p.y = getmaxy()/2-z+x*cos(RADS*45);
}
if(y>=0&&x<0&&z<0) {
p.x = int(getmaxx()/2+y-x*cos(RADS*45));
p.y = int(getmaxy()/2+(-z-x*cos(RADS*45)));
}
if(x>=0&&y<0&&z<0) {
p.x = int(getmaxx()/2+y-x*cos(RADS*45));
p.y = int(getmaxy()/2-z+x*cos(RADS*45));
}
if(z>=0&&y<0&&x<0) {
p.x = int(getmaxx()/2-(-y+x*cos(RADS*45)));
p.y = int(getmaxy()/2-(z-x*cos(RADS*45)));
}
if(x<0&&y<0&&z<0) {
p.x = int(getmaxx()/2+y-x*cos(RADS*45));
p.y = int(getmaxy()/2-z+x*cos(RADS*45));
}
return(p);
}
point hinhchieu(int &x, int &y , int &z , int chieu){
point p;

176
Mөc lөc
if(chieu==1){
p.x =int( getmaxx()/2+y - x*cos(RADS*45));
p.y =int( getmaxy()/2 + x*cos(RADS*45));
}
if(chieu==2){
p.x =int ( getmaxx()/2+y-x*cos(RADS*45)-y);
p.y =int ( getmaxy()/2-z+x*cos(RADS*45));
}
if(chieu == 3){
p.x =int( getmaxx()/2+y-x*cos(RADS*45)+x*sin(RADS*45));
p.y =int( getmaxy()/2-z);
}
return(p);
}
point quay(int &x, int &y, int &z, int goc , int chieu){
point p;
if(chieu==1){
p.x = x*cos(RADS*goc) + z*sin(RADS*goc);
p.z = -x*sin(RADS*goc) + z * cos(RADS*goc);
p.y = y;
}
if(chieu==2){
p.y = y*cos(RADS*goc) - z*sin(RADS*goc);
p.z = y*sin(RADS*goc) + z * cos(RADS*goc);
p.x =x;
}
if(chieu==3) {
p.x = x*cos(RADS*goc)-y*sin(RADS*goc);
p.y = x*sin(RADS*goc)+y*cos(RADS*goc);
p.z = z;
}
return p;
}
void chieumat(point k[],int t, int m ){
int i,j=0;
int n[4][4];
for(i = 0 ; i<4 ; i++)
for(j = 0 ; j<4 ; j++) {
n[i][j]=1;
n[j][i]=1;
}
for(i = 0 ; i< 4 ; i++) {
k[i] = hinhchieu(k[i].x,k[i].y,k[i].z,t);
}
for( i = 0 ; i< 4 ; i++)
for( j = 0 ; j< 4 ; j++){
if(i!=j&&n[i][j]==1&&n[j][i]==1){
Bresenham_Line(k[i].x,k[i].y,k[j].x,k[j].y,m);
n[i][j]=0;
n[j][i]=0;
}
}
}

177
Mөc lөc
void main(){
clrscr();
point b[4],c[4],l[4];
int j=0;
int goc[2]={45,35};
int driver = DETECT, mode;
initgraph(&driver,&mode,"c:\\tc\\bgi");
Dothi();
for(int i = 0; i < 4; i ++)
b[i] = Diem3d(a[i].x,a[i].y,a[i].z);
for( i = 1; i < 4; i ++ ){
Bresenham_Line(b[j].x,b[j].y,b[i].x,b[i].y,10);
}
Bresenham_Line(b[1].x,b[1].y,b[2].x,b[2].y,10);
Bresenham_Line(b[1].x,b[1].y,b[3].x,b[3].y,10);
Bresenham_Line(b[2].x,b[2].y,b[3].x,b[3].y,10);
settextjustify(LEFT_TEXT,RIGHT_TEXT);
printf("\nQuay quanh truc : oy goc 45");
printf("\nQuay quanh truc : ox goc 35.5");
for( i = 0 ; i< 4 ; i++){
c[i] = quay(a[i].x , a[i].y , a[i].z , goc[1] ,1);
}
for(i = 0 ; i< 4 ; i++) {
c[i] = quay(c[i].x,c[i].y,c[i].z,goc[2],2);
}
for(i = 0; i< 4; i ++)
l[i] = c[i];
for( i = 0; i < 4; i ++)
c[i] = Diem3d(c[i].x,c[i].y,c[i].z);
outtextxy(10,110,"Chon mat chieu: ");
outtextxy(10,120,"xoy: Bam so 1.");
outtextxy(10,130,"xoz: Bam so 2.");
outtextxy(10,140,"yoz: Bam so 3.");
outtextxy(10,150,"Bam so 4 de ket thuc");
char m;
do{
m = getch();
for(i = 0;i < 4; i ++)
c[i] = l[i];
switch (m){
case '1' :{
chieumat(c,1,5);
break;
}
case '2' :{
chieumat(c,2,7);
break;
}
case '3' : {
chieumat(c,3,9) ;
break;
}
}

178
Mөc lөc
}while( m !='4');
closegraph();
}
Bài 2: xén tӍa
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <stdlib.h>
#define ROUND(a) ((double)(a+0.5)
#define TRUE 1
#define FALSE 0
int cliptest(double p, double q, double *u0, double *u1){
double r;
int retVal = TRUE;
if (p < 0.0){
r = q / p;
if (r > *u1)
retVal = FALSE;
else
if (r > *u0)
*u0 = r;
}
else
if ( p > 0.0){
r = q / p;
if (r < *u0)
retVal = FALSE;
else
if (r < *u1)
*u1 = r;
}
else{
if (q < 0.0)
retVal = FALSE;
}
return (retVal);
}
void clipline(double x1, double y1, double x2, double y2,
double xmin, double ymin, double xmax, double ymax){
double u0 = 0.0, u1 = 1.0, dx, dy;
double oldx1, oldy1, oldx2, oldy2;
oldx1 = x1;
oldy1 = y1;
oldx2 = x2;
oldy2 = y2;
dx = x2 - x1;
if (cliptest(-dx, x1 - xmin, &u0, &u1))
if (cliptest(dx, xmax-x1, &u0, &u1)){
dy = y2 - y1;
if (cliptest(-dy, y1 - ymin, &u0, &u1))
if (cliptest(dy, ymax - y1, &u0, &u1)){
if (u1 < 1.0){
x2 = x1 + u2 * dx;
179
Mөc lөc
y2 = y1 + u2 * dy;
}
if (u0 > 0.0){
x1 += u0 * dx;
y1 += u0 * dy;
}
setcolor(RED);
line(oldx1, oldy1, x1, y1);
line(x2, y2, oldx2, oldy2);
setcolor(YELLOW);
line(x1, y1, x2, y2);
}
}
}
void main(){
int gr_drive = DETECT, gr_mode;
char c;
double x1, y1, x2, y2;
initgraph(&gr_drive, &gr_mode, "");
rectangle(100,50, getmaxx()-100, getmaxy()-50);
randomize();
outtextxy(100, getmaxy()-10, "Nhan phim bat ky de sinh duong khac;
ESC de thoat");
do {
x1 = random(getmaxx() / 2);
y1 = random(getmaxy());
x2 = getmaxx()/2 + random(getmaxx() / 2);
y2 = random(getmaxy());
clipline(x1, y1, x2, y2, 100, 50, getmaxx()-100, getmaxy()-50);
c = getch();
} while (c != 27);
closegraph();
}
Bài 3: Phép chiӃu
#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
#include<math.h>
#include<alloc.h>
#define RADS 0.017453293
struct point{
int x,y,z;
}
a[8]={
{30,100,50},
{30,230,50},
{30,230,90},
{30,100,90},
{120,100,50},
{120,230,50},
{120,230,90},
180
Mөc lөc
{120,100,90}

}
int n = 3,*d;
int noi[20][20];
void Dothi(){
line (getmaxx()/2,getmaxy()/2,getmaxx()-10,getmaxy()/2);
line (getmaxx()/2,10,getmaxx()/2,getmaxy()/2);
line (getmaxx()/2,getmaxy()/2,getmaxx()/2-170,getmaxy()/2+170);
line (getmaxx()/2-170,getmaxy()/2+170,getmaxx()/2-
170,getmaxy()/2+166);
line (getmaxx()/2-170,getmaxy()/2+170,getmaxx()/2-
163,getmaxy()/2+167);
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy(getmaxx()-9,getmaxy()/2+1,"0");
outtextxy(getmaxx()-9,getmaxy()/2+10,"y");
outtextxy(getmaxx()/2,10,"-");
outtextxy(getmaxx()/2 - 10,10,"z");
outtextxy(getmaxx()/2-155,getmaxy()/2+170,"x");
}
point Diem3d(int &x, int &y, int &z){
point p;
p.x = int(getmaxx()/2+ y - x*cos(RADS*45));
p.y = int(getmaxy()/2 - z + x*cos(RADS*45));
return p;
}
point chance(int &x , int &y , int &z){
point p;
if(x>=0&&y>=0&&z>=0){
p.x = getmaxx()/2+y - x*cos(RADS*45);
p.y = getmaxy()/2-z + x*cos(RADS*45);
}
if(y>=0&&x<0&&z>=0){
p.x = y+getmaxx()/2-x*cos(RADS*45);
p.y = getmaxy()/2+z-x*cos(RADS*45);
}
if(x>=0&&y<0&&z>=0){
p.x = getmaxx()/2+y-x*cos(RADS*45);
p.y = getmaxy()/2-(z-x*cos(RADS*45));
}
if(x>=0&&y>=0&&z<0){
p.x = getmaxx()/2+(sqrt(pow(x,2)+pow(y,2)))*cos(RADS*45);
p.y = getmaxy()/2+(sqrt(pow(x,2)+pow(y,2)))*cos(RADS*45)-z;
}
if(y>=0&&x<0&&z<0){
p.x = getmaxx()/2+y-x*cos(RADS*45);
p.y = getmaxy()/2+(-z-x*cos(RADS*45));
}
return(p);
}
point hinhchieu(int &x, int &y , int &z , int chieu){
point p;
if(chieu==1){

181
Mөc lөc
p.x =int( getmaxx()/2+y - x*cos(RADS*45));
p.y =int( getmaxy()/2+x*cos(RADS*45));
}
if(chieu==2){
p.x =int ( getmaxx()/2+y-x*cos(RADS*45)-y);
p.y =int ( getmaxy()/2-z+x*cos(RADS*45));
}
if(chieu == 3){
p.x =int( getmaxx()/2+y-x*cos(RADS*45)+x*sin(RADS*45));
p.y =int( getmaxy()/2-z);
}
return(p);
}
point quay(int &x, int &y, int &z, int goc , int chieu){
point p;
if(chieu==1){
p.x = x*cos(RADS*goc) + z*sin(RADS*goc);
p.z = -x*sin(RADS*goc) + z * cos(RADS*goc);
p.y = y;
}
if(chieu==2){
p.y = y*cos(RADS*goc) - z*sin(RADS*goc);
p.z = y*sin(RADS*goc) + z * cos(RADS*goc);
p.x =x;
}
if(chieu==3){
p.x = x*cos(RADS*goc)-y*sin(RADS*goc);
p.y = x*sin(RADS*goc)+y*cos(RADS*goc);
p.z = z;
}
return p;
}
void chieumat(point k[],int t, int &m ){
int i,j;
for(i = 0 ; i< 8 ; i++)
k[i] = hinhchieu(k[i].x,k[i].y,k[i].z,t);
for( i = 0 ; i< 8 ; i++)
for( j = 0 ; j< 8 ; j++){
if(noi[i][j]==1&&noi[j][i]==1){
Bresenham_Line(k[i].x,k[i].y,k[j].x,k[j].y,m);
}
}
noi[0][3]=1,noi[3][0]=1;
noi[4][7]=1,noi[7][4]=1;
noi[3][7]=1,noi[7][3]=1;
}
void main(){
clrscr();
d = &n;
point b[8],g[3][8],c[8],l[8];
int t, goc ;
int driver = DETECT, mode;
initgraph(&driver,&mode,"c:\\tc\\bgi");

182
Mөc lөc
Dothi();
for(int i = 0; i < 8; i ++)
b[i] = Diem3d(a[i].x,a[i].y,a[i].z);
for( i = 0; i < 3; i ++ ){
line(b[i].x,b[i].y,b[i + 4].x,b[i + 4].y);
line(b[i].x,b[i].y,b[i+1].x,b[i+1].y);
line(b[i+4].x,b[i+4].y,b[i+5].x,b[i+5].y);
noi[i][i+4]=1 , noi[i+4][i] =1;
noi[i][i+1] = 1, noi[i+1][i]=1;
noi[i+4][i+5]=1, noi[i+5][i+4]=1;
}
noi[0][3]=1,noi[3][0]=1;
noi[4][7]=1,noi[7][4]=1;
noi[3][7]=1,noi[7][3]=1;
line(b[0].x,b[0].y,b[3].x,b[3].y);
line(b[4].x,b[4].y,b[7].x,b[7].y);
line(b[3].x,b[3].y,b[7].x,b[7].y);
settextjustify(LEFT_TEXT,RIGHT_TEXT);
printf("\nQuay quanh truc :");
printf("\ny.Bam so 1");
printf("\nx.Bam so 2.");
printf("\nz.Bam so 3.");
scanf("%d",&t);
printf("\nQuay goc bao nhieu do:");
scanf("%d",&goc);
for( i = 0 ; i<= 7 ; i++){
c[i] = quay(a[i].x , a[i].y , a[i].z , goc ,t);
l[i] = c[i];
}
for( i = 0; i < 8; i ++)
c[i] = Diem3d(c[i].x,c[i].y,c[i].z);
for( i = 0; i < 3; i ++ ){
line(c[i].x,c[i].y,c[i + 4].x,c[i + 4].y);
line(c[i].x,c[i].y,c[i+1].x,c[i+1].y);
line(c[i+4].x,c[i+4].y,c[i+5].x,c[i+5].y);
}
line(c[0].x,c[0].y,c[3].x,c[3].y);
line(c[4].x,c[4].y,c[7].x,c[7].y);
line(c[3].x,c[3].y,c[7].x,c[7].y);
outtextxy(10,410,"Chon mat chieu: ");
outtextxy(10,420,"xoy: Bam so 1.");
outtextxy(10,430,"xoz: Bam so 2.");
outtextxy(10,440,"yoz: Bam so 3.");
outtextxy(10,450,"Bam so 4 de ket thuc");
char m;
do{
m = getch();
for(i = 0;i < 8; i ++)
c[i]= l[i];
switch (m){
case '1' :{
chieumat(c,1,*(d));
break;

183
Mөc lөc
}
case '2' :{
chieumat(c,2,*(d));
break;
}
case '3' :
{
chieumat(c,3,*(d)) ;
break;
}
}
}while( m !='4');
closegraph();
}

184
Tài liӋu tham khҧo

TÀI LIӊU THAM KHҦO


[1] James D.Foley, Andrie van Dam, Steven K.Feiner, Jonhn F. Hughes, Computer
Graphics Principles and Practice, Addison Wesley, 1994.
[2] Hoàng KiӃm, Dѭѫng Anh Ĉӭc, Lê Ĉình Duy, VNJ Hҧi Quân. Giáo trình cѫ sӣ Ĉӗ
hoҥ Máy tính, NXB Giáo dөc, 2000.
[3] Lê Tҩn Hùng, HuǤnh QuyӃt Thҳng. Kӻ thuұt ÿӗ hoҥ máy tính, NXB khoa hӑc và
kӻ thuұt, 2002.
[4] Steven Harrington, Computer Graphics A Programming Approach, McGraw Hill
International Edition, 1987.
[5] Gerald Farin, Curves and Surfaces for Computer Aided Geometric Design A
Practical Guide, Academic Press Inc, 1990.
[6] [Watt92] ACM Press, A. Watt and M. Watt. Advanced Animation and Rendering
Techniques. Addison Wesley Longman Limited, Edinburgh Gate, England, 1992.
[7] [CG92] Springer, M.de Berg, M. van Kreveld, M. Overmars, O. Schwarzkopf.
Computational Geometry. Springer-Verlag 1997, Germany.
[8] [Jensen2000] Henrik Wann Jensen, Niels Jørgen Christensen. A Practical Guide
to Global Illumination using Photon Maps. Siggraph 2000 Course 8.

185

You might also like