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 - Pdf 23

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ì?

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

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);

}
}
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;

}
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";

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);

+1*cos(n),0,14);
vehinh(1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),1,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),1,14);
vehinh(1*cos(n)-1*sin(n),1*sin(n)+1*cos(n),0,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),1,14);
}
void xoakhoitudienxoayOZ(int n)
{
vehinh(0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),0,1*cos(n)-0*sin(n),1*sin(n)
+0*cos(n),1,16);
vehinh(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),0,16);
vehinh(0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),0,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),1,16);
vehinh(1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),1,1*cos(n)-1*sin(n),1*sin(n)
+1*cos(n),0,16);
vehinh(1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),1,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),1,16);
vehinh(1*cos(n)-1*sin(n),1*sin(n)+1*cos(n),0,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),1,16);
}
void xoay(int n)
{ char kt;
for(int i=1;i<=n;i++)
{
cout<<"chon truc de xoay!\t"; cin>>kt;
if(kt=='x')
{
xoakhoitudienxoayOY(i-1);
xoakhoitudienxoayOZ(i-1);

}
if(kt==0)
{
zom(0.9,1.1);
}
}
void khoitaohqs()
{ r=10;d=5; phi=pi/6; teta=pi/6;
int i;
cout<<"nhap phep chieu:1-chieu phoi canh, 0-chieu song song\n";
cout<<"phep chieu = "; cin>>i;
phepchieu=1;
tlx=300;tly=300;//ti le phóng
xo=250; yo=250;//vi tri dat goc toa do tren man hinh trên màn hình
}
main()
{
initwindow(640,480);
khoitaohqs();
vetructoado();
12
vekhoitudien();
chon();
getch();
closegraph();
}
2. Khối lập phương
#include<iostream.h>
#include<conio.h>
#include<graphics.h>

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;
}

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()
{
15
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 vehinhlapphuong()
{
vehinh(1,0,1,0,0,1,14);

cout<<"+ phong to, - thu nho";
do{
c=getch();
switch(c)
{
case 45 :
xoahinhlapphuong();
tlx=tlx*a;tly=tly*a;
vehinhlapphuong();
break;
case 61 :
xoahinhlapphuong();
16
tlx=tlx*b;tly=tly*b;
vehinhlapphuong();
break;
}
}while(c!=27);
}
void vehinhlapphuongxoayOZ(int n)
{
vehinh(1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),1,0*cos(n)-0*sin(n),0*sin(n)
+0*cos(n),1,14);
vehinh(1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),1,1*cos(n)-1*sin(n),1*sin(n)
+1*cos(n),1,14);
vehinh(1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),1,1*cos(n)-0*sin(n),1*sin(n)
+0*cos(n),0,14);
vehinh(0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),1,0*cos(n)-0*sin(n),0*sin(n)
+0*cos(n),1,14);
vehinh(0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),1,1*cos(n)-1*sin(n),1*sin(n)

