Tải bản đầy đủ (.doc) (19 trang)

Đề tài: Nghiên cứu các phép biến đổi hình học trong không gian ba chiều

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (364.71 KB, 19 trang )

Đồ họa máy tính
Lời nói đầu
Đồ họa máy tính là một lĩnh vực của khoa học máy tính nghiên cứu
về cơ sở toán học, các thuật toán cũng như các kĩ thuật cho phép tạo, hiển
thị và điều khiển hình ảnh trên màn hình máy tính. Đồ họa máy tính liên
quan ít nhiều đến một số lĩnh vực như đại số, hình học giải tích và hình học
họa hình, quang học…… và kĩ thuật máy tính và đặc biệt là chế tạo phần
cứng ( các loại màn hình, các thiết bị nhập xuất, các vi mạch đồ họa).
Nghiên cứu các phép biến đổi hình học trong không gian ba chiều là
một trong những nội dung quan trọng.
Do quá trình tìm hiểu còn nhiều thiếu sót nên chương trình còn nhiều
hạn chế, nhóm thực hiện rất mong nhận được ý kiến đóng góp từ phía cô
giáo và các bạn để phần mềm được hoàn thiện hơn.
Hà Nội, ngày 26 tháng 2 năm 2013
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
1
Đồ họa máy tính
MỤC LỤC
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
2
Đồ họa máy tính
CHƯƠNG I: KHẢO SÁT
I. Mục đích nghiên cứu
Vẽ khối cầu và lăng trụ trong không gian . Hiện thị trên màn hình
. Vị trí quan sát xuất phát từ 1 điểm được gọi là phối cảnh .
II. Đối tượng nghiên cứu
Khối cầu và lăng trụ .
III. Hướng giải quyết
Quan sát các khối cầu và hình khối lăng trụ . Từ đó chúng ta sẽ có
cách nhìn thực tế của khối cầu và lăng trụ . Tìm hiểu các phương
trình của khối cầu . Từ đó chúng ta sẽ vẽ đc nó như mong muốn.



Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
3
Đồ họa máy tính
CHƯƠNG II: PHÂN TÍCH
I. Hiểu về chiếu phối cảnh .
Phép chiếu này cho hình ảnh giống như khi nhìn vật thể .
Để tìm hình chiếu P’(x’,y’,z’) của P(x,y,z) ta nối P với mắt (tâm chiếu)
.Giao điểm của đường này với mặt quan sát chính là P’ .
Giả sử P nằm trước mắt , tức là P.x < E .
Phương trình của tia đi qua mắt và P là :
r(t)=(E,0,0).(1-t)+(x,y,z).t (*)
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
4
Đồ họa máy tính
Giao điểm với mặt phẳng quan sát có thành phần x’=0.
Do thành phần x’ của tia r là E.(1-t) + x.t =0 nên t=1/(1-(x/E)) . Thay t
vào * ta tính được :
y’=y/(1-x/E) và z’=z/(1-x/E)
•Phếp chiếu phối cảnh không giữ nguyên hình dạng của vật thể .
•Chỉ có những đường thẳng song song với mặt phẳng chiếu thì mới
song song với nhau .
•Phép chiếu phối cảnh được quy định bởi 5 biến :
-Hướng của mặt phẳng chiếu so với vật thể .
-Độ cao của tâm chiếu so với vật thế .
-Khoảnh cách từ tâm chiếu đến vật thể (R) .
-Khoảng cách từ mặt phẳng chiếu đến tâm chiếu (D).
-Độ dịch chuyển ngang của tâm chiếu so với vật thể .
Thuật toán cài đặt
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;}
}
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
5
Đồ họa máy tính
II Khối cầu
Chiều cao và rộng của khối cầu :
D1=200
D2 =100
D1=100
D2 =200
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
6
Đồ họa máy tính
III .Lăng trụ tam giác
Lăng trụ đứng .
Lăng trụ nằm ngang .
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
7
Đồ họa máy tính
IV . Lăng trụ tứ giác .
Lăng trụ đứng .
Lăng trụ nằm ngang .
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
8
Đồ họa máy tính
CHƯƠNG III . Chương trình
#include<graphics.h>

