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

Xây dựng chương trình hỗ trợ giảng dạy môn Đồ Họa Máy Tính minh hoạ các phép biến đổi Affine trong không gian 2D

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 (513.92 KB, 35 trang )

Đồ họa máy tính Đại học Công Nghiệp Hà Nội
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: Xây dựng chương trình hỗ trợ giảng dạy môn Đồ Họa
Máy Tính minh hoạ các phép biến đổi Affine trong không
gian 2D
Giáo viên hướng dẫn: ThS.Nguyễn Thị Cẩm Ngoan
Sinh viên thực hiện (Nhóm 12):
1. Bùi Đức Tuân
2. Nguyễn Văn Duy
3. Ngô Minh Đức
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
1
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
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 thực hai
chiều là một trong những nội dung quan trọng.
Qua thời gian tìm hiểu nhóm quyết định trọn đề tài Xây dựng phần
mềm hỗ trợ học sinh cấp hai học về các phép biến đổi hình học nhằm giúp
các em có thể hiểu rõ hơn về các phép biến đổi hình học trong không gian
thực hai chiều.
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 5 tháng 8 năm 2013
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
2
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
MỤC LỤC
Đề tài: Xây dựng chương trình hỗ trợ giảng dạy môn Đồ Họa Máy Tính minh hoạ
các phép biến đổi Affine trong không gian 2D 1
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH 20
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
3
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
CHƯƠNG I: KHẢO SÁT
I. Mục đích nghiên cứu
Tìm ra phương pháp dạy phù hợp giúp học sinh nắm bắt và hiểu
rõ các phép biến hình và ứng dụng của nó trong việc giải toán. Từ đó
nâng cao chất lượng của học sinh trong từng tiết học.
II. Đối tượng nghiên cứu
Các phép biến hình và ứng dụng của nó trong giảng dạy.
III. Khảo sát
Qua cuốn sách Toán học của tất cả các lớp thuộc khối Trung học
cơ sở từ lớp 6 đến lớp 9. Chúng tôi tìm hiểu các phép biến hình cơ bản gồm
có: phép tịnh tiến, phép biến đổi tỉ lệ, phép đối xứng tâm và phép quay…
Vì điều kiện cơ sở vật chất trong các trường học cũng như thời gian
dạy trên lớp còn hạn chế chính vì vậy việc nhận thức kiến thức của các em
thể hiện rõ.
 Các em còn lúng túng trong việc tìm ảnh của một phép biến hình.
 Kiến thức cơ bản nắm chưa chắc.
 Khả năng tưởng tượng, tư duy hàm, tư duy lôgic còn hạn chế.
 Ý thức học tập của học sinh chưa thực sự tốt.

 Nhiều học sinh có tâm lý sợ môn hình học.
Đây là môn học yêu cầu sự tư duy, phân tích của các em . Thực sự là
khó không chỉ đối với học sinh mà còn khó đối với cả giáo viên trong việc
truyền tải kiến thức đến các em. Nhiều em hổng kiến thức từ lớp dưới ý
thức học tập chưa cao nên chưa xác định được động cơ học tập chưa thấy
được ứng dụng to lớn của môn hình học trong đời sống.
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
4
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
IV. Hướng giải quyết
Trong giờ học về các phép biến hình và ứng dụng của nó học sinh
nắm chưa chắc, chưa hiểu bản chất. Óc tư duy hàm, tư duy logic khả năng
khái quát phân tích còn hạn chế, đặc biệt là phần ứng dụng các phép biến
hình. Vì vậy học sinh còn lúng túng và xa lạ, khó hiểu vì vậy phần mềm
giúp các em hiểu rõ hơn về các phép biến hình về hình ảnh cũng như thuật
toán và các ứng dụng của nó.
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
5
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
CHƯƠNG II: PHÂN TÍCH
I. Cá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*)





