Professional Documents
Culture Documents
Ĉӗ 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ҥ
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ӏ.
Tô trát
ThiӃt bӏ ra
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 vc cͯa ÿ͛ ho̩ máy tính
CAD/CAM System
KiӃn tҥo ÿӗ
ÿӗ hoҥ minh hoҥ
hoҥ
Xӱ lý ҧnh
Xӱ lý ÿӗ
hoҥ Kӻ thuұt nhұn dҥng
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 dng 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 vc 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 vc 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ҥ:
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ҥ
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
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)
18
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
20
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
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
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
23
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
d<0 d>0
A A
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
25
Chѭѫng 2: Các giҧi thuұt sinh thӵc thӇ cѫ sӣ
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
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
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
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
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
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 gia 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:
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
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)
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
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ҥ
ª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ҥ
¬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
cy x’=x+cy
P P’
43
Chѭѫng 3: Các phép biӃn ÿәi ÿӗ hoҥ
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¼
[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.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 ª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¼
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
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 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»¼
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
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ӣ
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
1»
«¬ x w max xw min y w max y w min »¼
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
§ 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
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
S=Pi
Y N Y
i<N S bên trái Vertex output
AB S
N
End
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
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)
x2 y2 z2 r2
x sin 4T
Tham sӕ y cos 2T
(Parametric) M̫nh nh͗
(Particles)
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 dng 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.
Hình 5.4 Mô hình nguyên lý cӫa tiӃn trình biӇu diӉn ÿӕi tѭӧng 3D
Axonometric
ChiÕu
Hai ®iÓm
b»ng Cavalier
Trimetric
ChiÕu Dimetric
c¹nh PhÐp chiÕu
Isometric kh¸c
73
Chѭѫng 5: Phép chiӃu
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à:
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¼
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
77
Chѭѫng 5: Phép chiӃu
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
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
y y’
D’ C’
H
G H’ G’
E F
x A’ E’ F’ B
A B x
z
ª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
ª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
ª 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'
VP ( x = 10 )
VP ( z = 10 ) F'
A'
x'
z' x'
A', E' F' B' B'
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; }
84
Chѭѫng 6: Màu sҳc trong ÿӗ hoҥ
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).
10 10 10 10 10 10 10 10
Visible Spectrum
350 780 O
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
³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ӕ.
Pure color
White
O(nm)
400 700
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.
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).
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 ¼
ª 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).
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 »¼
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.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ҥ
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.
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 º ª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 »¼
ª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
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 ÿó.
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
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 ¼
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.
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
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
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.
115
Chѭѫng 8: Ánh sáng
2.
1.
1 Duong cong
0.
0. Duong cong
0.
0.
0. 0.
0.
1 1 0.
>(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)
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)] 0ttmax
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
là
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 ¼
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
ª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.
120
Chѭѫng 8: Ánh sáng
3 3
Qu , 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à
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
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]
>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 »
Qu , 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 »¼
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 01 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
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 - dng ÿ͛ 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.
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).
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.
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
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.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:
132
Chѭѫng 8: Ánh sáng
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à:
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).
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:
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.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.
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):
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 :
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
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:
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
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:
ĈӇ 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.
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'
153
Chѭѫng 9: Hình hӑc Fractal
154
Chѭѫng 9: Hình hӑc Fractal
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
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 dng 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.
162
Chѭѫng 9: Hình hӑc Fractal
164
Chѭѫng 9: Hình hӑc Fractal
Ĉây là ҧnh cӫa ÿѭӡ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
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ң
}
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);
}
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
185