Đồ họa máy tính
Trường Đại Học Công Nghiệp Hà Nội
Khoa Công Nghệ Thông Tin
BÀI TẬP LỚN
Môn: Đồ họa máy tính
Đề tài: Vẽ Đồng Hồ Hoạt Động
Giáo viên hướng dẫn: Nguyễn Thị Cẩm Ngoan
Sinh viên thực hiện:
1. Đinh Xuân Phong
2. Phạm Văn Trường
3. Đặng Quang Dũng
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
1
Đồ 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).
Qua môn học chúng ta đã nắm cơ bản các kiến thức về lập trình
đồ họa. Đề tài vẽ đồng hồ hoạt động là đề tài mà nhóm được giao tìm
hiểu và viết chương trình .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 để chương trình được
hoàn thiện hơn.
Hà Nội, ngày 29 tháng 2 năm 2013
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
2
Đồ họa máy tính
Mục Lục
Mục Lục 3
CHƯƠNG I: KHẢO SÁT 4
CHƯƠNG II: PHÂN TÍCH 5
delay(5); 6
2.1 Kết hợp các phép tịnh tiến 10
2.2 Phép quay với tâm bất kỳ 12
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH 14
3.1 Giao diện chương trình 14
3.2 Cài đặt chương trình 15
LỜI KẾT 20
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
3
Đồ họa máy tính
CHƯƠNG I: KHẢO SÁT
I. Mục đích nghiên cứu và đối tượng
Hiểu rõ các phép biến hình và thuật toán quay và ứng dụng của nó từ
đó ứng dụng vẽ mô phỏng hoạt động của đồng hồ.
II. Khảo Sát
Đề tài : Viết chương trình đồng hồ hoạt động là 1 đề tài yêu cần tìm
hiểu và vận dụng các phép biến hình cơ bản liên gồm có: phép tịnh tiến
phép quay…
Sử dụng các thuật toán vẽ đường thẳng như DDA, Bresenham
Đây là đề tài yêu cầu sự tư duy, phân tích cũng như nắm chắc kiến
thức cơ bản .
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
4
Đồ họa máy tính
CHƯƠNG II: PHÂN TÍCH
I. Các thuật toán và các phép biến hình cơ bản có liên quan
1.1 Các thuật toán vẽ đường thẳng
Void Bre(int x1, int y1, int x2, int y2) //Breshenham
{
int x=x1;
int y=y1;
int dx=x2-x1;
int dy=y2-y1;
float p=2*dy-dx;
int const1=dy;
int const2=2*(dy-dx);
putpixel(x,y,3);
while(x<x2)
{
if(p<0) p+=const1;
else {p+=const2; y++;}
x++;
putpixel(x,y,3);
}
}
Void Dda(int x1, int y1, int x2, int y2)
{
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
5
Đồ họa máy tính
int dx,dy,step;
float y_inc,x_inc,x,y;
dx= x2-x1;
dy= y2-y1;
if (abs(dx)>abs(dy)) step=abs(dx);
else step=abs(dy);
x_inc = (float) dx/step;
y_inc = (float) dy/step;
x=x1; y=y1;
putpixel((int)x, (int)y, 5);
for (int k=1; k<=step; k++){
x = x+x_inc;
y = y+y_inc;
putpixel((int) x, (int) y, 5);
delay(5);
}
}
1.2Các phép biến hình cơ bản:
Bản chất của các phép biến đổi hình học là sự thay đổi các mô tả về
tọa độ của đối tượng từ đó làm đối tượng thay đổi về hướng, kích thước
cũng như hình dạng.
Phép tịnh tiến
Ảnh của phép tịnh tiến theo vector (a,b) của điểm P(x,y) là điểm
Q(x*,y*)
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
6
Đồ họa máy tính
+=
+=
byy
axx
*
*
Vector tịnh tiến (a,b) còn gọi là “vector độ dời”. Chúng ta có thể áp
dụng quy tắc trên cho mọi điểm của đối tượng để dịch chuyển nó. Đơn giản
hơn, để tịnh tiến một đa giác chỉ cần tịnh tiến các đỉnh của nó rồi vẽ lại đa
giác mới. Tương tự, đối với đường tròn, ellip ta tịnh tiến tâm của chúng tới
vị trí mới rồi vẽ lại.
Nếu gọi ttx và tty lần lượt là độ dời theo trục hoành và trục tung thì
tọa độ của điểm mới Q(x’,y’) sau khi tịnh tiến điểm P(x,y) sẽ
là:
Khi đó (ttx,tty) được gọi là vecto tịnh tiến hay độ dời
Ma trận biến đổi
Thuật toán cài đặt
void TinhTien(float &x,float &y,float ttx,float tty)
{
x=x+ttx;
y=y+tty;
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
7
1 0 0
0 1 0
tlx tly 0
T=
Đồ họa máy tính
}
Hình 1.1 Phép tịnh tiến
Phép quay
Phép quay làm thay đổi hướng của đối tượng. Để xác định phép quay, ta
cần biết tâm quay và góc quay. Phép quay điểm P(x,y) quanh gốc tọa độ
một góc α tạo thành điểm ảnh Q(x*,y*) có công thức như sau:
+=
−=
αα
αα
cos.sin.*
sin.cos.*
yxy
yxx
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
8
Đồ họa máy tính
Thuật toán cài đặt
void Quay(float &x,float &y,float goc)
{
goc=(M_PI/180)*goc;
float a=x,b=y;
x=a*cos(goc)-b*sin(goc);
y=a*sin(goc)+b*cos(goc);
}
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
Phép quay quanh một điểm
180
0
9
Đồ họa máy tính
Hình 1.4 Phép quay (góc quay 90
0
)
II.Các phép biến hình kết hợp
Quá trình áp dụng các phép biến đổi liên tiếp để tạo nên một phép
biến đổi tổng thể được gọi là sự kết hợp các phép biến đổi.
2.1 Kết hợp các phép tịnh tiến
Nếu ta thực hiện các phép tịnh tiến lên P(x,y) được P’ rồi lại thực
hiện một phép tịnh tiến khác lên P’ ta được điểm Q’(x’,y’). Như vậy Q’ là
ảnh của hai phép tịnh tiến liên tiếp V(ttx1,tty1) và V’(ttx2,tty2) .
Ta có :
V*V’=
=
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
10
1 0 0
0 1 0
ttx2 tty2 0
1 0 0
0 1 0
ttx1 tty1 0
*
1 0 0
0 1 0
ttx1+ttx2 tty1+tty2 0
Đồ họa máy tính
Vậy kết hợp hai phép tịnh tiến là một phép tịnh tiến. Từ đó ta có thể
kết hợp của nhiều phép tịnh tiến cũng là một phép tịnh tiến.
Thuật toán cài đặt
Void TinhTien2LanDaGiac(int n,float ttx1,float tty1,float ttx2,float tty2)
{
for(int i=1;i<=n;i++)
{
TinhTien(X[i],Y[i],ttx1+ttx2,tty1+tty2);
}
}
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
11
Đồ họa máy tính
2.2 Phép quay với tâm bất kỳ
Phép quay quanh tâm quay A(x,y) góc quay α có thể phân tích thành
các phép biến hình cơ sở sau:
- Tịnh tiến theo vector (-x,-y) để đưa tâm quay về gốc tọa độ
- Quay quanh gốc tọa độ một góc α
- Tịnh tiến theo vector (x,y) để đưa đối tượng về chỗ cũ
Ma trận biến đổi
( ) ( )
−+−+−
−=
=
×
−×
−−
1cos1.sinsin.cos1
0cossin
0sincos
1
010
001
100
0cossin
0sincos
1
010
001
yxyx
yxyx
αααα
αα
αα
αα
αα
Thuật toán cài đặt
void QuayTamBatKy(int n,float a,float b,float goc)
{
float x[100],y[100];
for(int i=1;i<=n;i++)
{
x[i]=X[i];
y[i]=Y[i];
}
TinhTienDaGiac(n,-a,-b);
QuayDaGiac(n,goc);
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
12
Đồ họa máy tính
setcolor(YELLOW);
TinhTienDaGiac(n,a,b);
VeDaGiac(n);
}
Hình 2.2: Phép quay với tâm bất kì
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
13
Đồ họa máy tính
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH
III.Cài đặt chương trình
3.1 Giao diện chương trình
Demo chương trình bằng ngôn ngữ C++. Đầu tiên giao diện chương trình
sẽ xuất hiện.
Sau khi nhập giờ và nhập phút chương trình sẽ xuất hiện :
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
14
Đồ họa máy tính
3.2 Cài đặt chương trình
#include<iostream.h>
#include<conio.h>
#include<math.h>
#include<graphics.h>
#define PI 3.14159265
void tg(int x1, int y1, int x2, int y2,int c)
{
int y=y1;
for(int i=y1;i<=y2;i++)
{
y++;
putpixel(x1,int(y),c);
}
}
void bre1(int x1, int y1, int x2, int y2,int c)
{
int dy=y2-y1;
int dx=x2-x1;
int p=2*dy-dx;
int const1 = 2*dy;
int const2 = 2*(dy-dx);
int x=x1, y=y1;
putpixel(x,y,c);
while(x<=x2)
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
15
Đồ họa máy tính
{
if(p<0) p+=const1;
else {p+=const2; y++;}
x++;
putpixel(x,y,c);
}
}
void bre2(int x1, int y1, int x2, int y2,int c)
{
int dy=y2-y1;
int dx=x2-x1;
int p=dx-2*dy;
int const1 = -2*dy;
int const2 = -2*(dy+dx);
int x=x1, y=y1;
putpixel(x,y,c);
while(x<=x2)
{
if(p<0) p+=const1;
else {p+=const2; y ;}
x++;
putpixel(x,y,c);
}
}
void bre3(int x1, int y1, int x2, int y2,int c)
{
int dx, dy, x, y, p;
dx=x2-x1;
dy=y2-y1;
p=2*dx-dy;
int const1 = 2*dx;
int const2 = 2*(dx-dy);
x=x1; y=y1;
putpixel(x,y,c);
while(y<=y2)
{
if(p<0) p+=const1;
else
{ p+=const2; x++; }
y++;
putpixel(x,y,c);
}
}
void bre4(int x1, int y1, int x2, int y2,int c)
{
int dx, dy, x, y, p;
dx=x2-x1;
dy=y2-y1;
p=-2*dx-dy;
int const1 = -2*dx;
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
16
Đồ họa máy tính
int const2 = -2*(dx+dy);
x=x1; y=y1;
putpixel(x,y,c);
while(y<=y2)
{
if(p<0) p+=const1;
else
{ p+=const2; x ; }
y++;
putpixel(x,y,c);
}
}
void bre(int x1, int y1, int x2, int y2,int c)
{
float m=float(y2-y1)/(x2-x1);
if(m>=0&&m<=1)
{
if(x1<x2) bre1(x1,y1,x2,y2,c);
else bre1(x2,y2,x1,y1,c);
}
else if(m>1)
{
if(y1<y2) bre3(x1,y1,x2,y2,c);
else bre3(x2,y2,x1,y1,c);
}
else if(m>=-1&&m<0)
{
if(x1<x2) bre2(x1,y1,x2,y2,c);
else bre2(x2,y2,x1,y1,c);
}
else if(m<-1)
{
if(y1<y2) bre4(x1,y1,x2,y2,c);
else bre4(x2,y2,x1,y1,c);
}
else
{
if(y1<y2) tg(x1,y1,x2,y2,c);
else tg(x2,y2,x1,y1,c);
}
}
void ktdh()
{
int mh=6;
int mode=0;
initgraph(&mh,&mode,"");
};
int D(int t2,int t1)
{
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
17
Đồ họa máy tính
ktdh();
setcolor(7);
double x,n,y;
n= 6;
int t3,t4,t=0;
t3=5*t1;
while(1)
{
t++;
//kim giay
bre(320,240,(int)((double)100*sin ((-n*t*PI)/180+PI))+320,(int)((double)100*cos
((-n*t*PI)/180+PI))+240,14);
if(t%60==0)
{
t2++;
}
//kim phut
bre(320,240,(int)((double)70*sin ((-n*t2*PI)/180+PI))+320,(int)((double)70*cos
((-n*t2*PI)/180+PI))+240,14);
if(t%720==0)
{
t3++;
}
//kim gio
bre(320,240,(int)((double)50*sin ((-n*t3*PI)/180+PI))+320,(int)((double)60*cos
((-n*t3*PI)/180+PI))+240,14);
//khung dong ho
bre(150,70,150,400,14);
bre(150,70,480,70,14);
bre(480,70,480,400,14);
bre(150,400,480,400,14);
bre(160,60,150,70,2);
bre(160,60,490,60,2);
bre(490,60,480,70,2);
bre(490,60,490,390,2);
bre(490,390,480,400,2);
// Cac chi so
for(int t1=1;t1<61;t1++)
{
int x1,y1,x2,y2;
x1=(int)((double)108*sin ((-n*t1*PI)/180+PI))+320;
y1=(int)((double)108*cos ((-n*t1*PI)/180+PI))+240;
x2=(int)((double)115*sin ((-n*t1*PI)/180+PI))+320;
y2=(int)((double)115*cos ((-n*t1*PI)/180+PI))+240;
bre(x1,y1,x2,y2,3);
}
for(int t1=1;t1<13;t1++)
{
int x1,y1,x2,y2;
x1=(int)((double)125*sin ((-30*t1*PI)/180+PI))+320;
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
18
Đồ họa máy tính
y1=(int)((double)125*cos ((-30*t1*PI)/180+PI))+240;
x2=(int)((double)108*sin ((-30*t1*PI)/180+PI))+320;
y2=(int)((double)108*cos ((-30*t1*PI)/180+PI))+240;
bre(x1,y1,x2,y2,3);
}
for(int t1=1;t1<5;t1++)
{
int x1,y1,x2,y2;
x1=(int)((double)130*sin ((-90*t1*PI)/180+PI))+320;
y1=(int)((double)130*cos ((-90*t1*PI)/180+PI))+240;
x2=(int)((double)108*sin ((-90*t1*PI)/180+PI))+320;
y2=(int)((double)108*cos ((-90*t1*PI)/180+PI))+240;
bre(x1,y1,x2,y2,3);
}
//in 12 so dong ho
outtextxy(386,116,"1");
outtextxy(433,166,"2");
outtextxy(455,233,"3");
outtextxy(432,305,"4");
outtextxy(386,350,"5");
outtextxy(316,376,"6");
outtextxy(246,350,"7");
outtextxy(199,305,"8");
outtextxy(178,233,"9");
outtextxy(193,166,"10");
outtextxy(245,116,"11");
outtextxy(312,90,"12 ");
outtextxy(260,180," Happy new year");
delay(100);
cleardevice();
}
closegraph();
}
int main()
{
cout<< " "<<endl;
cout<< " "<<endl;
cout<<" CHUONG TRINH MO PHONG HOAT DONG DONG HO
"<<endl<<endl;
cout<<" Giao Vien Huong Dan: NGUYEN THI CAM NGOAN
"<<endl<<endl;
cout<<" SV Thuc Hien: Nhom 20 Lop KHPM2 - K6"<<endl;
cout<<"
"<<endl<<endl<<endl;
int t2,t1;
cout<< " "<<endl;
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
19
Đồ họa máy tính
cout<< " "<<endl;
cout<<"\nNhap vao thoi gian dong ho bat dau chay"<<endl;
int t2,t1;
cout<<"Nhap vao thoi gian dong ho bat dau chay"<<endl;
do
{
cout<<"Nhap gio: ";cin>>t1;
}
while(t1<0||t1>24);
do
{
cout<<"Nhap phut: ";cin>>t2;
}
while(t2<0||t2>60);
D(t2,t1);
getch();
}
LỜI KẾT
Vận dụng kiến thức cơ sở về đồ họa được học ở trường, kết hợp với
những tài liệu tham khảo trên mạng , sách báo, và đặc biệt là sự hướng dẫn
của thầy, cô nhóm thực hiện chúng em đã hoàn thành bài tập lớn. Qua bài
báo cáo chúng em muốn gửi lời cảm ơn cô giáo hướng dẫn , rất cảm ơn cô
đã nhiệt tình dạy bảo và hướng dẫn chúng em hoàn thành bài tập lớn này.
Trong qua trình hoàn thành bài báo cáo không tránh khỏi thiếu sót .Vì thế ,
nhóm chúng em rất mong nhận được chỉ dẫn, bổ sung, sửa chữa, những
đóng góp và sự cảm thông sâu sắc của thầy, cô cũng như bạn bè để bài tập
của chúng em được hoàn thiện hơn.
Xin chân thành cảm ơn!
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
20
Đồ họa máy tính
Nhóm 20-KHMT2-K6 ĐH Công Nghiệp Hà Nội
21