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.
Trang 1Đồ 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
Trang 2Lờ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ểnthị 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ênquan í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ọchọa hình, quang học…… và kĩ thuật máy tính và đặc biệt là chế tạo phầncứ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 haichiề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ầnmề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úpcác em có thể hiểu rõ hơn về các phép biến đổi hình học trong không gianthự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ềuhạ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
Trang 3Đồ họa máy tính Đại học Công Nghiệp Hà Nội
MỤC LỤC
CHƯƠNG I: KHẢO SÁT 4
I Mục đích nghiên cứu 4
II Đối tượng nghiên cứu 4
III Khảo sát 4
IV Hướng giải quyết 5
CHƯƠNG II: PHÂN TÍCH 6
I Các phép biến hình cơ bản 6
1.1 Phép tịnh tiến 6
1.2 Phép biến đổi tỉ lệ 7
1.3 Phép đối xứng 9
1.4 Phép quay 12
II Các phép biến hình kết hợp 13
2.1 Kết hợp các phép tịnh tiến 13
2.2 Kết hợp các phép biến đổi tỉ lệ 15
2.3 Phép quay với tâm bất kỳ 16
2.4 Kết hợp phép quay và phép biến đổi tỉ lệ 18
2.5 Kết hợp phép tịnh tiến và phép biến đổi tỉ lệ 19
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH 20
III Triển khai ứng dụng 20
3.1 Giao diện chương trình 20
3.2 Cài đặt chương trình 21
Trang 4CHƯƠ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ồmcó: 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à
Trang 5Đồ 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 sinhnắm chưa chắc, chưa hiểu bản chất Óc tư duy hàm, tư duy logic khả năngkhá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ếnhì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ềmgiú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ậttoán và các ứng dụng của nó
Trang 6CHƯƠ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ướccũng như hình dạng
a x x
*
*
Vector tịnh tiến (a,b) còn gọi là “vector độ dời” Chúng ta có thể ápdụng quy tắc trên cho mọi điểm của đối tượng để dịch chuyển nó Đơn giảnhơ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 đagiá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ẽ
Trang 7Đồ họa máy tính Đại học Công Nghiệp Hà Nội
void TinhTien(float &x,float &y,float ttx,float tty)
Ma trận biến đổi
x’=x*tlx;
y’=y*tly;
Trang 8 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 đổiphó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 , đốitượ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;
}
Trang 9Đồ họa máy tính Đại học Công Nghiệp Hà Nội
0 1 0
0 0 1 ,
1 0 0
0 1 0
0 0 1
Oy
M
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;
}
Trang 10Hình 1.3.1 Phép đối xứng với tâm bất kì
Trang 11Đồ 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
Trang 12Phé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:
.
*
sin cos
.
*
y x
y
y x
x
Thuật toán cài đặt
void Quay(float &x,float &y,float goc)
Trang 13Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Trang 14Vậ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)
Trang 15Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Thuật toán cài đặt
void TiLeDaGiac2Lan(int n,float tlx1,float tly1,float tlx2, float tly2){
Trang 16Hì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ànhcá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
Trang 17Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Hình 2.3 : Phép quay với tâm bất kì
2.4 Kết hợp phép quay và phép biến đổi tỉ lệ
Trang 18Ta có điểm M biến đổi thành M1 qua phép biến đổi tỉ lệ T1 rồi từ M1
biến đổi thành M2 qua phép quay T2 Như vậy biến đổi điểm M thành M2
kết hợp của 2 phép biến đổi
M T1 M1 T2- M2
Thuật toán cài đặt
void QuayTiLe(int n,float tlx,float tly, float goc)
Trang 19Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Ta có điểm M biến đổi thành M1 qua phép tịnh tiến T1 rồi từ M1 biến đổi thành M2 qua phép biến đổi tỉ lệ T2 Như vậy biến đổi điểm M thành M2
kết hợp của 2 phép biến đổi
M T1 M1 T2- M2
Thuật toán cài đặt
void TinhTien_BienDoiTiLe(int n, float ttx,float tty,float tlx,float tly){
Trang 20CHƯƠ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
Trang 21Đồ 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ố
Trang 22//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;
//Ham chuyen den
void ChuyenDen(float x, float y)
Trang 23Đồ họa máy tính Đại học Công Nghiệp Hà Nội
//Tinh tien 1 diem
void TinhTien(float &x,float &y,float ttx,float 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)
Trang 24//Quay 1 diem quanh tam bat ky
void QuayTambatKy(float &x,float &y,float xtam,float ytam,float 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;
Trang 25Đồ họa máy tính Đại học Công Nghiệp Hà Nội
Trang 26}
}
//Tinh tien n giac
void TinhTienDaGiac(int n,float ttx,float tty)
// ham tinh tien da giac 2 lan
void TinhTien2LanDaGiac(int n,float ttx1,float tty1,float ttx2,float tty2){
//Quay da giac quanh tam O
void QuayDaGiac(int n,float goc)
{
for(int i=1;i<=n;i++)
Quay(X[i],Y[i],goc);
}
//Quay da giac quanh 1 tam bat ky
void QuayTamBatKy(int n,float a,float b,float goc)
Trang 27Đồ họa máy tính Đại học Công Nghiệp Hà Nội
ChuyenDen(X[n],Y[n]);
for(int i=1;i<=n;i++)
VeDen(X[i],Y[i]);
}
//Ham bien doi ti le da giac 2 lan
void TiLeDaGiac2Lan(int n,float tlx1,float tly1,float tlx2, float tly2)
//Doi xung tam bat ky trong da giac
void DoiXungTamBatKy(int n,float xtam,float ytam)
Trang 28//Doi xung da giac qua duong thang ax+by+c=0
void DoiXungDuong(int n,float a,float b,float c)
//ket hop phep quay va bien doi ti le
void QuayTiLe(int n,float tlx,float tly, float goc)
//ket hop ham tinh tien va bien doi ti le
void TinhTien_BienDoiTiLe(int n, float ttx,float tty,float tlx,float tly){
Trang 29Đồ họa máy tính Đại học Công Nghiệp Hà Nội
cout<<" Giao Vien Huong Dan: ThS.NGUYEN THI CAM NGOAN"<<endl<<endl;
cout<<" SV Thuc Hien: Nhom 12 Lop KTPM1 –
K6"<<endl;
cout<<"
-"<<endl<<endl<<endl; Mylabel1:;
system("color 4f");
cout<<"Xin moi nhap lua chon: "<<endl<<endl;
cout<<" 1.Cac phep bien hinh co ban "<<endl;
cout<<" 2.Cac phep bien hinh ket hop "<<endl;
cout<<" 3.Danh Sach Nhom "<<endl;
Trang 30cout<<"toa do tamx: =";cin>>xtam;
cout<<"toa do tamy: =";cin>>ytam;
Trang 31Đồ họa máy tính Đại học Công Nghiệp Hà Nội
}
else {
cout<<"Nhap sai phep bien hinh \n"; cout<<"Moi ban nhap l trong cac phep bien hinh: "<<endl; goto MylabelDT1; }
if((i=1)||(i=2)||(i=3)||(i=4)||(i=5)) {
cout<<endl; cout<<"Ban co muon tiep tuc khong?: \n"<<endl; MylabelDT2:; int t; cout<<"1.Quay lai tu dau 2 Tiep tuc 3.Thoat \n"; cin>>t; if(t==1) {
system("cls");
cleardevice();
VeTruc(); goto Mylabel1; }
if(t==2) {
system("cls"); VeTruc(); goto MylabelDT1;
}
else if(t==3) exit(0); else {
cout<<" Hay nhap lai lua chon :\n"; goto MylabelDT2; }
}
}
} if(m==2) {
float a,b,c,d;
lb5:;
cout<<"Ban hay nhap so dinh cua da giac: ";cin>>n;
VenGiac(n);
if(n<=0)
Trang 32cout<<"1.Tinh tien 2 lan 2.Ti le 2 lan 3.Quay tam bat ki
4.Quay+ti le 5.Tinh tien+ti le"<<endl;
cin>>chon[i];setcolor(YELLOW);
if(chon[i]==1)
{
cout<<"nhap ttx1=";cin>>a;
Trang 33Đồ họa máy tính Đại học Công Nghiệp Hà Nội
cout<<"nhap tly: ";cin>>tly;
cout<<"nhap goc: ";cin>>goc;
cout<<"Nhap sai toa do \n";
cout<<"Moi ban nhap lai toa do: "<<endl;
Trang 34cout<<" 2: Nguyen Van Duy "<<endl;
cout<<" 3: Ngo Minh Duc"<<endl;
cout<<"Ban co muon tiep tuc khong?: \n";
Trang 35Đồ họa máy tính Đại học Công Nghiệp Hà Nội
cout<<"Ban da nhap sai: \n";
cout<<"Ban co muon tiep tuc khong?: \n";