Tiểu luận Đồ Hoạ Máy Tính

Giới thiệu Yêu cầu của bài Tiểu luận :

Tòa nhà ngắm phối cảnh: (7sv)

- Tạo mô hình wireframe thông qua các kỹ thuật vẽ đường cơ bản.

- Tô màu, khử đường khuất mặt khuất.

- Chiếu song song và hiển thị lên thiết bị.

 

doc11 trang | Chia sẻ: zimbreakhd07 | Lượt xem: 1860 | Lượt tải: 0download
Nội dung tài liệu Tiểu luận Đồ Hoạ Máy Tính, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
KHOA CÔNG NGHỆ THÔNG TIN ((( TIỂU LUẬN Đồ Hoạ Máy Tính Thực Hiện: Nhóm Lớp : ĐHTH3 Đề tài : 03 Toà nhà ngắm phối cảnh GVHD: Cô Nguyễn Thị Minh Hiếu ĐHCN TP.Hồ Chí Minh, Tháng 5/2009 Danh sách nhóm : Vương Hiển Giang 07713751. Trần Hữu Hoàn 07711131. Trịnh Ngọc Hưng 07712961. Đỗ Xuân Khánh 07713651. Phạm Nguyễn Hoàng Nam 07712361. Trần Duy Tùng 07711701. Trần Đặng Anh Tuấn 07713281. Giới thiệu Yêu cầu của bài Tiểu luận : Tòa nhà ngắm phối cảnh: (7sv) - Tạo mô hình wireframe thông qua các kỹ thuật vẽ đường cơ bản. - Tô màu, khử đường khuất mặt khuất. - Chiếu song song và hiển thị lên thiết bị. Một số Cấu trúc dữ liệu như sau : struct ToaDo3D { float x, y, z; }; struct ToaDoM { int x,y,z; }; struct ToaDo2D { float x, y; }; struct DaGiac { ToaDo3D n; int DSCanh[10]; int socanh; ToaDo3D tam; int color ; }; // n là vector pháp tuyến của mặt phẳng. //tâm của mặt phẳng và là điểm dùng để bắt đầu tô màu mặt phẳng. Các Module trong file .cpp : 1 - void ThietLapDoHoa(char *duongdan); Ta nhập vào đường dẫn đến thư muc BGI của BorlandC để thiết lập chế độ đồ hoạ. 2 - void KhoiTaoPhepChieu(); Ta có một số biến toàn cục sau : float r, d, theta, phi,tt=inc_ang*PI/180;; float aux1, aux2, aux3, aux4; float aux5, aux6, aux7, aux8; với d : khoãng cách từ mắt đến mặt phẳng chiếu (ta có thể tahy đổi giá trị của d để làm hiệu ứng phóng to hay thu nhỏ vật trong phép chiếu phối cảnh) theta và phi tính bằng đơn vị là o nên ta cá th và ph là các góc tương ứng tính bằng đơn vị radian. aux1 = sin(th); aux2 = sin(ph); aux3 = cos(th); aux4 = cos(ph); aux5 = aux3*aux2; aux6 = aux1*aux2; aux7 = aux3*aux4; aux8 = aux1*aux4; tt : là độ sai lệch góc khi ta quay hình. r : độ dài đoạn thẳng được nối từ tâm O đến điểm được chiếu. theta và phi : là các góc như hình vẽ sau  3 - float Tinhvohuong(ToaDoM v,ToaDo3D n); Giúp ta khử mặt khuất trong lúc hiển thị một vật thể 3 chiều lên màn hình. Ta khử mặt khuất bằng cách sau : ta tích tích vô hướng giữa vector mắt và vector pháp tuyến của mặt phẳng, sẽ được 3 trường hợp sau: Nếu > 0 Mặt phẳng thấy được và ta sẽ hiện thị lên màn hình. Nếu = 0 Thì mặt phẳng vuông góc với hướng nhìn, ta chỉ có thể thấy một đường thẳng. Ta có thể vẽ đường thẳng này hay không thì tuỳ ý, vì các mặt hiển thị khác sẽ có chứa đường thằng này. Nếu < 0 Mặt phẳng khuất, không vẽ lên màn hình. 4 - void Chieu(ToaDo3D p); Ta đưa vào hàm 1 điểm 3D có toạ độ x , y , z trong toạ độ OXY. Sau đó ta được 1 điểm 2D có toạ độ x , y trong mặt phẳng O’X0Y0. Để dể quan sát thì các điểm sau khi chiếu đều được tịnh tiến về giữa màn hình. Điểm này được xem như là hình chiếu của điểm 3D lên mặt phẳng 2D và ta sẽ vẽ điểm 3D này bằng giá trị của điểm 2D. 5 - void line1(ToaDo3D p1,ToaDo3D p2); Ta đưa vào hàm 2 điểm 3D Hàm sẽ lần lượt chiếu các điểm này lên toạ độ 2D, sau đó sẽ nối chúng lại, để dể quan sát thì các điểm sau khi chiếu đều được tịnh tiến về giữa màn hình. Vậy là thông qua hàm này ta đã hiển thị được hình ảnh đoạn thằng 3D. 6 - void TrucToaDo(); phần thêm vào dùng để vẽ các trục toạ độ. 7 - void DieuKhienQuay(); #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 Khi ta ấn các phím mũi tên ứng với các giá trị trên, thì mắt nhìn sẽ thay đổi vị trí tạo cho ta cảm giác camera thay đổi quay vật. Code : #include #include #include #include #include #include #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 const int inc_ang = 10; const float PI = atan(1)*4; const rmat=40; DaGiac DSdg[10]; ToaDo3D p[20]; int canh[21][2]; ToaDoM mat,matt; enum PhepChieu {PhoiCanh, SongSong}; float r, d, theta, phi,tt=inc_ang*PI/180;; float aux1, aux2, aux3, aux4; float aux5, aux6, aux7, aux8; PhepChieu projection; ToaDo3D obs ; ToaDo2D pe, pc; char ch; void ThietLapDoHoa(char *duongdan); void KhoiTaoPhepChieu(); float Tinhvohuong(ToaDoM v,ToaDo3D n); void Chieu(ToaDo3D p); void line1(ToaDo3D p1,ToaDo3D p2); void TrucToaDo(); void DieuKhienQuay(); void ThietLapDoHoa(char *duongdan) { int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, duongdan); errorcode = graphresult(); if (errorcode != grOk) { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); } } void KhoiTaoPhepChieu() { float th, ph; th =PI*theta/180; ph = PI*phi/180; aux1 = sin(th); aux2 = sin(ph); aux3 = cos(th); aux4 = cos(ph); aux5 = aux3*aux2; aux6 = aux1*aux2; aux7 = aux3*aux4; aux8 = aux1*aux4; pc.x = getmaxx()/2; pc.y = getmaxy()/2; } void Chieu(ToaDo3D p,float &xp,float &yp) { obs.x = -p.x*aux1 + p.y*aux3; obs.y = -p.x*aux5 - p.y*aux6 + p.z*aux4; if (projection == PhoiCanh) { obs.z = -p.x*aux7 - p.y*aux6 - p.z*aux2 + r; xp = d*obs.x/obs.z; yp = d*obs.y/obs.z; } else { xp = d*obs.x; yp = d*obs.y; } } void line1(ToaDo3D p1, ToaDo3D p2) { float p1x,p1y,p2x,p2y; Chieu(p1,p1x,p1y); Chieu(p2,p2x,p2y); line(pc.x+p1x,pc.y-p1y,pc.x+p2x,pc.y-p2y); } void TrucToaDo() { ToaDo3D oo,xx,yy,zz; oo.x = 0; oo.y = 0; oo.z = 0; xx.x = 3; xx.y = 0; xx.z = 0; yy.x = 0; yy.y = 3; yy.z = 0; zz.x = 0; zz.y = 0; zz.z = 3; line1(oo,yy); line1(oo,zz); line1(oo,xx); } void DieuKhienQuay() { ch = getch(); if (ch==0) ch = getch(); cleardevice(); switch(ch) { case UP: phi = phi + inc_ang; break; case DOWN: phi = phi - inc_ang; break; case LEFT: theta = theta + inc_ang; break; case RIGHT: theta = theta - inc_ang; break; } float tt=theta*PI/180; float p=phi*PI/180; if((ch==LEFT)||(ch==RIGHT)) { mat.x=cos(tt)*cos(p)*rmat; if(sin(tt)!=0) mat.y=rmat*cos(p)/(sin(tt)); } if((ch==UP)||(ch==DOWN)) { mat.z=sin(p)*rmat; } } void VeLapPhuong() { float px,py; for(int j=1;j<=7;j++) { if(projection==SongSong) if(Tinhvohuong(mat,DSdg[j].n)>0) { for(int i=1;i<=DSdg[j].socanh;i++) line1(p[canh[DSdg[j].DSCanh[i]][0]],p[canh[DSdg[j].DSCanh[i]][1]]); if((j==1)) { ToaDo3D tam; tam.x=2; tam.y=0.5; tam.z=0.2; setfillstyle(1,9); Chieu(tam,px,py); floodfill(px+pc.x,pc.y-py,WHITE); } if((j==2)||(j==4)) { ToaDo3D tam; tam.x=1; if(j==2) tam.y=0; else tam.y=1; tam.z=1.1; setfillstyle(1,10); Chieu(tam,px,py); floodfill(px+pc.x,pc.y-py,WHITE); } setfillstyle(1,DSdg[j].color); Chieu(DSdg[j].tam,px,py); floodfill(px+pc.x,pc.y-py,WHITE); } if(projection==PhoiCanh) { ToaDoM matt; matt.x=-(DSdg[j].tam.x-mat.x); matt.y=-(DSdg[j].tam.y-mat.y); matt.z=-(DSdg[j].tam.z-mat.z); if(Tinhvohuong(matt,DSdg[j].n)>0) { for(int i=1;i<=DSdg[j].socanh;i++) line1(p[canh[DSdg[j].DSCanh[i]][0]],p[canh[DSdg[j].DSCanh[i]][1]]); } } } } float Tinhvohuong(ToaDoM v,ToaDo3D n) { return (v.x*n.x+v.y*n.y+v.z*n.z); } void main() { d = 80; r = 4; theta=90; phi=0; float ttt=theta*PI/180; float pp=phi*PI/180; mat.x=cos(ttt)*cos(pp)*rmat; if(sin(ttt)!=0) mat.y=rmat*cos(pp)/(sin(ttt)); mat.z=sin(pp)*rmat; projection = SongSong; float a=2; p[1].x = 0; p[1].y = 0; p[1].z = 0; p[2].x = 0; p[2].y = 1; p[2].z = 0; p[3].x = 1*a; p[3].y = 1; p[3].z = 0; p[4].x = 1*a; p[4].y = 0; p[4].z = 0; p[5].x = 1*a; p[5].y = 0; p[5].z = 1; p[6].x = 0; p[6].y = 0; p[6].z = 1; p[7].x = 0; p[7].y = 1; p[7].z = 1; p[8].x = 1*a; p[8].y = 1; p[8].z = 1; p[9].x = 0.5*a; p[9].y = 0; p[9].z = 1.2; p[10].x = 0.5*a;p[10].y = 1; p[10].z = 1.2; p[11].x = 1*a; p[11].y = 0.7; p[11].z = 0; p[12].x = 1*a; p[12].y = 0.7; p[12].z = 0.5; p[13].x = 1*a; p[13].y = 0.33; p[13].z = 0.5; p[14].x =1*a; p[14].y = 0.33; p[14].z = 0; canh[1][0]=1;canh[1][1]=2; canh[2][0]=3;canh[2][1]=4; canh[3][0]=1;canh[3][1]=6; canh[4][0]=7;canh[4][1]=8; canh[5][0]=5;canh[5][1]=6; canh[6][0]=3;canh[6][1]=8; canh[7][0]=2;canh[7][1]=7; canh[8][0]=4;canh[8][1]=5; canh[9][0]=5;canh[9][1]=8; canh[10][0]=1;canh[10][1]=4; canh[11][0]=2;canh[11][1]=3; canh[12][0]=6;canh[12][1]=7; canh[13][0]=5;canh[13][1]=9; canh[14][0]=6;canh[14][1]=9; canh[15][0]=7;canh[15][1]=10; canh[16][0]=8;canh[16][1]=10; canh[17][0]=9;canh[17][1]=10; canh[18][0]=11;canh[18][1]=12; canh[19][0]=12;canh[19][1]=13; canh[20][0]=13;canh[20][1]=14; DSdg[1].DSCanh[1]=6; DSdg[1].DSCanh[2]=8; DSdg[1].DSCanh[3]=9; DSdg[1].DSCanh[4]=2; DSdg[1].DSCanh[5]=18; DSdg[1].DSCanh[6]=19; DSdg[1].DSCanh[7]=20; DSdg[1].socanh=7; DSdg[1].tam.x=1*a; DSdg[1].tam.y=0.5; DSdg[1].tam.z=0.9; DSdg[1].color=2; DSdg[2].DSCanh[1]=10; DSdg[2].DSCanh[2]=5; DSdg[2].DSCanh[3]=3; DSdg[2].DSCanh[4]=8; DSdg[2].DSCanh[5]=13; DSdg[2].DSCanh[6]=14; DSdg[2].socanh=6; DSdg[2].tam.x=1*a/2; DSdg[2].tam.y=0; DSdg[2].tam.z=0.5; DSdg[2].color=2; DSdg[3].DSCanh[1]=3; DSdg[3].DSCanh[2]=7; DSdg[3].DSCanh[3]=12; DSdg[3].DSCanh[4]=1; DSdg[3].socanh=4; DSdg[3].tam.x=0; DSdg[3].tam.y=0.5; DSdg[3].tam.z=0.5; DSdg[3].color=2; DSdg[4].DSCanh[1]=7 ; DSdg[4].DSCanh[2]=6 ; DSdg[4].DSCanh[3]=11 ; DSdg[4].DSCanh[4]=4 ; DSdg[4].DSCanh[5]=16 ; DSdg[4].DSCanh[6]= 15; DSdg[4].socanh=6; DSdg[4].tam.x=1*a/2; DSdg[4].tam.y=1; DSdg[4].tam.z=0.5; DSdg[4].color=2; DSdg[5].DSCanh[1]=1 ; DSdg[5].DSCanh[2]=2 ; DSdg[5].DSCanh[3]=11 ; DSdg[5].DSCanh[4]=10; DSdg[5].socanh=4; DSdg[5].tam.x=1*a/2; DSdg[5].tam.y=0.5; DSdg[5].tam.z=0; DSdg[5].color=8; DSdg[6].DSCanh[1]=16 ; DSdg[6].DSCanh[2]=13 ; DSdg[6].DSCanh[3]=9 ; DSdg[6].DSCanh[4]= 17; DSdg[6].socanh=4; DSdg[6].tam.x=1*a/4*3; DSdg[6].tam.y=0.5; DSdg[6].tam.z=1.1; DSdg[6].color=3; DSdg[7].DSCanh[1]=14 ; DSdg[7].DSCanh[2]=15 ; DSdg[7].DSCanh[3]=17 ; DSdg[7].DSCanh[4]=12; DSdg[7].socanh=4; DSdg[7].tam.x=1*a/4; DSdg[7].tam.y=0.5; DSdg[7].tam.z=1.1; DSdg[7].color=3; ToaDo3D a1,a2,a3,u,v; for (int j=1;j<=7;j++) { a1=p[canh[DSdg[j].DSCanh[1]][0]]; a2=p[canh[DSdg[j].DSCanh[1]][1]]; a3=p[canh[DSdg[j].DSCanh[2]][0]]; u.x=a1.x-a2.x; u.y=a1.y-a2.y; u.z=a1.z-a2.z; v.x=a1.x-a3.x; v.y=a1.y-a3.y; v.z=a1.z-a3.z; DSdg[j].n.x=u.y*v.z-u.z*v.y; DSdg[j].n.y=u.z*v.x-u.x*v.z; DSdg[j].n.z=u.x*v.y-u.y*v.x; } ThietLapDoHoa("e:\\BorlandC\\BGI"); do { KhoiTaoPhepChieu(); setcolor(RED); //TrucToaDo(); setcolor(WHITE); VeLapPhuong(); float px,py; DieuKhienQuay(); cleardevice(); }while (ch!=27); closegraph(); }

Các file đính kèm theo tài liệu này:

  • docDocument.doc
Tài liệu liên quan