#include<conio.h>
#include<math.h>
#include<iostream.h>
#include<stdio.h>
#define pi 3.14
float r, phi,teta, d, tlx, tly;
int phepchieu;
int xo, yo;
int xv1,xv2,yv1,yv2;
float xw1,yw1,xw2,yw2,tlx1,tly1;
/////////////////////////////////////////////////////////////
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
9
Đồ họa máy tính
void cs(float x1,float y1,float x2,float y2)
{ xw1=x1;
xw2=x2;
yw1=y1;
yw2=y2;
}
/////////////////////////////////////////////// ///////
void kn(int x1,int y1,int x2 ,int y2)
{ xv1=x1;
xv2=x2;
yv1=y1;
yv2=y2;
tlx1=(xw2-xw1)/(float)(xv2-xv1);
tly1=(yw2-yw1)/(float)(yv2-yv1);
}
//xây d?ng b? công c? 3D

//xây d?ng các th? t?c ph? tr?
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);
}
void chuyenden(float x, float y, float z)
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
10
Đồ họa máy tính
{ float x1, y1, z1, xp, yp;
int xm,ym;
chuyenhqs(x,y,z,x1,y1,z1);
chieu3D_2D(x1,y1,z1,xp,yp);
chuyenmh(xp,yp,xm,ym);
moveto(xm,ym);
}
void veden(float x, float y, float z)
{ float x1, y1, z1, xp, yp;
int xm,ym;
chuyenhqs(x,y,z,x1,y1,z1);

chieu3D_2D(x1,y1,z1,xp,yp);
chuyenmh(xp,yp,xm,ym);
lineto(xm,ym);}
//t?o các giá tr? m?c d?nh
void khoitaohqs()
{ r=10;d=5; phi=pi/5; teta=pi/4;
int i;
printf("Phep chieu (1-chieu phoi canh, 0-chieu song song) : ");
scanf("%d",&i);
phepchieu=i;
tlx=70;tly=50;//t? l? phóng
xo=320; yo=240;//v? trí d?t g?c t?a d? trên màn hình
setcolor(14);
}
void truc()
{ setcolor(4);
chuyenden(0,0,0); veden(0,0,14);//v? t? di?m A7(0,0,0)->A2(0,0,1)
chuyenden(0,0,0); veden(15,0,0);//v? t? di?m A7(0,0,0)->A6(1,0,0)
chuyenden(0,0,0); veden(0,15,0);//v? t? di?m A7(0,0,0)->A8(0,1,0)
setcolor(14);
}
/////////////////////////////////////////////////////
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
11
Đồ họa máy tính
void langtrunam()
{
int n,x=0,y=5,z=5,x1=0,y1=0,z1=5,x2=0,y2=0,z2=5;
printf("Nhap vao so dinh o day lang tru : ");
scanf("%d",&n);

chuyenden(0,5,0);
int i=1;
while(i<n)
{
veden(x,y,z);
veden(x1,y1,z1);
chuyenden(x,y,z);

if(i%2==0)
{
x1=x1;
z1=z1-2;
}
else
{
x1=x1+4 ;
z1=z1-2;
}
if(i%2==0)
{
x=x;
z=z-2;
}
else
{
x=x+4 ;
z=z-2;
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
12
Đồ họa máy tính

}
i++;
}
veden(0,5,0);
//day
veden(0,0,0);
i=1;
while(i<n)
{
veden(x2,y2,z2);
if(i%2==0)
{
x2=x2;
z2=z2-2;
}
else
{
x2=x2+4 ;
z2=z2-2;
}
i++;
}
veden(0,0,0);
getch();

}
//////////////////////////////////////////////////////////

