Đồ 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ô
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*)
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
,
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:
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
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];
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
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)
{
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);
}
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 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