+=
+=
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
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
6
1 0 0
0 1 0
tlx tly 0
T=
Đồ họa máy tính Đại học Công Nghiệp Hà 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;
}

Hình 1.1 Phép tịnh tiến
Phép biến đổi tỉ lệ
Phép biến đổi tỉ lệ làm thay đổi kích thước của đối tượng. Để co hay
dãn tọa độ của một điểm P(x,y) theo trục hoành và trục tung lần lượt là tlx,
tly ta nhân lần lượt tlx và tly vào các tọa độ của P
Ma trận biến đổi
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
7
x’=x*tlx;
y’=y*tly;
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
 Khi các giá trị tlx và tly nhỏ hơn 1 thì phép biến đổi tỉ lệ thu nhỏ
đối tượng và ngược lại khi các phép biến đổi lớn hơn 1 phép biến đổi
phóng to đối tượng
 Khi tỉ lệ tlx=tly ta gọi đó là phép đồng dạng. Phép đồng dạng là
phép biến đổi bảo toàn tính cân xứng của đối tượng.
 Tâm tỉ lệ là điểm không bị thay đổi qua các phép biến đổi tỉ lệ.
 Nhận xét : Khi phép biến đổi tỉ lệ thu nhỏ đối tượng, đối tượng sẽ
được dời về gần gốc tọa độ hơn, tương tự khi phóng lớn đối tượng , đối
tượng sẽ được dịch chuyển xa gốc tọa độ hơn.
 Thuật toán cài đặt
void BienDoiTiLe(float &x,float &y,float tlx,float tly)
{
x=x*tlx; y=y*tly;
}
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
8
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Hình 1.2 Phép biến đổi tỉ lệ
Phép đối xứng

Phép đối xứng trục có thể xem là phép quay 180
0
quanh trục đối
xứng. Phép đối xứng qua trục hoành và trục tung có ma trận lần lượt là:











=










−=
100
010
001

,
100
010
001
OyOx
MM
 Thuật toán cài đặt
void DoiXung(float &x,float &y,float xtam,float ytam)
{
x=2*xtam-x;
y=2*ytam-y;
}
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
9
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Hình 1.3.1 Phép đối xứng với tâm bất kì
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
10
Đồ họa máy tính Đại học Công Nghiệp Hà Nội

Hình 1.3.2 Phép đối xứng đường
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
11
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
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
 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 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
Phép quay quanh một điểm
180
0
12
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
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 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
13
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 Đại học Công Nghiệp Hà Nội
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 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội

14
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
2.2 Kết hợp các phép biến đổi tỉ lệ
Tương tự như phép tịnh tiến, ta có tọa độ điểm Q(x’,y’) là điểm có
được sau khi kết hợp hai phép tỉ lệ M
1
(tlx1,tly1) và M
2
(tlx2, tly2)
Ta có:
M
1
(tlx1,tly1).M
2
(tlx2,tly2) tlx1 0 0 tlx2 0 0
0 tly1 0 . 0 tly2 0
0 0 1 0 0 1
tlx1*tlx2 0 0
= 0 tly1*tly2 0
0 0 0

Vậy kết hợp 2 phép tỉ lệ là một phép tỉ lệ: như vậy ta dễ dàng mở
rộng cho kết quả kết hợp nhiều phép tỉ lệ cũng là một phép tỉ lệ.
 Thuật toán cài đặt
void TiLeDaGiac2Lan(int n,float tlx1,float tly1,float tlx2, float tly2)
{
for(int i=1;i<=n;i++)
BienDoiTiLe(X[i],Y[i],tlx1*tlx2,tly1*tly2);
ChuyenDen(X[n],Y[n]);
for(int i=1;i<=n;i++)

VeDen(X[i],Y[i]);
}
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
15
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Hình 2.2: Phép biến đổi tỉ lệ 2 lần
2.3 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
αααα
αα
αα
αα
αα
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
16
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
 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);
