Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 31 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
31
Dung lượng
207,03 KB
Nội dung
1 BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CNTT o0o BÀI TẬP LỚN MÔN: ĐỒ HỌA MÁY TÍNH ĐỀ TÀI 13 : Viết chươn trình vẽ các khối đa diện trong không gian, điều khiển phóng to, thu nhỏ, quay khối đa diện quanh các trục Thành viên thực hiện: Vũ Xuân Chung Lớp: KTPM2 Mã SV: 0541360118 Hà Nội, Ngày , tháng , năm 2013 TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN *** BÁO CÁO BÀI TẬP LỚN Môn: ĐỒ HỌA MÁY TÍNH GVHD: ĐỀ TÀI 13 Viết chương trình vẽ các khối đa diện đều trong không gian, điều khiển phóng to, thu nhỏ, quay các khối đa diện quanh các trục Thành viên thực hiện: Vũ Xuân Chung Lớp: KTPM2 Mã SV: 0541360118 Hà Nội, Ngày , tháng , năm 2013 2 MỤC LỤC 3 I. Khảo sát 1. Khối đa diện đều là gì? Trong hình học, một khối đa diện đều là một khối có tất cả các mặt là các đa giác đều bằng nhau và các cạnh bằng nhau. 2. Các khối đa diện đều. a. Đa diện đều lồi - Trong không gian 3 chiều có đúng 5 khối đa diện lồi, chúng là các khối duy nhất có tất cả các mặt, các cạnh và các góc ở đỉnh bằng nhau. - Các khối đa diện lồi: khối tứ diện đều, khối 8 mặt đều, khối lập phương, khối 12 mặt đều và khối 20 mặt đều. - Các khối này đều có số mặt là chẵn. b. Đa diện đều lõm - Đa diện lõm còn gọi là đa diện sao, vì chúng có góc nhô ra như cánh của ngôi sao. 3. Tính chất của khối đa diện đều a. Tất cả các mặt của nó là các đa giác đều, bằng nhau. b. Các mặt không cắt nhau ngoài các cạnh. c. Mỗi đỉnh là giao của một số mặt như nhau ( cũng là giao của một số cạnh như nhau). 4. Không gian 3 chiều Thượng đế tạo nên muôn vạn vật để học hỏi và tiến hóa. Khoa học lại chia muôn loài thành vô hình và hữu hình. Vật thể hữu hình thì luôn có hình dạng nào đó trong không gian, vô hình là những loại mà ta không nhìn thấy bằng mắt thường, không có hình dạng cố định như những vật thể ở thể hơi, ở thể rung động… Để tính toán và diễn tả các vật thể có hình dạng cố định, các nhà toán học chia các vật thể này vào không gian 1, 2, 3 chiều để tiện cho việc sử dụng và tính toán. Không gian 3 chiều: (còn gọi là 3 chiều trong không gian) là chiều kế tiếp của hình học Euclide, từ 2 vecto đơn vị của không gian 2 chiều ta vẽ thêm một vecto đơn vị cùng gốc và thẳng góc hai vecto đơn vị của không gian 2 chiều. Ta sẽ có 3 vecto đơn vị cùng gốc và thẳng góc lẫn nhau, đó là căn bản của không gian 3 chiều mà thường có tên là chiều xyz. II. Phần tích 1. Để vẽ được các khối đa diện trong không gian thì đầu tiên ta phải đi xây dựng bộ công cụ 3D. a. Xây dựng công thức chuyển đổi quan sát - Bố trí hệ quan sát - Chuyển từ hệ tọa độ thực sang hệ tọa độ quan sát - Chiếu từ 3D về 2D - Chuyển từ không gian thực 2D lên màn hình b. Mục đích - Mô phỏng hình ảnh trong không gian thực ba chiều lên màn hình - Cho phép nhìn các vật thể từ các góc độ khác nhau: từ phía trước, từ phía sau, từ trên xuống, từ dưới lên, … c. Xây dựng công cụ 3D 4 - Khai báo các biến toàn cục • Float R,phi,teta,D,tlx,tly; • Int phepchieu: phối cảnh và song song • Int x0,y0: vị trí đặt gốc tọa độ trên màn hình - Xây dựng các thủ tục phục trợ • Void chuyenhqs(float x,float y,float z, float &x1, float &y1, float &z1) • Void chieu3D_2D(float x,float y, float z, float &xp, float &yp) • Void chuyenmh(float x,float y,int &xm,int &ym) 2. Sử dụng thuật toán vẽ đường thẳng Có 3 thuật toán dùng để vẽ đoạn thẳng: thuật toán DDA, thuật toán Bresenham và thuật toán Mid-point. Thuật toán DDA: cộng dồn giá trị thực m vào y tích lũy sai số làm tròn có kết quả sai xác định vị trí của điểm vẽ ra bị chệch hướng so với đường thẳng thực. Vẫn hạn chế về mặt tốc độ do vân còn phép toán cộng số thực và làm tròn. Thuật toán Bresenham chỉ thao tác trên các số nguyên và chỉ tính toán trên phép cộng và phép nhân 2 (phép dịch bit) điều này là một cải tiến làm tăng tốc độ đáng để so với thuật toán DDA. Thuật toán Mid-point là đưa ra cách chọn Y(i+1) là Y hay Y(i-1) bằng cách so sánh điểm thực Q(x i+1; y) với điểm giữa Mid-point là trung điểm của S1 và S2. Chọn điểm bắt đầu để vẽ là (0,R). Giả sử (x i, y i ) là điểm nguyên đã tìm được ở bước thứ i, thì điểm (x i+1, y i+1 ) ở bước i+1 là sự lựa chọn giữa S1 và S2. Ý tưởng chính của thuật toán Bresenham là ở chỗ xét dấu Pi đê quyết định điểm kế tiếp, và sử dụng công thức truy hồi P(i+1) – Pi để tính Pi bằng các phép toán đơn giản trên các số nguyên. Việc xây dựng trường hợp tổng quát cho thuật toán Bresenham có phức tạp hơn so với thuật toán DDA. Do đó, trong bài này em sử dụng thuật toán DDA để vẽ các khối đa diện. 3. Sử dụng phép phóng to, thu nhỏ và quay quanh các trục a. Phép phóng to, thu nhỏ Công thức: Phép quay 5 Ta thấy rằng, nếu phép quay quanh một trục nào đó thì tọa độ của vật thể tại trục đó sẽ không thay đổi. Do đó, ta có ma trân của phép quay như sau: - Phép quay quanh trục OZ - Phép quay quanh trục OY - Phép quay quanh trục OX III. Code 1. Khối tứ diện đều #include<iostream.h> #include<conio.h> #include<graphics.h> #include<math.h> #define pi 3.14 float r, phi,teta, d, tlx, tly; int phepchieu; int xo, yo; void chuyenhqs(float x, float y, float z, float &x1, float &y1,float &z1) { x1=-x*sin(teta)+y*cos(teta); y1=-x*cos(teta)*sin(phi)-y*sin(teta)*sin(phi)+z*cos(phi); z1=-x*sin(teta)*cos(phi)-y*cos(teta)*sin(phi)-z*sin(phi)+r; } void chieu3D_2D(float x, float y, float z, float &xp, float &yp) { if (phepchieu==1) { xp=d*x/z; yp=d*y/z;} 6 else { xp=x; yp=y;} } void chuyenmh(float x, float y, int &xm, int &ym) { xm=(int)(tlx*x+xo); ym=(int)(-tly*y+yo); } float xa,ya,xb,yb,x,y,m; void th1(float xa,float ya,float xb,float yb,int a) { if(ya>yb) { float tg; tg=xa;xa=xb;xb=tg; tg=ya;ya=yb;yb=tg; } x=xa;y=ya; while(y<=yb) { putpixel(x,y,a); y=y+1; } } void th2(float xa,float ya,float xb,float yb,int a) { if(xa>xb) { float tg; tg=xa;xa=xb;xb=tg; tg=ya;ya=yb;yb=tg; } x=xa;y=ya; while(x<=xb) { putpixel(x,y,a); x=x+1; } } void th3(float xa,float ya,float xb,float yb,int a) { m=(yb-ya)/(xb-xa); if(xa>xb) { float tg; tg=xa;xa=xb;xb=tg; tg=ya;ya=yb;yb=tg; } x=xa;y=ya; while(x<=xb) { 7 putpixel(x,y,a); x=x+1; y=(int)(m*(x-xa)+ya); } } void th4(float xa,float ya,float xb,float yb,int a) { m=(yb-ya)/(xb-xa); if(ya>yb) { float tg; tg=xa;xa=xb;xb=tg; tg=ya;ya=yb;yb=tg; } x=xa;y=ya; while(y<=yb) { putpixel(x,y,a); y=y+1; x=(int)((1/m)*(y-ya)+xa); } } void ve(float xa,float ya,float xb,float yb,int a) { m=(int)(yb-ya)/(xb-xa); if(xa==xb) th1(xa,ya,xb,yb,a); if(ya==yb) th2(xa,ya,xb,yb,a); if(abs(m)<=1) th3(xa,ya,xb,yb,a); else th4(xa,ya,xb,yb,a); } void vehinh(float x,float y,float z,float a,float b,float c,int m) { float x1, y1, z1, xp, yp; int xm,ym,am,bm; chuyenhqs(x,y,z,x1,y1,z1); chieu3D_2D(x1,y1,z1,xp,yp); chuyenmh(xp,yp,xm,ym); chuyenhqs(a,b,c,x1,y1,z1); chieu3D_2D(x1,y1,z1,xp,yp); chuyenmh(xp,yp,am,bm); ve(xm,ym,am,bm,m); } void vetructoado() { 8 vehinh(-3,0,0,3,0,0,10); vehinh(0,-3,0,0,3,0,10); vehinh(0,0,-3,0,0,3,10); } void vekhoitudien() { vehinh(0,0,0,1,0,1,14); vehinh(0,0,0,1,1,0,14); vehinh(0,0,0,0,1,1,14); vehinh(1,0,1,1,1,0,14); vehinh(1,0,1,0,1,1,14); vehinh(1,1,0,0,1,1,14); } void xoahinh() { vehinh(0,0,0,1,0,1,16); vehinh(0,0,0,1,1,0,16); vehinh(0,0,0,0,1,1,16); vehinh(1,0,1,1,1,0,16); vehinh(1,0,1,0,1,1,16); vehinh(1,1,0,0,1,1,16); } void zom(float a,float b) { char kt; cout<<"+ phong to, - thu nho"; do{ kt=getch(); switch(kt) { case 45 : xoahinh(); tlx=tlx*a;tly=tly*a; vekhoitudien(); vetructoado(); break; case 61 : xoahinh(); tlx=tlx*b;tly=tly*b; vekhoitudien(); vetructoado(); break; } }while(kt!=27); } void vekhoitudienxoayOX(int n) { vehinh(0,0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),1,0*cos(n)-1*sin(n),0*sin(n) +1*cos(n),14); 9 vehinh(0,0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),1,1*cos(n)-0*sin(n),1*sin(n) +0*cos(n),14); vehinh(0,0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),0,1*cos(n)-1*sin(n),1*sin(n) +1*cos(n),14); vehinh(1,0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),1,1*cos(n)-0*sin(n),1*sin(n) +0*cos(n),14); vehinh(1,0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),0,1*cos(n)-1*sin(n),1*sin(n) +1*cos(n),14); vehinh(1,1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),0,1*cos(n)-1*sin(n),1*sin(n) +1*cos(n),14); } void xoakhoitudienxoayOX(int n) { vehinh(0,0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),1,0*cos(n)-1*sin(n),0*sin(n) +1*cos(n),16); vehinh(0,0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),1,1*cos(n)-0*sin(n),1*sin(n) +0*cos(n),16); vehinh(0,0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),0,1*cos(n)-1*sin(n),1*sin(n) +1*cos(n),16); vehinh(1,0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),1,1*cos(n)-0*sin(n),1*sin(n) +0*cos(n),16); vehinh(1,0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),0,1*cos(n)-1*sin(n),1*sin(n) +1*cos(n),16); vehinh(1,1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),0,1*cos(n)-1*sin(n),1*sin(n) +1*cos(n),16); } void vekhoitudienxoayOY(int n) { vehinh(0*cos(n)-0*sin(n),0,0*sin(n)+0*cos(n),1*cos(n)-1*sin(n),0,1*sin(n) +1*cos(n),14); vehinh(0*cos(n)-0*sin(n),0,0*sin(n)+0*cos(n),1*cos(n)-0*sin(n),1,1*sin(n) +0*cos(n),14); vehinh(0*cos(n)-0*sin(n),0,0*sin(n)+0*cos(n),0*cos(n)-1*sin(n),1,0*sin(n) +1*cos(n),14); vehinh(1*cos(n)-1*sin(n),0,1*sin(n)+1*cos(n),1*cos(n)-0*sin(n),1,1*sin(n) +0*cos(n),14); vehinh(1*cos(n)-1*sin(n),0,1*sin(n)+1*cos(n),0*cos(n)-1*sin(n),1,0*sin(n) +1*cos(n),14); vehinh(1*cos(n)-0*sin(n),1,1*sin(n)+0*cos(n),0*cos(n)-1*sin(n),1,0*sin(n) +1*cos(n),14); } void xoakhoitudienxoayOY(int n) { vehinh(0*cos(n)-0*sin(n),0,0*sin(n)+0*cos(n),1*cos(n)-1*sin(n),0,1*sin(n) +1*cos(n),16); vehinh(0*cos(n)-0*sin(n),0,0*sin(n)+0*cos(n),1*cos(n)-0*sin(n),1,1*sin(n) +0*cos(n),16); 10 [...]... cout>kt; if(kt==1) { xoay(); } else { zom(0.9,1.1); } } void khoitaohqs() { r=10;d=5; phi=pi/6; teta=pi/6; int i; cout>kt; if(kt==1) { xoay(180); } if(kt==0) { zom(0.9,1.1); } } void khoitaohqs() { r=10;d=5; phi=pi/6; teta=pi/6; int i; cout>kt; if(kt==1) { xoay(180); } else { zom(0.9,1.1); } } void khoitaohqs() { r=10;d=5; phi=pi/6; teta=pi/6; int i; cout . LỚN Môn: ĐỒ HỌA MÁY TÍNH GVHD: ĐỀ TÀI 13 Viết chương trình vẽ các khối đa diện đều trong không gian, điều khiển phóng to, thu nhỏ, quay các khối đa diện quanh các trục Thành viên thực hiện: Vũ Xuân. Khối đa diện đều là gì? Trong hình học, một khối đa diện đều là một khối có tất cả các mặt là các đa giác đều bằng nhau và các cạnh bằng nhau. 2. Các khối đa diện đều. a. Đa diện đều lồi - Trong. TẬP LỚN MÔN: ĐỒ HỌA MÁY TÍNH ĐỀ TÀI 13 : Viết chươn trình vẽ các khối đa diện trong không gian, điều khiển phóng to, thu nhỏ, quay khối đa diện quanh các trục Thành viên thực hiện: Vũ Xuân Chung Lớp: