Tải bản đầy đủ (.docx) (23 trang)

Đề tài vẽ chữ l, dùng phím điều khiển di chuyển minh họa các phép tịnh tiến, đối xứng qua trái, qua phải và quay

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 (271.96 KB, 23 trang )

Đồ họa máy tính ĐH 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 8: Vẽ chữ L, dùng phím điều khiển di chuyển minh họa các phép
tịnh tiến, đối xứng qua trái, qua phải và quay.
Giáo viên hướng dẫn: ThS.Nguyễn Thị Cẩm Ngoan
Sinh viên thực hiện:
1. Nguyễn Mạnh Thắng
2. Vũ Lương Bằng
3. Ngô Xuân Long
1
Đồ họa máy tính ĐH 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 chúng em đã được giao làm đề tài: Vẽ chữ L,
dùng phím điều khiển di chuyển minh họa các phép tịnh tiến, đối xứng qua trái,
qua phải và quay.
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 28 tháng 2 năm 2013


2
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
MỤC LỤC
Chương I: KHẢO SÁT
I. Mục đích nghiên cứu
II. Đối tượng nghiên cứu
III. Khảo sát
IV. Hướng giai quyết
Chương II: PHÂN TÍCH
I. Các giải thuật sinh thực thể cơ sở
1) Giả thuật trung điểm-Midpoint
2) Thuật toán MidPoint vẽ đường thẳng
II. Các phép biến hình cơ bản
1) Phép tịnh tiến
2) Phép quay
3) Đối xứng
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH
1. Giao diện chương trình
2. Cài đặt chương trình
TỰ ĐÁNH GIÁ
Ưu điểm
Khuyết điểm
Hướng giải quyết
KẾT LUẬN
3
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
CHƯƠNG I: KHẢO SÁT
I. Mục đích nghiên cứu
Tạo ra chữ L có thể dùng phím điều khiển di chuyển minh họa các phép tịnh
tiến, đối xứng( Qua trái, qua phải, lên, xuống) và phép quay.

II. Đối tượng nghiên cứu
Vẽ đường thẳng bằng thuật toán MidPoint, thuật toán dung phím điều khiển
di chuyển minh họa các phép tịnh tiến, đối xứng( qua trái, qua phải, lên, xuống), và
phép quay.
III. Khảo sát
Qua khảo sát trên các máy tính sử dụng hệ điều hành Windows 7, 8 , trên
Win XP thì chương trình đều sử dụng được, di chuyển bằng phím điều khiển minh
họa các phép tịnh tiến, đối xứng (qua trái, qua phải, lên, xuống), và phép quay
chưa thực hiện được trong một số trường hợp.
IV. Hướng giải quyết
Tìm thêm tài liệu và nghiên cứu them về phép quay.
CHƯƠNG II: PHÂN TÍCH
4






A
B


A
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
I. Các giải thuật sinh thực thể cơ sở
1) Giả thuật trung điểm-Midpoint
Jack Bresenham 1965 / Pitteway 1967, áp dụng cho việc sinh các đường thẳng và
đường tròn 1985.
Xét trung điểm của đoạn AB (M)

Nếu M ở trên đoạn thẳng AB thì chọn B còn M ở dưới đoạn thẳng AB chọn A
Công thức đơn giản hơn, tạo được các điểm tương tự như với Bresenham
d = f(x + 1, y + 1/2) là trung điểm của đoạn AB
Mô tả giải thuật Midpoint
So sánh hay kiểm tra M sẽđược thay bằng việc xét giá trị d.
- d > 0 điểm B được chọn khi đó yi+1 = yi
- nếu d < 0 điểm A được chọn khi đó yi+1 = yi + 1
Trường hợp d = 0 chúng ta có thể chọn điểm bất kỳ hoặc A, hoặc B. Sử dụng
phương pháp biểu diễn không tường minh
f(x,y)= ax +by +c =0 (1)dx =x2 –x1 dy =y2 –y1
Biểu diễn tường minh:
5
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
y= (dy/dx)x +B hay
f(x,y)=0= xdy - ydx +Bdx (2)
So sánh (1) và (2)
a=dyb=-dx c= Bdx
Có f(x,y)=0 với mọi (x,y) thuộc đường thẳng
Đặt d =f(xi +1,yi +1/2) = a(xi +1) +b(yi +1/2) +c
+ Nếu chọn A (d<0) thì M sẽ tăng theo 2 hướng x,y
d =f(xi +2,yi +3/2) = a(xi+2) +b(yi +3/2) +c
di+1 – di = a+b
Hay di+1 = di + dy - dx
+ Nếu chọn B (d>0) thì M sẽ tăng theo x
di+1 =f(xi +2,yi +1/2) = a(xi +2) +b(yi +1/2) +c
di+1 - di = a
Hay di+1 = di + dy
Tính d1 ?
d1 = f(x1 +1,y1 +1/2) = a(x1 +1) +b(y1 +1/2) +c
= ax1 +by1 +c +a +1/2 b = f(x1 ,y1 ) +a +b/2