setcolor(YELLOW);
TinhTienDaGiac(n,a,b);
VeDaGiac(n);
}
Hình 2.3 : Phép quay với tâm bất kì
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
17
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
2.4Kết hợp phép quay và phép biến đổi tỉ lệ
Ta có điểm M biến đổi thành M
1
qua phép biến đổi tỉ lệ T
1
rồi từ M
1
biến đổi thành M
2
qua phép quay T
2
. Như vậy biến đổi điểm M thành M
2
kết hợp của 2 phép biến đổi.
M T
1
M
1
T

2
- M
2
 Thuật toán cài đặt
void QuayTiLe(int n,float tlx,float tly, float goc)
{
QuayDaGiac(n,goc);
TiLeDaGiac(n,tlx,tly);
VeDaGiac(n);
}
Hình 2.4 Kết hợp phép quay và phép biến đổi tỉ lệ
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
18
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
2.5 Kết hợp phép tịnh tiến và phép biến đổi tỉ lệ
Ta có điểm M biến đổi thành M
1
qua phép tịnh tiến T
1
rồi từ M
1
biến
đổi thành M
2
qua phép biến đổi tỉ lệ T
2
. Như vậy biến đổi điểm M thành M
2
kết hợp của 2 phép biến đổi.
M T

1
M
1
T
2
- M
2
 Thuật toán cài đặt
void TinhTien_BienDoiTiLe(int n, float ttx,float tty,float tlx,float tly)
{
TinhTienDaGiac(n,ttx,tty);
TiLeDaGiac(n,tlx,tly);
VeDaGiac(n);
}

Hình 2.6 Kết hợp phép tịnh tiến và phép biến đổi tỉ lệ
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
19
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH
III. Triển khai ứng dụng
3.1 Giao diện chương trình
Các thuật toán các phép biến hình được Demo thành 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.
Thông qua menu chương trình chính để ta lựa chọn các thuật toán như các
phép biến hình cơ bản và các phép biến hình kết hợp…bằng cách nhấn các số từ
1→4 để lựa chọn . Minh họa màn hình giao diện xuất hiện như sau:
Đây là giao diện để vẽ một đa giác n đỉnh.
Danh sách các thành viên trong nhóm
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội

20
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Sau đó người dùng quay lại menu chính bằng cách nhấn phím số 1 hoặc số
2 để lựa chọn các phép biến hình
3.2 Cài đặt chương trình
#include <iostream>
#include <conio.h>
#include <math.h>
#include <graphics.h>
#include <windows.h>
#include <stdio.h>
#include<stdlib.h>
using namespace std;
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
21
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
//Danh sách các biên
int xv1, yv1, xv2, yv2;
float x,y,xw1, yw1, xw2, yw2, tlx, tly,a,b,c;
float X[100],Y[100],goc;float r,xtam,ytam;
//Cua so
void CuaSo(float x1, float y1, float x2, float y2)
{
xw1 = x1; yw1 = y1;
xw2 = x2; yw2 = y2;

}
//Khung nhin
void KhungNhin(int x1, int y1, int x2, int y2)
{

xv1 = x1; yv1 = y1;
xv2 = x2; yv2 = y2;
tlx = (xv2 - xv1) / (xw2 - xw1);
tly = (yv2 - yv1) / (yw2 - yw1);
}
//Ham chuyen den
void ChuyenDen(float x, float y)
{
int xm = (int)(tlx * (x - xw1) + xv1 );
int ym = (int)(tly * (yw2 - y) + yv1 );
moveto(xm, ym);
}
//Ham ve den
void VeDen(float x, float y)
{
int xm = (int)(tlx * (x - xw1) + xv1 );
int ym = (int)(tly * (yw2 - y) + yv1 );
lineto(xm, ym);
}
//Ham ve truc
void VeTruc()
{
setcolor(WHITE);
// Ve truc Ox
ChuyenDen(xw1, 0);
VeDen(xw2, 0);
ChuyenDen(xw2-0.4,-0.5);
outtext("x");
// Ve truc Oy
ChuyenDen(0, yw1);

VeDen(0, yw2);
ChuyenDen(-0.8,yw2);
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
22
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
outtext("y");
ChuyenDen(-1,-0.4);
outtext("O");
x=xw1+1;
while(x<xw2)
{
y=0;
ChuyenDen(x,y-0.04);
VeDen(x,y+0.04);
x=x+1;
}
y=yw1+1;
while(y<yw2)
{

x=0;
ChuyenDen(x-0.04,y);
VeDen(x+0.04,y);
y=y+1;
}
ChuyenDen(-0.2,yw2-0.2);
VeDen(0,yw2);VeDen(0.2,yw2-0.2);
ChuyenDen(xw2-0.2,-0.2);
VeDen(xw2,0);VeDen(xw2-0.2,0.2);
}

