7. CÁC PHÉP BIẾN ĐỐI TRONG ĐỒ HOẠ BA CHIẾU
7.2 PHÉP BIẾN DẠNG
Biến dạng theo bất kỳ trục toạ độ nào cũng bị ảnh hưởng bởi toạ độ ứng với hai trục còn lại. Ma trận của phép biến dạng như sau:
1 hyx. K 0、
hxy 1 K 0
hxz K 1 0
0 0 0 1;
(7.4)
Ta cỏ mối quan hệ Qx với p là: Qx = px + hxyPy + hxzpz,
ờ đây có thể hieu hxy là lượng mà toạ độ y của p tác động lên toạ độ
X cùa Q.
Hình 7.7. Phép biến dạng theo trục X: h Xy= hxz =1, câc hệ s ố khác bằng 0
Tương tự như trong trường hợp phép biến đổi tỷ lệ, phép biến dạng Sh (7.4) cũng có điềm bất động là gốc toạ độ 0 . Ta cũng có thể xây dựng phép biến dạng với tâm biến dạng tại một điểm (Xf, yf, Zf)
bất kỳ.
Ma trận biến đổi của phép biến dạng với tâm tại (Xf, yf, Z f )là:
Sh = 1 hxy h xz ^ ~ y f h x y _ Z f h X2 yx hy2 -Xfhyx- Z fhyz K 1 0、 0 0 (7.5) 12-OHMTiNH - ^ f K ~ y fK 1)
170 Đ ồ HOẠ MÁY TÌNH
7.2.1. Phép quay
y Phép quay quanh một trục toạ độ
Khác với phép quay trong hai chiều quanh một điểm bất kỳ, trong ba chiều ta có phép quay quanh một trục toạ độ. Ở đây ta sử dụng hệ toạ độ theo quy ước bàn tay phải và quy định chiều quay dương là ngược chiều kim đồng hồ.
Ta có các ma trận biểu diễn các phép quay quanh trục X, y, z một góc 0 lần lượt là R(z, 0), R(y, 0), R(x, 0): Quay quanh trục z: R(z,0) = COS0 sin0 0 -s in 0 COS0 0 0 0 1 0 0 0 0、 0 0 b (7.6)
Hinh 7.8. Phép quay quanh trục z
Quay quanh trục y: R(y,0) = COS0 0 一 sin0 0 0 1 0 0 sin 9 0 cosG 0 0 0 0 1 (7.7)
7 - CÁC PHÉP BIÊN ĐỒI TRONG ĐÔ HOA BA CHIÊU ỈSI g — Hình 7.9. Phép quay quanh trục y Quay quanh trục X: R (x,e) = 1 0 0 0、 0 COS0 sinG 0 0 - sinO COS0 0 0 0 0 (7.8) Hình 7.10. Phép quay quanh trục X
Nhận xét rằng, các giá trị nằm trên dòng và cột tương ứng với trục X trong ma trận R(x, 0) sẽ có giá trị là 0, ngoại trừ giá trị nằm trên đường chéo chính là 1 .Điều này đảm bảo cho toạ độ X của các điềm là không bị thay đổi qua phép biến đổi. Nhận xét này cũng tương tự cho trường hợp các ma trận còn lại.
172 ĐỒ HOẠ MÁY TÍNH
Ghi chú: Các định nghĩa về chiều quay được dùng chung cho cả hệ toạ độ theo quy ước bàn tay phải và bàn tay trái. Cụ thể chiều dương được định nghĩa như sau:
- Quay quanh trục X:từ trục dương y đến trục dương z. - Quay quanh trục y : từ trục dương z đến trục dương X.
- Quay quanh trục z: t ừ trục dương X đến trục dương y.
Hình 7.11. Cách xắc định chiều quay dương
> Phép quay quanh một trục bất kỳ
Giả sử trục quay đi qua hai điểm P〇, Pị nào đó với phương được biểu diễn bởi vector đơn vị k. Quay điểm (x, y, z) quanh trục k theo một góc 0 sẽ biến thành điểm (xf, yf, zf) (hình 7.12).
7 - CÁC PHÉP BIÉN ĐỒI TRONG ĐỒ HOẠ BA CHIÊU 173
Đẻ thực hiện phép quay quanh k một góc 0, ta có thể thực hiện một chuồi các thao tác sau:
- Tịnh tiến trục k về gốc toạ độ: tr(- P〇) (thành trục k').
- Quay quanh trục X một góc a để đặt trục k' nằm trên mặt phẳng Oxz: rot(x,a) (thành trục k").
- Quay quanh trục y góc p để đưa trục k" về trục z: rot(y, - P) (thành trục k'").
- Thực hiện phép quay quanh trục z một góc 0: rot(z, 0). - Thực hiện chuồi các phép biến đổi ngược lại quá trình trên. Góc quay a được xác định dựa trên chiếu của k ' lên mặt phăng yOz, ta không cần tính a cụ thể. Thay vào đó ta tính sina và cosa một cách trực tiếp.
Từ hình 7.12 ta có: P〇P, |P〇P.||
cos(a) = kz/d, sin(a) = ky/d. Tương tự, từ hình 7.13 ta có:
cos(P) = d/1, sin(P) = kx/ l = kx
Như vậy, phép quay quanh một trục P〇P| bất kỳ một góc 0, rot(P〇P|, 0), có thể được phân rã thành chuỗi các biến đổi cơ sở sau:
tr(- P〇) rot(x,a) rot(y, - P) rot(z, 0) rot(y, p) rot(x, - a) tr(P〇)
や 、
174 ĐỒ HOA MÁY TÍNH
7.2.2. Kết họp các phép biến đổi affine ba chiều
Đẻ kết hợp các phép biến đổi affine ba chiều, ta thực hiện
tương tự như ờ phép Dien đổi hai chiều bằng cách dùng hệ toạ độ
thuần nhất.
Bằng cách này, ta cũng có các kết quả tương tự như trong trường hợp biến đồi hai chiều. Nếu M ị biến đồi p thành Q và M2biến đồi Q thành s, thì M |M2sẽ biến đổi p thành s. Do đó ma trận kết hợp của nhiều phép biến đồi có thể được tính từ việc nhân các ma trận cùa các phép biến đồi thành phần.
7.3. PHÉP BIẾN ĐỎI MÔ HÌNH VÀ PHÉP BIÉN ĐỎI HỆ TRỤC TOẠ Đ ộ
Cho đến thời điểm này, chúng ta đã khảo sát các phép biến đổi ba chiều như là thao tác dịch chuyền một điểm (một đối tượng) từ vị trí này sang vị trí khác trong một hệ trục toạ độ. Tuy nhiên, nhiều khi, ta cần xem xét các đối tượng trong các hệ toạ độ khác nhau, muốn chuyển từ một hệ toạ độ này sang hệ toạ độ khác. Ví dụ. trong quy trình hiển thị đối tượng ba chiều, ta cần đặt một đối tượng vào hệ toạ độ chung cho tất cả các đối tượng trong cảnh (hệ toạ độ thế giới thực), sau đỏ, xác định tia nhìn, ta chuyển đổi từ hệ toạ độ thế giới thực sang hệ toạ độ quan sát, và cuối cùng phải chuyển từ hệ toạ độ quan sát sang hệ toạ độ thiết bị (nơi các đối tượng sẽ được hiển thị).
Khi mô hình hoá đối tượng, ta thường mô tả chúng trong một hệ toạ dộ cục bộ, thuận tiện nhất cho việc mô hình hoá. Sau đó, bằng các phép biến đồi sẽ đặt chúng vào cành cần hiển thị. Cách tiếp cận này cho phép không cần mô hình hoá quá nhiều đối tượng mà chi mô hình hoá theo chùng loại đối tượng. Ví dụ, để tạo cảnh trong hình 7.1 ta chỉ cần mô hình hoá một quả bóng, một cái bàn,... Sau đó phát sinh ra nhiều quả bóng, nhiều cái bàn,... Một ví dụ khác có thể xem trong hinh 7.14.
7 - CÁC PHÉP BIÊN ĐỒI TRONG ĐỒ HOẠ BA CHIÊU 175
Hình 7.14. Mô hình hoâ và phép biến đồi hệ toạ độ
Nếu hệ toạ độ ứìứ hai có gốc toạ độ đặt tại (x〇, y〇, z〇) và các vector cơ sở được mô tả như trong hình 7.15 (tương ứng hệ toạ độ ửiứ nhất), trước tiên ta cần thực hiện phép tịnh tiến T(- x〇, - y〇, - z〇); sau đó xây dựng ma trận quay R dựa trên các vector cơ sờ. Ma trận này sẽ biến đổi các vector đơn vị u'x, Uy , u*ztương ứng thành các trục X, y, z.
uxl UV. uzl u »x2 u,y2 u1z2 u 1x3 u ,y3 u 1z3 0 0 0 0、 (7.9)
Ma trận của phép biến đổi hệ toạ độ chính là tích T.R. Ma trận này biến đồi hệ toạ độ Descartes này thành hệ toạ độ Descartes khác, cho dù chúng là hệ toạ độ theo quy ước bàn tay phải hay bàn tay trái.
176 Đồ HOẠ MÁY TÍNH
HƯƠNG DẦN CAI ĐẬT
CHƯƠNG THÌNH THEN TC7DEV C++
1 . Giới thiệu về lập trình dồ họa trên hệ điều hành Windows
Hiện nay, trên thế giới đang tồn tại một số hệ điều hành như: Linux, Unix, Windows XP, Windows 7, Windows Vista, việc lập trình trên mỗi hệ điều hành có những thuận lợi và khó khăn riêng. Để lập trình viên có thể lập trình được trên hệ điều hành đang sử dụng một cách hiệu quả mà không ảnh hường đến các chương trình ứng dụng khác cũng như công việc. Dưới đây chúng tôi hướng dẫn lập trình đồ họa trên Windows XP nên sử dụng ngôn ngữ lập trình Turbo C++ 3.0 (viết tắt là TC); trên ngôn ngữ lập trình Dev C++ và Windows 7 nên sử dụng ngôn ngữ lập trình Dev C++ hoặc có thể dùng TC nhưng thông qua môi trường giả lập DOSbox.
2. Hướng dẫn lập trinh trên Turbo C++3.0
Để khời động chế độ đồ họa TC trong Windows XP và thực hiện được các hàm ta cần có thư viện đồ họa graphics.h, egavga.bgi, goth.chr, litt.chr, sans.chr và trip.chr. ở chế độ lập trình văn bản, màn hình có 80 cột và 25 dòng; còn chế độ đồ họa thì phụ thuộc vào độ phân giải của màn hình (nội dung này đã được giới thiệu ờ các chương đầu).
Một số hàm cơ bản dùng để khời động chế độ đồ họa trong TC
STT Tên hàm Chức năng
1
void initgraph(int *graphdriver, int
*graphmode, char *path)
Khởi động chế độ đồ hoạ, đường dẩn path thường đặt là "..//BGI", bởi vì các tệp tin đồ họa thường được lưu trong thư mục BGI
2 int graphresult(void) Cho mã lỗi khởi động đồ hoạ
3 char *grapherrormsg(int m) Cho biết lỗi đồ hoạ, có mả lỗi là m
Đẻ tiện theo dõi, ta tham khảo đoạn code sau: #include 〈g r a p h i c s .h> # include <stdlib.h> # include < s t d i o .h> HƯỚNG dAn Cài đ ạ t t r ế n t r ê n t c/d e v C++ 177 # include <conio.h> int main(void) {
int gdriver = DETECT, gmode, e r r o r c o d e;
/* Khởi động chế độ đồ họa*/
initgraph ( & g d r i v e r , & g m o d e , "..// B G I" ) ;
/* Nếu bạn đặt là " . . / / B G I " thì chương trình tự dò tìm đường dẫn đến tệp tin đồ họa như g r a p h i c s .h */
errorcode = g r a p h r e s u l t( ) ;
if (errorcode != grOk) /* xảy ra 1 0 1 ★/
{
p r i n t f ("Graphics e r r o r: %s\n",
g r a p h e r r o r m sg(errorcode) ) ;
p r i n t f ("Press any key to h a l t ; // nhấn một ph í m bất kỳ
g e t c h O ;
e x i t (1);
/* thoát khỏi chương trình khi có lỗi */
} /* vẽ đường thẳng từ tọa độ (0, 0) đến (200,200) trên màn hì n h */ l i n e (0, 0, g e t m a x x( ) , g e t m a x y ()); g e t c h( ) ; I I dừng lại đẻ xem c l o s e g r a p h (); // đóng chế độ đồ họa return 0;
178 Đ ồ HOẠ MÁY TÍNH
Ị J
P»〇l® cỉỊaa««| Deòugl
Irmft lOLffwnfie > Bước 1: Tạo dự án mới
て♦♦
I Edt SM rch View FVolect Execute Debug Tools CVS Window He^>
Open Project or Fite..
M Ị f l lie # Ợ OBI■■■■し你 ig Goto 丨■ R e«x^ce Fie t--- ぬ ニJ m Import [^Export t Setup u Ext
^ Rosouic«t dll] Comple Log j^ Debug Ỉ总 Fnd R e su lt I
Ready
Đ回圍丨 i l l 1 傭f 0
□ New (Jjlnwl 句 Tog由[|]Goi。
3. Hướng dân cài đặt và lập trình trên Dev C++
Trước hết cần có bộ cài đặt phần mềm Dev C++ (có thể tải phiên bản miễn phí từ mạng Internet). Sau khi cài đặt xong, Dev C++ có giao diện như sau:
_D«V 心 ロタ
HƯỚNG DẢN CẢI ĐẠT TRÊN TRÊN TC/DEV C++ 179
Bước 2: Ghi tên dự án
s ■ a ^
W fidows K S S S 3 Static Libfary DLL Empíy Project Applcỏỉion
D eỉcipỉion:
A console application (MSDOS window)
PiOfect Name
optiorn:
|Vidu0101
( • £ Proiect c C ^P ro ie c t p Make Deiaufc Language
✓ Qk I X Cancel I _ ? S a v e jn. I C h u o n g lin h 3 M y R v c e n l D o c u m e n it { 3 ニ ] か ぬ ct ED- M y D o c u m e n t• .メ_ M y C o n p u le i Fite Save>9 AS ] y p e : -iJ | b « v - C * * P*〇«0C I Ị* d e v )
> Buúc 3 Mở tên chương trình vã ghi tên chương trình .9.9.? í ViduOIOI I ViduOIOI. Nb t d l ỈM rc h f m » &« |K Ỉ e sK O l* Qabug ỉ〇Ob tf tn d w ị p b Q^ỉ □ 黾 c â 匾 > 3 西 88 n 0 §〇 ^ f ⑭ Qn«* ^Ing^r Q G«tt> 了 >0|K< I CUmm;0«t»« i " « c j Vrtumm T í # i n c l u d e < s t d i o . h > # 1 n tlu d fe ^ s L d l i b . h > i n t m a in ( i n t a r g c # c h a r * a r g v [ ] ) s y s t e m(,,PAUJE,') i r e t u r n 0 ; S3
Rnoưcm dfi) Canpia Log I % JnMM lOLratfiH
180 Đ ồ HOẠ MÁY TỈNH
Ghi tên chương trình:
> Bước 4. Biên dịch dự án (chương trình)
sys tem CP A J :-;£••);
L 'e t u r n 0;
OQ Lomftm Mmcmcmdlb CoMple Log I Detajg 总 Fm! RmiAì
> Sưức 5: Chạy chương trình
n » i m Sm t ờ< ProtK t 0«tM〇 Took CVS MA>
OQ □ í «¢3 S88^
88 a n 88 ダ 一 一 _
4. Hướng dẩn viét chương trinh đồ họa trên Dev C++ Ta cần hai tệp tin đồ họa graphics.h và libbgi.a.
> Bước 1: Thiết lập các tệp tin đồ họa vào chương trình: - Copy tệp graphics.h vào thư mục include.
HƯỞNG DAN CÀI ĐAT TRÊN TRÊN TC/DEV C + + ____________ t ĩT I
- Copy tệp libbgi.a vào thư mục lib. > Bước 2: ỉ ạo dự án như mục 2
Giữ phím Alt, nhấn phím p, sau đó chọn thẻ Parameters, gõ chính xác sau vào thẻ Linker nội dung như trong thẻ Linker đã có:
Chọn nút 〇K.
> Bước 3: Xây dựng chương trình đồ họa
Trước hết cần Khởi động đồ họa bằng lệnh:
initgraph(&mh,&mode,M"),
trong đó các tham số màn hình là EGA và mode EGALO (tham khảo ví dụ CỈ0201 trong chương 2)
Một số lệnh đồ họa cơ bản trong Dev C++:
TT Tên hàm Ý nghĩa
1 initgraph(&mh,&mode, e,"") Khởi động chế độ đồ họa.
2 setbkcolor(color)
Đặt màu nền có màu là color: là số nguyên hoặc tên bằng tiếng anh viết hoa, ví dụ: RED.
182 Đ ô HOẠ MÁY TÍNH
TT Tên hàm Ý nghĩa
3 setcolor(color) Đặt màu đường vẽ có màu là color.
4 moveto(x, y) Di chuyển con trỏ đến tọa độ (x, y).
5 Iine(x1,y1,x2, y2)
Vẽ một đường thẳng nối hai điếm (x1, y1)và (x2, y2) nhưng con trỏ vẫn ở
vị trí cũ.
6 lineto(x, y)
Vẽ đường thảng từ điểm hiện tại tới điẻm (x, y), đồng thời chuyển con trỏ tới điểm này.
7 closegraph() Đóng chế độ đồ họa.
8 outtextxy(20,10,’’Welcome to Dev C++ graphics!")
Viết lên màn hình dòng chữ: "Welcome to Dev C++ graphics!" bắt đầu từ tọa độ (20, 10).
9 circle(x, y, r) Vẽ hlnh tròn có tâm (x, y) bán kính r.
10 putpixel(x, y, color) Vẽ một điểm tại vị trí (x, y) có màu là color.
TÀI LIỆU THAM KHẢO 183
TÀI LIỆU THAM KHẢO
[1 】 Nguyễn Tuấn Anh,G7ỞƠ /r/Vĩ/ĩ Ằỹ /ập び/>7/7 /u/ớwg ゴ0/ C+ + ,
NXB Giáo dục Việt Nam, 2011.
[2] Nguyễn Tuấn Anh - Nguyễn Trường Xuân - Nguyễn Văn Ngọc - Nguyễn Quang Khánh - Nguyễn Hoàng Long, Lý thuyết đò thị và ứng dụng, NXB Giáo dục Việt Nam, 2012.
[3] Phạm Văn Át, Kỹ thuật lập trình c - Cơ sớ vờ nâng cao, NXB Giao thông Vận tải, 2006.
[4] Hoàng Kim Bảng, Cơ sở lập trình c (phần cơ sở), Trường Đại học Mỏ - Địa chất, 2005.
[5】 Nguyên Quốc Cường — Hoàng Đức Hải, G/ík?びÙ7 /7 Đd /?ơợ v/ — rập 人 2, NXB Giáo dục, 1999.
[6] Dương Anh Đức - Lê Đình Duy, Giảo trình Đồ hoạ mảy tỉnh, Khoa Công nghệ thông tin, Trường Đại học Khoa học Tự nhiên (ỉưu hành nội bộ), 1996.
[7] Lê Tấn Hùng - Huỳnh Quyết Thảng, Giảo trình Kỹ thuật đồ hoạy Trường Đại học Bách khoa Hà Nội, 2002.
[9] Hoàng Kiếm - Dương Anh Đức - Lé Đình Duy - Vù Hài Quân, C7/ác? /nVĩ/? c v
sớ đồ hoụ mảy tính, NXB Giáo dục, 2000.
[10] Đỗ Xuân Lôi, c ẩ u trúc dữ liệu và giải thuật, NXB Đại học Quốc gia Hà Nội, 2006.
[11] Nguyền Xuân My - Hồ Sĩ Đàm - Trần Đỗ Hùng - Lê ST Quang, Một số vấn để chọn lọc trong môn Tin học, Tập / , NXB Giáo dục, 2002.
[12] Nguyễn Đức Nghĩa, Toán rời rạcy NXB Đại học Quốc gia Hà Nội, 2002.
[13] Nguyên Xuân Phong - Trương Lẽ Ngọc Thương, Cơ sở lý thuyết đồ hoạ, NXB Thanh niên, 2002.
[13] Đinh Mạnh Tường, c ấ u trúc dữ liệu và thuật toảrìy NXB Khoa học và Kỹ thuật, 2003.
[14] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest, Introduction to Algorithms, Cambridge, Massachusetts, 1990.
[15] Donald Hearn, M.Pauline Baker, Computer Graphics, c version, Prentice Hall International Inc, Upper Saddle River, New Jersey, 1997.
[16] Francis s. Hill, Computer Graphics, Macmillan Publishing Company, NewYork, 1990.
[17] James D.Foley, Andries Van Dam, Feiner, John Hughes. Introduction to Computer Graphics, Addision Wesley, NewYork, 1995.
[18】 James D.Foley, Andries Van Dam,Feiner, John Hughes. -
Chịu trách n h iêm xu ất bản:
Chủ tịch Hội đồng Thành viên kiêm Tổng Giám đốc NGƯr NGÔ TRAN AI Phó Tổng Giám đốc kiêm Tổng biên tập GS.TS. v ũ VẢN HUNG
Chịu trách n h iêm n ô i dung:
Phó Tổng biên tập NGÔ ÁNH TUYÊT
Giám đốc Công ty CP Sách ĐH - DN NGÔ THỊ THANH BÌNH
Biên tập nội dung và sửa bản in:
Đ ỏ HỬU PHÚ
Thiết k ế m ỹ thuật và trình bày bìa :