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
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),16);
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),16);
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),16);
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),16);
}
void vekhoitudienxoayOZ(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,14);
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,14);
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,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),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);
11
vekhoitudienxoayOX(i);
xoakhoitudienxoayOX(i-1);
vetructoado();
}
if(kt=='y')
{
xoakhoitudienxoayOX(i-1);
xoakhoitudienxoayOZ(i-1);
vekhoitudienxoayOY(i);
xoakhoitudienxoayOY(i-1);
vetructoado();
}
if(kt=='z')
{
xoakhoitudienxoayOY(i-1);
xoakhoitudienxoayOX(i-1);
vekhoitudienxoayOZ(i);
xoakhoitudienxoayOZ(i-1);
vetructoado();
}
}
}
void chon()
{
int kt;
cout<<"0-zom,1-quay:";cin>>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<<"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>
#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;}
13
}
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)
{
putpixel(x,y,a);
14
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()
{
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);
vehinh(1,0,1,1,1,1,14);
vehinh(1,0,1,1,0,0,14);
vehinh(0,1,1,0,0,1,14);
vehinh(0,1,1,1,1,1,14);
vehinh(0,1,1,0,1,0,14);
vehinh(1,1,0,1,1,1,14);
vehinh(1,1,0,1,0,0,14);
vehinh(1,1,0,0,1,0,14);
vehinh(0,0,0,0,0,1,14);
vehinh(0,0,0,1,0,0,14);
vehinh(0,0,0,0,1,0,14);
}
void xoahinhlapphuong()
{
vehinh(1,0,1,0,0,1,16);
vehinh(1,0,1,1,1,1,16);
vehinh(1,0,1,1,0,0,16);
vehinh(0,1,1,0,0,1,16);
vehinh(0,1,1,1,1,1,16);
vehinh(0,1,1,0,1,0,16);
vehinh(1,1,0,1,1,1,16);
vehinh(1,1,0,1,0,0,16);
vehinh(1,1,0,0,1,0,16);
vehinh(0,0,0,0,0,1,10);
vehinh(0,0,0,1,0,0,10);
vehinh(0,0,0,0,1,0,10);
}
void zom(float a,float b)
{
char c;
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),1,14);
vehinh(0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),1,0*cos(n)-1*sin(n),0*sin(n)
+1*cos(n),0,14);
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,14);
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,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),0,14);
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,14);
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,14);
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,14);
}
void xoahinhlapphuongxoayOZ(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,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),1,16);
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,16);
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,16);
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),1,16);
17
vehinh(0*cos(n)-1*sin(n),0*sin(n)+1*cos(n),1,0*cos(n)-1*sin(n),0*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),1,0*cos(n)-0*sin(n),0*sin(n)
+0*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),14);
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),14);
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),14);
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),14);
}
void xoahinhlapphuongxoayOX(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),16);
18
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),16);
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),16);
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),16);
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),16);
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),16);
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),16);
vehinh(1,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),16);
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)
+1*cos(n),14);
vehinh(0*cos(n)-0*sin(n),0,0*sin(n)+0*cos(n),1*cos(n)-0*sin(n),0,1*sin(n)
+0*cos(n),14);
19
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),14);
}
void xoahinhlapphuongxoayOY(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),16);
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),16);
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),16);
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),16);
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),16);
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),16);
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),16);
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),16);
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),16);
vehinh(0*cos(n)-0*sin(n),0,0*sin(n)+0*cos(n),0*cos(n)-1*sin(n),0,0*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),0,1*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);
xoahinhlapphuongxoayOX(i-1);
vehinhlapphuongxoayOY(i);
xoahinhlapphuongxoayOY(i-1);
vetructoado();
}
}
}
void chon()
{
int kt;
cout<<"0-zom,1-quay:";cin>>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<<"nhap phep chieu:1-chieu phoi canh, 0-chieu song song\n";
cout<<"phep chieu = "; cin>>i;
phepchieu=1;
tlx=300;tly=300;
xo=250; yo=250;
}
main()
{
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)
{ 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;
22
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)
{
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;
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()
{
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);
vehinh(0.5,0.5,0,0,0.5,0.5,16);
vehinh(0.5,0.5,0,1,0.5,0.5,16);
vehinh(0.5,0.5,0,0.5,1,0.5,16);
vehinh(0.5,0.5,1,0.5,1,0.5,16);
vehinh(0.5,0.5,1,1,0.5,0.5,16);
vehinh(0.5,0.5,1,0,0.5,0.5,16);
vehinh(0.5,0.5,1,0.5,0,0.5,16);
vehinh(0.5,0,0.5,0,0.5,0.5,16);
vehinh(0.5,0,0.5,1,0.5,0.5,16);
vehinh(0.5,1,0.5,1,0.5,0.5,16);
vehinh(0.5,1,0.5,0,0.5,0.5,16);
}
void zom(float a,float b)
{
char kt;
cout<<"+ phong to, - thu nho";
do{
kt=getch();
switch(kt)
{
case 45 :
xoakhoibatdien();
tlx=tlx*a;tly=tly*a;
vekhoibatdien();
vetructoado();
break;
case 61 :
xoakhoibatdien();
tlx=tlx*b;tly=tly*b;
vekhoibatdien();
vetructoado();
break;
}
}while(kt!=27);
}
void vekhoibatdienxoayOX(int n)
25