Có (x1 ,y1 ) là điểm bắt đầu, nằm trên đoạn thẳng nên f(x1 ,y1 ) = 0
6
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
Vậy d1 = a+ b/2 = dy - dx/2
2) Thuật toán MidPoint vẽ đường thẳng:
void MidPoint(int x1,int y1,int x2,int y2,int color)
{
int x=x1;
int y=y1;
int dx=x2-x1;
int dy=y2-y1;
putpixel(x1,y1,color);
if (dy<dx)
{
float P=dy-dx/2;
while (x<x2)
{
if (P>=0)
{
putpixel(x+1,y+1,color);
y++;
P+=dy-dx;
7
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
}
else
{
putpixel(x+1,y,color);
P+=dy;
}

x++;
}
}
else
{
float P=dx/2-dy;
while (y<=y2)
{
if (P>=0)
{
putpixel(x+1,y+1,color);
x++;
P+=dx-dy;
8
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
}
else
{
putpixel(x,y+1,color);
P+=dx;
}
y++;
}
}
putpixel(x2,y2,color);
}
II. 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.

1) Phép tịnh tiến
Để tịnh tiến một điểm P(x,y) từ vị trí này sang vị trí khác trong mặt phẳng, ta cộng
them các giá trị mô tả độ dời vào các tọa độ của P. Nếu gọi trx và try 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’) sẽ là:
X’=x+trx
9
P
x
y
Q
tr
x
tr
y
y
x
(2, 3) (4 , 3)
(6, 1) (8 , 1)
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
Y=’y+try
(trx,try) còn được gọi là vector tịnh tiến hay vector độ dời.
Chúng ta có thể dịch chuyển toàn bộ một đối tượng bằng cách áp dụng quy tắc trên
cho mọi điểm thuộc đối tượng. Để tịnh tiến một đoạn thẳng, đơn giản chỉ cần tịnh
tiến hai điểm đầu và cuối của nó rồi sau đó vẽ lại đoạn thẳng nối hai điểm mới. Với
đa giác, ta tịnh tiến các đỉnh của nó sau đó vẽ lại đa giác với các đỉnh mới. Một
cách tương tự, để tịnh tiến các đối tượng như đường tròng, ellipse, ta tịnh tiến tâm
của chúng tới vị trí mới rồi vẽ lại.
(a) (b)
(b)
Phép tịnh tiến một điểm (a) và đối tượng với vectortinhj tiến(b)

Biểu diễn phép tịnh tiến dưới dạng tọa độ thuần nhất:
1 0 0
(x’ y’ 1)=(x y 1) 0 1 0
Trx try 1
1 0 0
Hay Q=P.M
t(trx,try) với Mt(trx,try) = 0 1 0

trx try 1
2) Phép quay
10
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
Phép quay làm thay đổi hướng của đối tượng. Một phép quay đòi hỏi phải có tâm
quay, góc quay. Góc quay dương thường được quy ước là chiều ngược kim đồng
hồ. Ta có công thức biến đổi của phép quay điểm P(x,y) quanh gốc tọa độ một góc
α:
X’= cosα.x – sinα.y
Y’=sinα.x + cosα.y
Phép quay một đối tượng quanh gốc tọa độ một góc 60°
Biểu diễn phép quay dưới dạng tọa độ thuần nhất
Cosα sinα 0
(x’ y’ 1)=(x y 1) –sinα cosα 0
0 0 1
Cosα sinα 0
Hay Q=P.Mr(α) với Mr(α)= –sinα cosα 0
0 0 1
3) Đối xứng
Phép đối xứng trục có thể xem là phép quay quanh trục đối xứng một góc 180°.
Nếu trục đối xứng là trục hoành hay trục tung, chúng ta có biểu diễn của phép đối
xứng qua trục hoành, trục tung lần lượt là:

1 0 0
Mrfx= 0 -1 0
0 0 1

