Đồ 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
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)
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;
}
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)
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;
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);
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);
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)
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
{
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);