+1*cos(n),0,16);
vehinh(1*cos(n)-1*sin(n),1*sin(n)+1*cos(n),0,1*cos(n)-1*sin(n),1*sin(n)
+1*cos(n),1,16);
vehinh(1*cos(n)-1*sin(n),1*sin(n)+1*cos(n),0,1*cos(n)-0*sin(n),1*sin(n)
+0*cos(n),0,16);
vehinh(1*cos(n)-1*sin(n),1*sin(n)+1*cos(n),0,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),0,16);
vehinh(0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),0,0*cos(n)-0*sin(n),0*sin(n)
+0*cos(n),1,16);
vehinh(0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),0,1*cos(n)-0*sin(n),1*sin(n)
+0*cos(n),0,16);
vehinh(0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),0,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),0,16);
}
void vehinhlapphuongxoayOX(int n)
{
vehinh(1,0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),0,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),14);
vehinh(1,0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),1,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,0*cos(n)-0*sin(n),0*sin(n)
+0*cos(n),14);
vehinh(0,1*cos(n)-1*sin(n),1*sin(n)+1*cos(n),0,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),14);
vehinh(0,1*cos(n)-1*sin(n),1*sin(n)+1*cos(n),1,1*cos(n)-1*sin(n),1*sin(n)
+1*cos(n),14);
vehinh(0,1*cos(n)-1*sin(n),1*sin(n)+1*cos(n),0,1*cos(n)-0*sin(n),1*sin(n)
+0*cos(n),14);
vehinh(1,1*cos(n)-0*sin(n),1*sin(n)+0*cos(n),1,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)-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,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,0*cos(n)-0*sin(n),0*sin(n)
+0*cos(n),16);
vehinh(0,0*cos(n)-0*sin(n),0*sin(n)+0*cos(n),0,1*cos(n)-0*sin(n),1*sin(n)
+0*cos(n),16);
}
void vehinhlapphuongxoayOY(int n)
{
vehinh(1*cos(n)-1*sin(n),0,1*sin(n)+1*cos(n),0*cos(n)-1*sin(n),0,0*sin(n)
+1*cos(n),14);
vehinh(1*cos(n)-1*sin(n),0,1*sin(n)+1*cos(n),1*cos(n)-1*sin(n),1,1*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),0,1*sin(n)
+0*cos(n),14);
vehinh(0*cos(n)-1*sin(n),1,0*sin(n)+1*cos(n),0*cos(n)-1*sin(n),0,0*sin(n)
+1*cos(n),14);
vehinh(0*cos(n)-1*sin(n),1,0*sin(n)+1*cos(n),1*cos(n)-1*sin(n),1,1*sin(n)
+1*cos(n),14);
vehinh(0*cos(n)-1*sin(n),1,0*sin(n)+1*cos(n),0*cos(n)-0*sin(n),1,0*sin(n)
+0*cos(n),14);
vehinh(1*cos(n)-0*sin(n),1,1*sin(n)+0*cos(n),1*cos(n)-1*sin(n),1,1*sin(n)
+1*cos(n),14);
vehinh(1*cos(n)-0*sin(n),1,1*sin(n)+0*cos(n),1*cos(n)-0*sin(n),0,1*sin(n)
+0*cos(n),14);
vehinh(1*cos(n)-0*sin(n),1,1*sin(n)+0*cos(n),0*cos(n)-0*sin(n),1,0*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),0,0*sin(n)

+0*cos(n),16);
vehinh(0*cos(n)-0*sin(n),0,0*sin(n)+0*cos(n),0*cos(n)-0*sin(n),1,0*sin(n)
+0*cos(n),16);
}
void xoay()
{ char c;
for(float i=1;i<=1000;i++)
{
cout<<"chon truc de xoay!\t"; cin>>c;

if(c=='z')
{
xoahinhlapphuongxoayOX(i-1);
xoahinhlapphuongxoayOY(i-1);
vehinhlapphuongxoayOZ(i);
xoahinhlapphuongxoayOZ(i-1);
vetructoado();
}
if(c=='x')
{
xoahinhlapphuongxoayOY(i-1);
xoahinhlapphuongxoayOZ(i-1);
20
vehinhlapphuongxoayOX(i);
xoahinhlapphuongxoayOX(i-1);
vetructoado();
}
if(c=='y')
{
xoahinhlapphuongxoayOZ(i-1);

{
initwindow(640,480);
khoitaohqs();
vetructoado();
vehinhlapphuong();
chon();
getch();
closegraph();
}
21
3. Khối bá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;}
else { xp=x; yp=y;}
}
void chuyenmh(float x, float y, int &xm, int &ym)

{
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)
{
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;
23
tg=xa;xa=xb;xb=tg;

chieu3D_2D(x1,y1,z1,xp,yp);
chuyenmh(xp,yp,am,bm);
ve(xm,ym,am,bm,m);
}
void vetructoado()
{

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 vekhoibatdien()
{
vehinh(0.5,0.5,0,0.5,0,0.5,14);
vehinh(0.5,0.5,0,0,0.5,0.5,14);
vehinh(0.5,0.5,0,1,0.5,0.5,14);
vehinh(0.5,0.5,0,0.5,1,0.5,14);
24
vehinh(0.5,0.5,1,0.5,1,0.5,14);
vehinh(0.5,0.5,1,1,0.5,0.5,14);
vehinh(0.5,0.5,1,0,0.5,0.5,14);
vehinh(0.5,0.5,1,0.5,0,0.5,14);
vehinh(0.5,0,0.5,0,0.5,0.5,14);
vehinh(0.5,0,0.5,1,0.5,0.5,14);
vehinh(0.5,1,0.5,1,0.5,0.5,14);
vehinh(0.5,1,0.5,0,0.5,0.5,14);
}
void xoakhoibatdien()
{
vehinh(0.5,0.5,0,0.5,0,0.5,16);

vetructoado();
break;
}
}while(kt!=27);

}
void vekhoibatdienxoayOX(int n)
25


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status