void langtrudung()
{

int n,x=5,y=0,z=5,x1=5,y1=0,z1=0,x2=5,y2=0,z2=0;
printf("\nNhap vao so dinh o day lang tru : ");
scanf("%d",&n);
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
13
Đồ họa máy tính
int i=1;
chuyenden(0,0,5);
while(i<n)
{
veden(x,y,z);
veden(x1,y1,z1);
chuyenden(x,y,z);

if(i%2==0)
{
y1=y1;
x1=x1-2;
}
else
{
y1=y1+4 ;
x1=x1-2;
}
if(i%2==0)
{
y=y;
x=x-2;
}
else

{
y=y+4 ;
x=x-2;
}
i++;

}
veden(0,0,5);

Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
14
Đồ họa máy tính
//////////////day'
veden(0,0,0);
i=1;
while(i<n)
{
veden(x2,y2,z2);
if(i%2==0)
{
y2=y2;
x2=x2-2;
}
else
{
y2=y2+4 ;
x2=x2-2;
}
i++;
}

veden(0,0,0);
getch();
}
void E(int xc,int yc,int xradius,int yradius, int color)
{
int xcenter,ycenter;
xcenter=(int)(tlx1*(xc-xw1)+xv1);
ycenter=(int)(tly1*(yw2-yc)+yv1);
int x,y; float c,p;
x=0; y=yradius;
c=(float)yradius/xradius;
c=c*c; p=2*c-2*yradius+1;
while (c*x<=y)
{
putpixel(xcenter+x,ycenter+y,color);
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
15
Đồ họa máy tính
putpixel(xcenter-x,ycenter+y,color);
putpixel(xcenter+x,ycenter-y,color);
putpixel(xcenter-x,ycenter-y,color);
if (p<0) p += 2*c*(2*x+3);
else
{
p +=4*(1-y)+2*c*(2*x+3);
y ;
}
x++;
}


y=0;x=xradius;
c= (float)xradius/yradius;
c=c*c; p=2*c-2*xradius+1;
while (c*y<=x)
{
putpixel(xcenter+x,ycenter+y,color);
putpixel(xcenter-x,ycenter+y,color);
putpixel(xcenter+x,ycenter-y,color);
putpixel(xcenter-x,ycenter-y,color);
if (p<0) p +=2*c*(2*y+3);
else
{
p +=4*(1-x)+2*c*(2*y+3);
x ;
}
y++;
}
}
void khoicau()
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
16
Đồ họa máy tính
{ cs(-320,-240,320,240);
kn(0,0,640,480);
int x,y,dx,dy,dx1;

printf("Nhap chieu ngang chieu doc cua khoi cau : \n");
printf("D1: ");
scanf(" %d",&dx);
printf("D2: ");

scanf(" %d",&dy);
dx1=dx;
while(dx>=1)
{
E(0,0,dx,dy,14);
dx=dx-7;
}
while(dy>=1)
{
E(0,0,dx1,dy,14);
dy=dy-15;
}
getch();
}

int main()
{ int gd=0, gm=0;
int chon,chon1;
initgraph(&gd,&gm,"");
khoitaohqs();
do
{
system("cls");
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
17
Đồ họa máy tính
printf("\n1. KHOI CAU");
printf("\n2. LANG TRU DUNG");
printf("\n3. LANG TRU NAM NGANG");
printf("\n4. THOAT");

printf("\nHay chon(1-4): ");
scanf("%d",&chon);
switch(chon)
{ case 1:
cleardevice();
khoicau();
break;
case 2:
cleardevice();
// truc();
langtrudung();
break;
case 3:
cleardevice();
//truc();
langtrunam();
break;
case 4:
exit(0);
break;
default:
printf("\nBan chon SAI");
getch();
}

}while(chon!=4);

}
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
18

Đồ họa máy tính
Nhóm 26-KHMT3-K5 ĐH Công Nghiệp Hà Nội
19

×