//Tinh tien 1 diem
void TinhTien(float &x,float &y,float ttx,float tty)
{
x=x+ttx;
y=y+tty;

}
//Bien doi ti le 1 diem
void BienDoiTiLe(float &x,float &y,float tlx,float tly)
{
x=tlx*x;
y=tly*y;
}
//Quay 1 diem quanh tam O
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 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
23
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
//Quay 1 diem quanh tam bat ky
void QuayTambatKy(float &x,float &y,float xtam,float ytam,float goc)
{
goc=(M_PI/180)*goc;
float a=x+xtam,b=y+ytam;
x=a*cos(goc)-b*sin(goc);

y=a*sin(goc)+b*cos(goc);
}
//Doi xung tam O 1 diem
void DoiXungTamO(float &x,float &y)
{
x=-x;
y=-y;
}
//Doi xung tam bat ky
void DoiXung(float &x,float &y,float xtam,float ytam)
{
x=2*xtam-x;
y=2*ytam-y;
}
//Doi xung 1 diem qua Ox
void DoiXungOX(float x,float &y)
{
y=-y;
}
//Doi xung 1 diem qua Oy
void DoiXungOy(float &x,float y)
{
x=-x;
}
//Doi xung qua duong thang ax+by+c=0 bo
void DXDuong(float &x,float &y,float a,float b,float c)
{
float t=(a*x+b*y+c)/(a*a+b*b);
x=x-2*t*a;
y=y-2*t*b;

}
//Ve duong thang ax+by+c=0 bo
void VeDuong(float a,float b,float c)
{
if(a==0)
{
ChuyenDen(xw1,-c/b);
VeDen(xw2,-c/b);
}
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
24
Đồ họa máy tính Đại học Công Nghiệp Hà Nội
if(b==0)
{
ChuyenDen(-c/a,yw1);
VeDen(-c/a,yw2);
}
if(a*b!=0)
{
if((yw1<=(-a*xw1-c)/b)&&(-a*xw1-c)/b<=yw2)
{
ChuyenDen(xw1,(-a*xw1-c)/b);
VeDen(xw2,(-a*xw2-c)/b);
}
else
{
ChuyenDen((-c-b*yw2)/a,yw2);
VeDen((-c-b*yw1)/a,yw1);
}
}

}
//Ve da giac n dinh
void VenGiac(int n)
{
for(int i=1;i<=n;i++)
{
cout<<" Nhap toa do diem "<<i<<endl<<endl;
cout<<"toa do x: ";
cin>>X[i];
cout<<"toa do y: ";
cin>>Y[i];
cout<<endl;
}
ChuyenDen(X[n],Y[n]);
for(int i=1;i<=n;i++)
{
VeDen(X[i],Y[i]);
}
}
void VeDaGiac(int n)
{
ChuyenDen(X[n],Y[n]);
for(int i=1;i<=n;i++)
{
VeDen(X[i],Y[i]);
Nhóm 12-KTPM1-K6 ĐH Công Nghiệp Hà Nội
25

×