TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN
ĐỢI HỌC ĐIỆn Lực
ELECTRIC POWER UNIVERSITY
BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN
ĐÒ HỌA MÁY TÍNH
ĐỀ TÀI: CHƯƠNG TRÌNH MƠ PHỎNG BÀN CỜ 2D.
NGUYỄN ĐỨC LONG (NT)
Sinh viên thực hiện:
LÃ QUỐC NGHỊ
CAO HOÀI NAM
PHẠM QUANG ÁNH
Giảng viên hướng dẫn:
THẦY. NGÔ TRƯỜNG GIANG
Ngành:
CÔNG NGHỆ THÔNG TIN
Chun ngành:
CƠNG NGHỆ PHẦN MỀM
Lớp:
D13CNPM1 (NHĨM 12)
HÀ NỘI,
06/2020.
TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN
ĐỢI HỌC ĐIỆn Lực
ELECTRIC POWER UNIVERSITY
BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN
ĐÒ HỌA MÁY TÍNH
ĐỀ TÀI: CHƯƠNG TRÌNH MƠ PHỎNG BÀN CỜ 3D.
NGUYỄN ĐỨC LONG (NT)
Sinh viên thực hiện:
LÃ QUỐC NGHỊ
CAO HOÀI NAM
PHẠM QUANG ÁNH
Giảng viên hướng dẫn:
THẦY. NGÔ TRƯỜNG GIANG
Ngành:
CÔNG NGHỆ THÔNG TIN
Chuyên ngành:
CÔNG NGHỆ PHẦN MỀM
Lớp:
HÀ NỘI,
06/2020.
D13CNPM1 (NHÓM 12)
HÀ NỘI,
06/2020.
PHIẾU CHẤM ĐIỂM
Sinh viên thực hiện:
STT Họ và tên
1
Nguyễn Đức Long
2
Phạm Quang Ánh
3
Lã Quốc Nghị
4
Cao Hồi Nam
Gíao viên chấm điểm:
Họ và tên
Giáo viên 1:
Giáo viên 2:
Nội dung thực hiện
Chữ ký
Điểm
Chữ ký
Ghi chú
Mục Lục
A.
B.
C.
A. MỞ ĐẦU
D.
Sự phát triển của khoa học, kĩ thuật, nghệ thuật, kinh doanh và công
nghệ luôn
luôn phụ thuộc vào khả năng truyền đạt thông tin của chúng ta, hoặc thông qua các
bit dữ liệu lưu trữ trong microchip hoặc thơng qua giao tiếp bằng tiếng nói. Câu
châm ngơn từ xa xưa “một hình ảnh có giá trị hơn cả vạn lời” hay “trăm nghe không
bằng một thấy” cho thấy ý nghĩa rất lớn của hình ảnh trong việc truyền tải thơng tin.
Hình ảnh bao giờ cũng được cảm nhận nhanh và dễ dàng hơn, đặc biệt là trong
trường hợp bất đồng về ngơn ngữ. Do đó khơng có gì ngạc nhiên khi mà ngay từ khi
xuất hiện máy tính, các nhà nghiên cứu đã cố gắng sử dụng nó để phát sinh các hình
ảnh trên màn hình. Trong suốt gần 50 năm phát triển của máy tính, khả năng phát
sinh hình ảnh bằng máy tính của chúng ta đã đạt tới mức mà bây giờ hầu như tất cả
các máy tính đều có khả năng đồ họa.
E.
Đồ họa máy tính là một trong những lĩnh vực lý thú nhất và phát triển
nhanh
nhất của tin học. Nó cịn là sự kết hợp giữa phương pháp và công nghệ dùng trong
việc chuyển đổi qua lại giữa dữ liệu và hình ảnh bằng máy tính. Đồ 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ề ở tố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ị, điều khiển hình ảnh trên màn hình máy
tính. Đồ họa máy tính có 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, hình học họa hình,...và kỹ thuật máy tính, đặc biết là chế tạo phần cứng.
F.
Chúng ta có thể vẽ ra những hình ảnh khơng chỉ là ảnh tĩnh mà cịn có
thể biến
đổi thành những hình ảnh sinh động qua phép tịnh tiến, phép biến đổi,... Do vậy,
qua thời gian tìm hiểu nhóm em đã quyết định chọn đề tài “Viết Chương trình mơ
phỏng bàn cờ 3D.” nhằm giúp mọi người 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.
6
G.
H.
B. NỘI DUNG
Chương I: ĐỒ HỌA HAI CHIỀU
1. Vẽ đường thẳng
I.
a. Thuật tốn Bressenham
J. • Thuật tốn
K.
Thuật tốn Bresenham đưa ra cách chọn y± + 1 là yi hay y± + 1
theo một
hướng khác. Đó là so sánh khoảng cách giữa điểm thực y với 2 điểm gần kề nó
nhất. Nếu điểm nào nằm gần điểm thực hơn thì sẽ được chọn làm điểm vẽ tiếp theo.
M.
L.
Xj + 1
Xi
N.
O.
Hình 1.1
P.
Xét trường hơp 0 < m < 1
Q.
Gọi y là giá trị thực (giá trị chính xác) của đường thẳng tại x ở bước
thứ i +
1 là:
R.
y = m(xi + 1) + b
S.
Gọi d1 là khoảng cách từ y đến yi
T.
Gọi d2 là khoảng cách từ y đến yi + 1
U.
Ta có:
V. d1 = y -
yi = m(Xi + 1) + b - yi
7
W. d2
= yi +
1
- y = yi + 1 - [m(xi
+ 1) + b]
8
X.
Ta xét (d1 - d2):
Y.
d1 - d2 > 0 ^ d1 > d2 ^ yi.
Z.
Ngược lại: d1 - d2 < 0 ^ d1 < d2 ^ yi.
AA.
^ d1 - d2
AB.
= [m(Xi + 1) + b - yi] - [yi + 1 - m(Xi + 1) - b]
AC.
= m(xi + 1) + b - yi - yi - 1 + m(xi + 1) + b
AD.
= 2m(xi + 1) - 2yi + 2b - 1
+ 1
= yi. + 1
+ 1
= yi.
AE. Dễ thấy d1 - d2 tồn tại phép toán với số thực m = . Và để
tuân thủ
theo đúng ý tưởng thuật toán chỉ thực hiện các phép toán
trên số nguyên, ta khử phân số bằng cách nhân 2 vế với
dx:
AF.
Đặt Pi = dx(d1 - d2)
AG.
^ Pi = dx[2m(xi + 1) + 2b - 2yi - 1]
AH.
Thay m = vào phương trình trên ta được:
Pi = 2dyxi - 2dxyi + c với c
AI.
= 2dy + (2b - 1)dx
AJ.
Mặt khác dx > 0 với mọi trường hợp
AK.
^ dấu của Pi cùng dấu với d1 - d2
AL. ^
Pi > 0
AM.
Pi
^ yi
< 0 ^
+ 1
yi
+ 1
AN.
Ta lại có: Pi
AO.
Pi = 2dyxi - 2dxyi + c
+ 1
= 2dyxi
+ 1
=
yi
=
yi
- 2dxyi
+ 1
+ 1
+ c
9
AP.
^ Pi
+ 1
AQ.
(xi+ 1 - xi) = 1
AR.
Pi
+ 1
- Pi = 2dy(xi
+ 1
- xi) - 2dx(yi
+ 1
= 2dy - 2dx(yi
- yi
+ 1
- yi)với
= Pi + 2dy - 2dx(yi+1 - yi)
10
AS.
Nếu P1 < 0 ^ y±
AT.
Ngược lại Pi > 0 ^ y
AU.
Ta có: Pi = 2x1dy - 2y1dx + c
AV.
= 2x1dy - 2(X1 + b)dx + 2dy + (2b - 1)dx
+ 1
= y± ^ P1
+ 1
+ 1
= P1 + 2dy
= y i + 1 ^ Pi
+ 1
= Pi + 2(dy -
dx)
AW. = 2dy - dx
AX.
AY.
AZ. Hình 1.2
BA.quát
Giả
sử
khoảng
cách
từ
điểm
thực
ymột
so trị
với
imà
làtap.
Do
việc
xét nên
chọn
điểm
trên
hay
điểm
với
hơn,
mỗi
lần
x phải
tăng
đơn
vịcho
thêm
thì
khoảng
1
cách
p ,dưới
lại
cộng
giá
c ynào
đó.
Tuy
cách
khoảng
p
khơng
tăng
lên
một
cách
tính
nên
chúng
phải
đi nhiên,
tìm
cơng
thức
các
tổng
trường
hợp
đó
làgần
Ptuyến
?i +P,i1thực
i thêm
+
1 =điểm
.
11
• Kết quả thực nghiệm
A.
• Lưu đồ giải
thuật
BB.
BC.
BD.
BE.
BF.
BG.
BH.
BI.
BJ.
BK.
BL.
BM.
BN.
BO.
BP.
BQ.
BR.
BS.
BT.
BU.
BV.
BW.
B. Hì
nh
1.
3
BX.
BY
.
BZ.
12
12
CA.
CB. #include <winbgỉm.h>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<conio.h>
#define DE LAY 10
int oolơr = 2;
CC.
Vũìd Bresenhaiìi(int xl, int yl, int x2, int y2){
int Dx = abs(x2 - xl);
int Dy = abs(y2 - yl);
int p = 2*Dy - Dx;
ĩnt cl = 2*Dy;
int c2 = 2*(Dy-Dx);
int X = xl;
int y = yl;
int x_unit = 1, yunit = 1;
CD. putpixelỊx^y,colõr);
CE.
wliile(x J= x2){
CF. dèlay(DELAY);
CG.if (p<0) p += cl;
else{
CH.
p +=
y += y_unĩt;
CI. } '
CJ. X += x_unit;
putpixeltx, y,, color);
CK.
.}■
}.
int main(){
int xlJyl,x2Jy2;
31
32
33
34 I
CL.
int gd.grn^VGÁẤlAX; gd=DETECT;
irìitgráph(&gd ,íigm, NULL);
11 setbkcolor(4);
CM.
dslay(9000);
return 0;
Bresenham(5e,150J 300; 200);
CN.
}
CO.
Hình 1.4
CP.
CQ.
Hình 1.5
CR.
CS.
CT.
CV.
b. Thuật tốn Midpoint
• Thuật tốn
Xét 0 < hệ số góc < 1
CU.
CW. Hình 1.6
CX.
Thuật tốn Midpoint đưa ra cách chọn điểm Yi
+ 1
là yi hay yi
+ 1
bằng cách
so sánh điểm thực Q(xi
+ 1Z
y) với điểm Midpoint là trung điểm của S và P.
Nếu
điểm Q nằm dưới điểm Midpoint thì ta chọn điểm S là điểm vẽ tiếp theo. Ngược
lại,
nếu điểm Q nằm trên điểm Midpoint thì ta chọn P. Ta có dạng tổng quát của PT
đường thẳng:
CY. Ax + By + C = 0
CZ.
Với A = yo - y1; B = - (X2 - X1); C = X2y1 - X1y2
DA.
Đặt F(x, y) = Ax + By + C
DB.
Ta có nhận xét:
DC.
Vị trí tương đối của điểm Midpoint (x, y) với đường thẳng:
16
DD.
+ F(x, y) < 0 nếu (x, y) nằm phía trên đường thẳng
DE.
+ F(x, y) = 0 nếu (x, y) thuộc về đường thẳng
17
DF.
+ F(x, y) > 0 nếu (x, y) nằm phía dưới của đường thẳng
DG.
Lúc này việc chọn các điểm S, P ở trên được đưa về việc xét dấu của
DH.
DI.
DJ.
DK.
Pi
= pi
+ 2Dy - 2Dx nếu pi >0 do ta chọn yi+
+ 1
1
= yi + 1
Ta tính giá trị P1 ứng với điểm ban đầu (x1z y1) với nhận xét rằng
điểm
DL. (x1z y1) là điểm thuộc đường thẳng, tức là có Ax1 + By1 + C = 0
DM.
P1 = 2F(X1 + 1, y1 + ) = 2[A(X1 + 1) + B(y1 + ) + C]
DN.
= P1 = 2(Ax1 + By1 + C) + 2A + B
DO.
= P1 = 2A + B
DP.
= P1 = 2Dy - Dx
DQ.
như đã
nói ở trên.
DR.
DS.
Ta thấy kết quả của thuật tốn Midpoint tương tự thuật tốn Bresenham
• Lưu đồ thuật toán
Giống của thuật toán Bresenham
18
DU.
DT.
Hình 1.7
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
• Kết quả thử nghiệm
DV.
DW. #include<iostream>
DX. #include<winbgim. h>
DY. #include<math.h>
DZ. using namespace std;
EA. void mỉdpoint(ỉnt xl.int yl,int X2, int y2,int color){
EB.
//Truông hop 0
int a,b,pi,x,y,p;
EC.
a=y2-ýl,
ED.
b=-(x2-xl);
EE.
y=;
EF.
x=xl;
EG.
putpixel(x,y,color); //Ve diem pixel dau tien
EH.
p=2*a+b; //tinh vi tri tuong doi cua dỉem Midpoỉnt so voi duong thang
EI. while(x < x2){
if(p < 0)1
EJ.
EK. }elsé{
EL.
EM.
}
X++;
p+«2*a; // ta chon chon diem yi
y++;
p+=2*(a+b);//ta chon diem yỉ +1
EN.
cout<<"Pixel (x,y) midpoỉnt = ("<
putpixel(x,y,coĩór);
EO.
EP.
delay(10);
}
EQ. int main(){
ER.
initwindow(800,600);
ES.
//khoi tao wỉndow có chieu rong x=400 và chieu cao y = 500
setwỉndowtitle("Thuat toan Line Hidpoint");
ET.
//thiet lap tieu de cho windows
mỉdpoint(10,10,400,400,15);
EU.
EV. }
EW.
EX.
EY.
EZ.
FA.
FB.
getch();
Hình 1.8
Hình
1.9
20
• Kết quả thử nghiệm
FC.
FD.
FE.
FF.
FG.
FH.
Hình
1.9
21
2. Vẽ đường trịn
FI.
a. Thuật tốn Bressenham
FJ.• Thuật tốn
FK.
Giả sử (xi, yi) đã vẽ được, điểm kế tiếp là (xi + 1, yi) hoặc (xi +1, yi -1)
FL.
FN.
FO.
FM. Hình 1.10
Từ phương trình: X2 + y2 = R2 ta tính được giá trị y thực ứng với
Xi + 1
là:
FP.
y2 = R2 - (xi + 1)2
FQ.
FR.
Đặt: di = yi2 - y2 = yi2 - R2 + (Xi + 1)2
d2 = y2 - (yi - 1)2 = R2 - (Xi + 1)2 - (yi - 1)2
FS.
Suy ra:
FT. Pi = d1 - d2 = 2(Xi + 1)2 + yi2 + (yi - 1)2 - 2R2 (2)
FU.
^ Pi
FV.
)
Từ (2) và (3) ta có: pi + 1 - pi = 4Xi + 6 + 2(y2i
+ 1
= 2(Xi + 1 + 1)2 + y2i+1 + (yi
+ 1
- 1)2 - 2R2
(3)
yi2
FW. - 2(yi
+ 1
+ 1
-
- yi)
22
FX.
^ Pi
+ 1
= Pi + 4Xi + 6 + 2(y2i
+ 1
- yi2 ) - 2(yi
+ 1
-
yi)
FY. (4)
23
FZ.
GA.
Nếu Pi.
< 0: chọn y±
(4)
^ pi + 1 = pi + 4xi
+ 6
Nếu Pi
> 0: chọn yi
1
- 1
(4) ^ Pi
+ 1
1
+
+
= Pi +
= y±
= yi
4(Xi -
GB. y±) + 10. Ta chọn điểm đầu tiên cần vẽ (0, R), theo (2) ta có: P1 =
3 2R
GC.
Tóm lại: Ta có thuật tốn vẽ đường trịn:
• Bước 1: Chọn điểm đầu tiên cần vẽ (x1z y1) = (0, R)
• Bước 2: Tính P đầu tiên: P1 = 3 - 2R Nếu P < 0: chọn điểm kế tiếp là
(xi +1, yi). Ngược lại chọn niểm (xi + 1,yi - 1)
• Bước 3: x:=x + 1, tính lại P: Nếu Pi < 0: Pi
+ 1
= Pi + 4xi + 6.
Ngược lại: pi + 1 = pi + 4(xi - yi) + 10 Khi đó: Nếu pi + 1 < 0:
chọn
điểm kế tiếp là(xi + 1, yi + 1). Ngược lại chọn điểm (xi + 1, yi + 1 -1)
GD.
Bước 4: Lặp lại bước 3 cho đến khi x = y.
24
• Lưu đồ giải thuật
GF.
GE.
Hình 1.11
25