-1 0 0
11
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
Mrfy= 0 1 0
0 0 1
CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH
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 chương trình sẽ xuất hiện.
Với hệ trục tọa độ oxy đầu tiên dể bao quát chương trình.
12
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
Đây là giao diện vẽ chữ L bằng thuật toán MidPoint
Thuật toán cài đặt vẽ chữ L:
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
#define radian 10 // he so doi tu do sang radian
void MidPoint(int x1,int y1,int x2,int y2,int color)
{
int x=x1;
int y=y1;
int dx=x2-x1;
int dy=y2-y1;

putpixel(x1,y1,color);
if (dy<dx)
{
float P=dy-dx/2;
while (x<x2)
{
13
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
if (P>=0)
{
putpixel(x+1,y+1,color);
y++;
P+=dy-dx;
}
else
{
putpixel(x+1,y,color);
P+=dy;
}
x++;
}
}
else
{
float P=dx/2-dy;
while (y<=y2)
{
if (P>=0)
{
putpixel(x+1,y+1,color);

x++;
P+=dx-dy;
}
else
{
putpixel(x,y+1,color);
P+=dx;
}
y++;
}
}
putpixel(x2,y2,color);
}
void buocnhay(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,int
x6,int y6)
14
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
{
MidPoint(x1,y1,x2,y2,0);
MidPoint(x2,y2,x3,y3,0);
MidPoint(x1,y1,x4,y4,0);
MidPoint(x4,y4,x5,y5,0);
MidPoint(x5,y5,x6,y6,0);
MidPoint(x6,y6,x3,y3,0);
}
void vehinh(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,int
x6,int y6)
{
MidPoint(x1,y1,x2,y2,15);
MidPoint(x2,y2,x3,y3,15);

MidPoint(x1,y1,x4,y4,15);
MidPoint(x4,y4,x5,y5,15);
MidPoint(x5,y5,x6,y6,15);
MidPoint(x6,y6,x3,y3,15);
}

