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
Trang 1Lờ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
Trang 2MỤC LỤC
Trang 3CHƯƠ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
Trang 4CHƯƠ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 (*)
Trang 5Giao đ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;}
}
Trang 6II Khối cầu
Chiều cao và rộng của khối cầu :
D1=200
D2 =100
D1=100
D2 =200
Trang 7III Lăng trụ tam giác
Lăng trụ đứng
Lăng trụ nằm ngang
Trang 8IV Lăng trụ tứ giác
Lăng trụ đứng
Lăng trụ nằm ngang
Trang 9CHƯƠ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;
/////////////////////////////////////////////////////////////
Trang 10{ 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)
Trang 11int 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);
}
/////////////////////////////////////////////////////
Trang 12void 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;
Trang 13i++;
}
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);
Trang 14chuyenden(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);
Trang 15
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);
Trang 16putpixel(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()
Trang 17{ 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");
Trang 18printf("\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);
}