15
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
Di chuyển chữ L sang bên tráiDi chuyển chữ L sang bên phải.
Di chuyển chữ L lên trên.
Di chuyển chữ L xuống dưới
16
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
Thuật toán cài đặt bắt phím:
void batPhim()
{
char c;
int
x1=200,y1=150,x2=200,y2=300,x3=300,y3=300,x4=220,y4=150,x5=220,y5=280,
x6=300,y6=280;
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
do{
c=getch();
buocnhay(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
switch(c)
{
case 75 : x1-=10; x2-=10; x3-=10; x4-=10; x5-=10; x6-=10;
break;
case 77 : x1+=10; x2+=10; x3+=10; x4+=10; x5+=10; x6+=10;
break;

case 72 : y1-=10; y2-=10; y3-=10; y4-=10; y5-=10; y6-=10;
break;
case 80 : y1+=10; y2+=10; y3+=10; y4+=10; y5+=10; y6+=10;
break;
}
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
}while(c!=27);
}
Thuật toán quay góc:
void quaygoc(float x,float y,float goc)
{
goc =goc*M_PI/45;
int x1=200,y1=150,x2=200,y2=300,x3=300,y3=300,x4=220,y4=150,
x5=220,y5=280,x6=300,y6=280;
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
for (int i = 0; i < 7; i++)
{
// Quay diem A
float xa = x1 * cos(goc) - y1 * sin(goc);
float ya = x1 * sin(goc) + y1 * cos(goc);
17
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
// Quay diem B
float xb = x2 * cos(goc) - y2 * sin(goc);
float yb = x2 * sin(goc) + y2 * cos(goc);
// Quay diem C
float xc = x3 * cos(goc) - y3 * sin(goc);
float yc = x3 * sin(goc) + y3 * cos(goc);
// Quay diem D
float xd = x4 * cos(goc) - y4 * sin(goc);

float yd = x4 * sin(goc) + y4 * cos(goc);
// Quay diem E
float xe = x5 * cos(goc) - y5 * sin(goc);
float ye = x5 * sin(goc) + y5 * cos(goc);
// Quay diem F
float xf = x6 * cos(goc) - y6 * sin(goc);
float yf = x6 * sin(goc) + y6 * cos(goc);
// Gan diem
x1 = xa; y1 = ya;
x2 = xb; y2 = yb;
x3 = xc; y3 = yc;
x4 = xd; y4 = yd;
x5 = xe; y5 = ye;
x6 = xf; y6 = yf;
// Ve hinh vua quay duoc
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
}
}
2. Cài đặt chương trình:
//Bài tap lon
//Ðe 8:Ve chu L, dùng phím dieu khien di chuyen minh hoa các phép tinh tien, doi
xung qua trái, qua phai và quay.
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
#define radian 10 // he so doi tu do sang radian
18
Đồ họa máy tính ĐH Công Nghiệp Hà Nội

void MidPoint(int x1,int y1,int x2,int y2,int color)
{
int x=x1;
int y=y1;
int dx=x2-x1;
int dy=y2-y1;
putpixel(x1,y1,color);
if (dy<dx)
{
float P=dy-dx/2;
while (x<x2)
{
if (P>=0)
{
putpixel(x+1,y+1,color);
y++;
P+=dy-dx;
}
else
{
putpixel(x+1,y,color);
P+=dy;
}
x++;
}
}
else
{
float P=dx/2-dy;
while (y<=y2)

{
if (P>=0)
{
putpixel(x+1,y+1,color);
x++;
P+=dx-dy;
}
else
{
19
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
putpixel(x,y+1,color);
P+=dx;
}
y++;
}
}
putpixel(x2,y2,color);
}
void buocnhay(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,int
x6,int y6)
{
MidPoint(x1,y1,x2,y2,0);
MidPoint(x2,y2,x3,y3,0);
MidPoint(x1,y1,x4,y4,0);
MidPoint(x4,y4,x5,y5,0);
MidPoint(x5,y5,x6,y6,0);
MidPoint(x6,y6,x3,y3,0);
}
void vehinh(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,int

x6,int y6)
{
MidPoint(x1,y1,x2,y2,15);
MidPoint(x2,y2,x3,y3,15);
MidPoint(x1,y1,x4,y4,15);
MidPoint(x4,y4,x5,y5,15);
MidPoint(x5,y5,x6,y6,15);
MidPoint(x6,y6,x3,y3,15);
}
void quaygoc(float x,float y,float goc)
{
goc =goc*M_PI/45;
int
x1=200,y1=150,x2=200,y2=300,x3=300,y3=300,x4=220,y4=150,x5=220,y5=280,
x6=300,y6=280;
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
for (int i = 0; i < 7; i++)
{
// Quay diem A
20
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
float xa = x1 * cos(goc) - y1 * sin(goc);
float ya = x1 * sin(goc) + y1 * cos(goc);
// Quay diem B
float xb = x2 * cos(goc) - y2 * sin(goc);
float yb = x2 * sin(goc) + y2 * cos(goc);
// Quay diem C
float xc = x3 * cos(goc) - y3 * sin(goc);
float yc = x3 * sin(goc) + y3 * cos(goc);
// Quay diem D

float xd = x4 * cos(goc) - y4 * sin(goc);
float yd = x4 * sin(goc) + y4 * cos(goc);
// Quay diem E
float xe = x5 * cos(goc) - y5 * sin(goc);
float ye = x5 * sin(goc) + y5 * cos(goc);
// Quay diem F
float xf = x6 * cos(goc) - y6 * sin(goc);
float yf = x6 * sin(goc) + y6 * cos(goc);
// Gan diem
x1 = xa; y1 = ya;
x2 = xb; y2 = yb;
x3 = xc; y3 = yc;
x4 = xd; y4 = yd;
x5 = xe; y5 = ye;
x6 = xf; y6 = yf;
// Ve hinh vua quay duoc
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
}
}
void batPhim()
{
char c;
int
x1=200,y1=150,x2=200,y2=300,x3=300,y3=300,x4=220,y4=150,x5=220,y5=280,
x6=300,y6=280;
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
do{
c=getch();
buocnhay(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
switch(c)

{
21
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
case 75 : x1-=10; x2-=10; x3-=10; x4-=10; x5-=10; x6-=10;
break;
case 77 : x1+=10; x2+=10; x3+=10; x4+=10; x5+=10; x6+=10;
break;
case 72 : y1-=10; y2-=10; y3-=10; y4-=10; y5-=10; y6-=10;
break;
case 80 : y1+=10; y2+=10; y3+=10; y4+=10; y5+=10; y6+=10;
break;
}
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
}while(c!=27);
}
int main()
{
int xa,xb,xc,xd,xe,xf;
int ya,yb,yc,yd,ye,yf;
int x1,x2,x3,x4,x5,x6;
int y1,y2,y3,y4,y5,y6;
int mh=0;
int mode=0;
initgraph(&mh,&mode,"C:\\Dev-cpp\\include");
setbkcolor(15);

x1=200,y1=150,x2=200,y2=300,x3=300,y3=300,x4=220,y4=150,x5=220,y5=280;
x6=300,y6=280;
buocnhay(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
vehinh(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);

//batPhim();
quaygoc(xa,ya,125);
getch();
}
22
Đồ họa máy tính ĐH Công Nghiệp Hà Nội
TỰ ĐÁNH GIÁ
Ưu điểm: -Dễ dàng sử dụng và nâng cấp.
-Chiếm ít tài nguyên của máy.
Khuyết điểm: -Còn thiếu một vài chức năng.
Hướng phát triển:-Trao đổi, tìm kiếm thông tin trên mạng.
KẾT LUẬN
Qua quá trình tìm hiểu và phân tích đề tài “Vẽ chữ L, dùng phím điều khiển
di chuyển minh họa các phép tịnh tiến, đối xứng qua trái, qua phải và quay ”
chúng em đã hiểu được cách phân tích và thiết kế một phần mềm. Tuy nhiên do
kiến thức còn hạn hẹp nên chúng em chưa thể phân tích được sâu sắc hơn và đưa ra
được một phần mềm hoàn chỉnh, nhưng em mong rằng qua đề tài này các bạn có
thể hiểu thêm về cách vẽ một đa giác thành chữ cái và cách dùng phím di chuyển
chữ cái trên chương trình.
23

×