Tải bản đầy đủ (.pdf) (171 trang)

Tìm hiểu thư viện đồ họa opengl

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 (2.85 MB, 171 trang )

KILOBOOKS.COM

MC LC

Li m đu
PHN 1: TÌM HIU TH VIN  HA OPENGL 1
Chng 1: S lc v OPENGL 1
1.1. Lch s phát trin 1
1.2. Khái nim 1
1.3. Thành phn 5
Chng 2:  ha hai chiu GDI 6
2.1. Ta đ đ các và ta đ màn hình 6
2.2. nh ngha vertex và kiu d liu hình dng 8
2.3. Các phép bin hình 10
2.4. S dng ma trn cho các phép bin hình 17
Chng 3:  ha ba chiu GDI 25
3.1. H ta đ ba chiu 25
3.2. nh ngha đi tng ba chiu 25
3.3. Các phng pháp th hin hình 3-D lên màn hình 28
3.4. Bin hình đi tng 3-D 31
Chng 4: Chng trình OpenGL ti thiu 36
4.1. Các kiu d liu OpenGL 36
4.2. Ng cnh biu din 36
4.3. nh dng đim v 38
4.4. To ng cnh bin din 44
4.5. Tng kt: 48
Chng 5: V hình và s dng màu: 48
5.1. Cú pháp lnh OpenGL 48
5.2. Các trng thái OpenGL 49
5.3. Xét mt chng trình OpenGL ti thiu 50
5.4. nh ngha và v đim 53



THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
5.5. nh ngha và v đng 56
5.6. nh ngha và v đa giác 61
5.7. Tng kt 74
Chng 6: Các phép binhình OpenGL 75
6.1. Xây dng đi tng 3-D t các đa giác 75
6.2. Phép chiu 77
6.3. Phép bin hình đi tng 79
6.4. Phép bin đi viewport 85
6.5. Tng kt 88
Chng 7: Chiu sáng đi tng 3-D 89
7.1. Các loi ngun sáng 89
7.2. nh ngha mt ngun sáng 90
7.3. nh ngha tích cht vt liu 92
7.4. nh ngha các pháp tuyn 95
7.5. Xác đnh kiu bóng và kích hot vic kim tra chiu sâu 97
7.6. nh ngha đèn chiu 98
7.7. Th hin đi tng 3-D đc chiu sáng 99
7.8. Bng màu logic 103
7.9. Tng kt 107
Chng 8: To cnh 3-D 108
8.1. S dng các phép bin hình OpenGL đ to cnh 3-D 108
8.2. S dng các stack ma trn 113
8.3. To o giác chuyn đng vi OpenGL 117
8.4. Tng kt 119
Chng 9: Anh và gán cu trúc 119
9.1. Bitmap và nh OpenGL 120
9.2. Bitmap ph thuc thit b và bitmap đc lp vi thit b 125

9.3. nh dng DIB 125
9.4. Gii thiu lp Cdib 129
9.5. Gán cu trúc cho đa giác 139

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
9.6. Tng kt 147
Chng 10: Pha trn , gim hiu ng rng ca, và sng mù 148
10.1. Pha trn 148
10.2. Gim hiu ng rng ca 154
10.3. Sng mù 157
Chng 11: Display List 160
11.1. nh ngha: 160
11.2. Ti sao phi dùng display list 160
11.3. Các tính cht ca display list. 162
11.4. Các trng hp có th s dng display list. 162
11.5. Nhc đim ca display list. 162
11.6. To và thc thi mt display list. 163
11.7. Qun lý bin trng thái trong display list 164
Chng 12: Quadric. 164
PHN 2: MÔ PHNG CÁC GII THUT  HA 3 D VI OPENGL: 166
Chng 1: Tng quan: 166
1.1. Mt s khái nim liên quan: 166
1.2. Các phép biên đi: 167
Chng 2: Xây dng ng dng mô phng thut gii: 169
2.1. Xây dng ng dngOpenGL 169
2.2. Cách làm vic ca ng dng 172
2.3. Bng kê chng trình: 179








Li M u


THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
Cú cõu rng mt hỡnh nh bng c nghỡn li núi . iu ú tht khụng th ph
nhn. V rừ rng l nu hin th thụng tin ch vi cỏc ký hiu, ch cỏi, ch s
khụng thụi thỡ khụng th hp dn v d hiu nh khi cú thờm biu din ha K
thut ho cng l cụng c khụng th thiu trong cỏc ngnh khoa hc k thut,
giỏo dc, ngh thut, gii trớ, qung cỏo( din t mỏy múc thit b, kin trỳc,
cu trỳc c th, thụng tin thiờn vn a lý, hỡnh nh minh ho ). Chớnh vỡ vy,
ha l mt vn c quan tõm trong ngnh cụng ngh thụng tin.
Cựng vi s phỏt trin ca tin hc, k thut ha trờn mỏy vi tớnh, ngy
cng tr nờn tinh xo. Giao din cỏc phn mm ngy nay tr nờn thõn thin, p
mt nh cỏc th hin ha. S h tr ca tin hc cho cỏc ngnh khỏc tr nờn c
lc hn nh kh nng ha vi tớnh. V th gii thc thỡ c biu din mt cỏch
sinh ng, linh hot, y mu sc bng khụng gian ba chiu.
Trong thnh cụng ca k thut ha ngy nay khụng th khụng núi n s phỏt
trin vt bc ca tc phn cng ln h iu hnh. Nhng bn thõn k thut
ha thỡ cú bc tin nhy vt t nhng phộp tớnh toỏn hc phc tp n nhng th
vin ha c to sn. Cỏc th vin ny cho phộp gim nh thi gian v cụng
sc ca ngi lp trỡnh; Bi vi chỳng, cú c mt tỏc phm ha khụng
ũi hi phi cú mt kin thc hựng hu v ng cong Bezier, B-spline, v hỡnh
hc, to búng, m ch ng dng cỏc hm to sn. Mt trong nhng th vin ú l
OpenGL, c xem l tiờu chun thit k cụng nghip cho ha ba chiu.

Mc tiờu ca lun vn ny l tỡm hiu th vin ha ca OpenGL trong ha
ba chiu, ng thi cng c gng a ra mt ng dng ca OpenGL trong vic
minh ha cỏc gii thut ha ba chiu.
Tuy nhiờn, ti khụng th khụng trỏnh khi nhng hn ch v thiu sút, nờn rt
mong c s ch bo, gúp ý ca quý Thy Cụ v bn bố.
PHN 1:
TèM HIU TH VIN HA OPENGL
Chng1:S Lc v OPENGL
1.1.Lch S Phỏt Trin :
Nguyờn thy, GL do Silicon Graphics Incorporated (SGI) thit k dựng cho cỏc
trm lm vic (workstation) ha IRIS ca h. IRIS GL vi cỏc cu hỡnh phn cng
khỏc thỡ cú vn phỏt sinh.
OpenGL l kt qu n lc ca SGI nhm ci thin tớnh tng thớch ca IRIS GL.
Ngụn ng mi ny cú kh nng ca GL, ng thi m ngha l d dng tng thớch
vi cỏc lai cu hỡnh phn cng, cng nh cỏc h iu hnh khỏc nhau.
Version1.0 ca OPENGL c gii thiu vo ngy 01/7/1992.
bo m tớnh m , mi s nõng cp OpenGL phi thụng qua Uy Ban Xem Xột Kin
Trỳc OpenGL(OpenGL Architecture Review Board AEB) gm cỏc thnh viờn sỏng lp l
SGI, Digittal Equipment Corporation, IBM ,Intel v Microsoft.ARB hp mi nm hai ln.

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
(Các cơng ty khác cng có th tham gia tho tun nhng khơng có quyn b phiu ).
Open GL version1.1 đc ARB thơng qua vào tháng 12/1995.
1.2. Khái Nim :

OpenGL đc đnh ngha là “giao din phn mm cho phn cng đ ha ”. Thc
cht, OpenGL là mt th vin các hàm đ ha, đc xem là tiêu chun thit k cơng
nghip cho đ ha ba chiu.
Vi giao din lp trình mnh m, OpenGL cho phép to các ng dng 3-D phc

tp vi đ tinh vi, chính xác cao, mà ngi thit k khơng phi đánh vt vi các núi cơng
thc tốn hc và các mã ngun phc tp. Và do OpenGL là tiêu chun cơng nghip, các
ng dng to t nó dùng đc trên các phn cng và h điu hành khác nhau.
Các mc sau s gii thiu cách nhìn tng qt v cách làm vic ca OpenGL:
- Các phn t đ ha c bn và lnh gii thiu v các phn t đ ha c bn
(primitive) và s thc hin lnh
- Cách làm vic ca OpenGL cho bit các lai thao tác đ ha mà OpenGL kim
sốt
- Mơ hình hot đng nói v mơ hình client/server cho vic thơng dch lnh
OpenGL
- Thao tác OpenGL c bn đa ra mt mơ t mc cao v cách OpenGL x lý d
liu và to ra hình nh tng ng lên b đim khung.
Các phn t đ ha c bn và lnh:

Primitive đc xác đnh bi nhóm ca mt hay nhiu vertex là đim trong khơng gian.
Mi vertex xác đnh mt đim, mt đu đon thng hay mt đnh đa giác. D liu (bao
gm ta đ vertex, màu sc, normal, texture và c xác đnh loi cnh) kt hi vi vertex.
Khi x lý primitive, mi cp vertex và d liu liên kt vi nó đc s lý đc lp vi các
cp khác, theo th t và cùng mt phng pháp. Ngoi l duy nht là trong trng hp
kh phn khut ca primirite(clipping). Khi đó, d liu vertex đc sa và các vertex
khác đc to ra. Loi clipping tu thuc loi primirite mà nhóm vertex biu din.
Các lnh ln ln đc x lý theo th t mà nó tip nhn, mt dù có s trì hỗn
khơng xác đnh trc khi lnh có hiu lc. Ngha là mi primirite đc v trn vn trc
khi lnh tip theo có hiu lc.
Cách làm vic ca OpenGL:

OpenGL là ngơn ng đ ha theo th tc ch khơng phi ngơn ng mơ t.Thay vì t
các cnh và cách chúng xut hin, OpenGL đa ra các bc cn thit đ có đc s th
hin hay hiu qu nht đnh. Các “bc”này là các li gi đn giao din lp trình ng
dng gm xp x 120 lnh và hàm. Chúng đc dùng đ v các phn t đ ha c bn

nh đim, đng và đa giác trong khơng gian ba chiu. Ngồi ra, OpenGL còn h tr
chiu sáng, tơ bóng, gán cu trúc, to o giác chuyn đng và các hiu qu đc bit khác.
OpenGL khơng có các chc nng qun lý ca s, tng tác vi ngi dùng hay
xut nhp file. Mơi trng ch (tc h điu hành) có các chc nng này và chu trách
nhim thc hin các bin pháp qun lý cho OpenGL.
Mơ hình hot đng:

Mơ hình thơng dch lnh OpenGL là client-server. Mã ng dng(vai trò client) đa ra
các lnh. Lnh đc thơng dch và s lý bi OpenGL (vai trò server). Server và client có
th là trên cùng mt máy tính khác nhau. Theo ngha này, OpenGL là network-transparent

THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
KILOBOOKS.COM
(tm dch là mng trong sut). Server duy trì nhiu ng cnh OpenGL, mi ng cnh là
mt trng thái OpenGL. Client có th nói vi bt c ng cnh nào. Giao thc mng đc
s dng có th là đc lp hóa da trên giao thc mng hin có (tc OpenGL dùng trên
máy đc lp hay trên mơi trng mng). Khơng có lnh OpenGL nào tip nhn vic nhp
d liu trc tip t ngi dùng.
Cui cùng, h thng ca s kim sốt tác dng ca các lnh OpenGL trên b đm khung
qua các thao tác:
- Quyt đnh các phn ca b đm khung mà OpenGL có th truy xut ti thi đim cho
phép.
- Truyn đt cho OpenGL thơng tin v cu trúc các phn đó.
- Nh vy, khơng có lnh OpenGL nào đnh dng b đm khung hay khi to OpenGL.
S đnh dng b đm khung đc thc hin bên ngồi OpenGL trong s liên kt vi h
thng ca s. S khi to OpenGL đc tin hành khi h thng cp phát ca s cho vic
biu din.
Hình 1.1
Mơ hình hot
đng c bn

ca OpenGL
Lnh OpenGL
Phía Client


Phía Server






Thao tác OpenGL c bn:

S đ khi 1.2 tóm tt cách OpenGL x lý d liu. Các lnh đi vào phía trái s đ
và qua “đng ng x lý”. Mt s lnh xác đnh đi tng hình hc đc v, và s khác
kim sốt cách qun lý đi tng qua các giai đon s lý khác nhau.

OpenGL DLL

Server DLL

Video Driver

Win DLL


THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
KILOBOOKS.COM


Hỡnh 1.2 S x lý d liu ca OpenGL:





Lnh










Cỏc giai on s lý khỏc nhau:
Danh sỏch hin th thay vỡ x lý lp tc ton b cỏc lnh, mt s lnh c gom li
trong mt danh sỏch x lý sau.
B c lng: c lng l quỏ trỡnh OpenGL sinh ra cỏc vertex v thụng s t cỏc
phng trỡnh Bộzier xỏc nh trc, cung cp mt phng cỏch hiu qu xp x hỡnh
hc cỏc b mt v ng cong bng cỏch ỏnh giỏ cỏc lnh a thc ca giỏ tr a vo.
Cỏc thao tỏc trờn vertex v s t hp ca primirite: OpenGL x lý cỏc primirite hỡnh
hc (im, on thng v a giỏc). Nhng primirite ny c biu din bi cỏc vertex.
Cỏc vertex c bin i, chiu sỏng, v cỏc primirite c kh cỏc cỏc phn khut theo
viewport chun b rasterze.
Raterization: giai on resterize to ra mt chui cỏc a ch b m khung v cỏc
giỏ tr liờn kt s dng hỡnh dng hai chiu ca im, on thng hay a giỏc. Cỏc
fragment to ra c cung cp cho quỏ trỡnh tip theo.

Cỏc thao tỏc trờn fragment: l cỏc thao tỏc cui cựng trờn d liu, trc khi lu tr
d liu di dng cỏc pixel trong b m khung.
Cỏc thao tỏc ny bao gm vic cp nht (cú iu kin) b m khung da trờn giỏ tr
lu tr v giỏ tr va cú, vic pha trn cỏc mu va cú v mu lu tr, cng nh thao tỏc
mask v cỏc thao tỏc logic khỏc trờn cỏc giỏ tr pixel.
D liu cú th c a vo di dng cac pixel. Khi ú, sau giai on thao pixel,
d liu pixel.
Hoc c lu tr nh l b nh texture, dựng cho giai on rasterizatrion.
Hay rasterize, vi kt qu cỏc fragment c kt hp vo trong b m khung, nu
chỳng phỏt sinh t d liu hỡnh hc.
1.3. Thnh Phn:

OpenGL gm 5 b hm :
Danh
sỏch
B
c
lng
Thao tỏc trờn
vertex v
primitive
Rasteri
-

zation
Thao tỏc
trờn
fragme
B
m

khung
B nh
texture
Cỏc thao tỏc
pixel

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
B ht nhõn cú 115 hm c bn. Tờn cỏc hm ny bt u bng GL. Windows
NT h tr 4 chng loi hm khỏc, bao gm th vin OpenGL utility(tờn hm bt u bng
GLU), th vin OpenGL auxiliary(tờn hm bt u bng AUX), b hmWGL (tờn hm
bt u bng WGL), v cỏc hm WIN32 API (tờn hm khụng cú tin t c bit).
B hm ht nhõn cho phộp thit k cỏc hỡnh dng khỏc nhau, to cỏc hiu qu
chiu sỏng, kt hp antialiasing v gỏn cu trỳc, thc hin bin i ma trn
Do cỏc hm c bn c th hin nhiu dng khỏc nhau tựy thuc vo loi d
liu m chỳng tip nhn, nờn trờn thc t cú hn 300 nguyờn mu (prototype) cỏc hm c
bn.
Th vin OpenGL utility gm cỏc hm cao cp. Cỏc hm ny n gin hoỏ vic
s dng hỡnh nh cu trỳc, thc hin vic bin i ta mc cao, h tr tesselation a
giỏc, v biu din cỏc i tng cú c s a giỏc nh hỡnh cu, hỡnh tr hỡnh da.
Th vin OpenGl auxiliary gm cỏc hm c bit dựng n gin húa cỏc vớ d
lp trỡnh trong sỏch ch dn lp trỡnh OpenGL. Cỏc hm ph thuc platform ny thc hin
cỏc nhim v nh qun ký ca s, iu khin xut/nhp, v cỏc i tng 3D nht nh.
Do cỏc hm ny cú mc ớch thit minh nờn khụng c dựng trong cỏc mó sn xut.
Cỏc hm WGLkt ni OpenGL vi WINdows NT, cho phộp ngi lp trỡnh
xõy dng v chn la cỏc ng cnh biu din, to cỏc bitmap font, cỏc hm ny ch dựng
trờn Windows NT.
Cui cựng, cỏc hm Win32 API c dựng gii quyt cỏc nh dng im nh v
to b m ụi.
Chng2: Ha Hai Chiu GDI

OpenGL cung cp nhiu hm mnh m, lm n gin cỏc vic v cỏc hỡnh nh
phc tp. Dự vy, hiu OpenGL, cn cú mt chỳt kin thc trong thc tin lp trỡnh
ha tiờu chun. Bc u tiờn v mc tiờu ú l tỡm hiu cỏch thao tỏc hỡnh nh hai chiu
GDI
Cỏc phn sau s gii thiu c s lp trỡnh ho 2-D :
- Ta cỏc v ta mn hỡnh
- S dng cỏc Vertex nh ngha mt hỡnh dng phng
- Tnh tin, co gión v quay
- S dng ma trn trong bin hỡnh 2-D
2.1.Ta Cỏc V Ta Mn Hỡnh:

k mt on thng trờn mn hỡnh, ta thng gi cỏc hm nh v im u, sau
ú v on thng. Vớ d cỏc hm MFC c gi l:
CclientDC dc(this)
dc.MoveTo(x,y)
dc.LineTo(x,y)
Mi quan tõm õy l vic biu din cỏc ta x,y.
Trong ta ca s, cng nh ta mn hỡnh, gc ta v trớ gúc trỏi trờn, chiu
tng ca ta x v phớa phi, chiu tng ta y i v phớa di (hỡnh 2.1)
Tuy nhiờn, i tng ha c xỏc nh bi ta cỏc Vertex ca nú trong h
cỏc (hỡnh2.2). Cỏc im khỏc bit gia hai ta ny l:
H cỏc xỏc nh chiu tng ta y l chiu i lờn.

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
H đ các cho phép có ta đ âm.
Và nh vy, vn đ phát sinh khi biu din mt đi tng đc đnh ngha trong h đ
các. Trong ta đ màn hình, ta li nhn đc mt tam giác nh (hình 2.4), nu vi mã to
hình nh sau :
CCLientDC dc(this)

dc.MoveTo(2,5);
dc.LineTo(5,2);
dc.LineTo(2,2);
dc.LineTo(2,5);
Do s khác bit gia màn hình th hin và ta đ đ các, cn có mt phng pháp
chuyn đi gia chúng. Thut ng đ ha gi là mapping các đim trong ta đ đ các
sang ta đ màn hình đ th hin đi tng đúng v trí.







Hình 2.1 Ta đ màn hình Hình 2.2 Ta đ  các









THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
Hỡnh 2.3 Tam giỏc trong ta cỏc Hỡnh 2.4 v tam giỏc khụng cú s
chuyn i gia ta cỏc v
ta mn hỡnh
Nu b qua vn gớa tr õm, thỡ vic th hin im (x1,y1) trong ta cỏc

sang im (x2,y2) trong ta mn hỡnh ũi hi cụng thc sau:
X2=X1;
Y2=maxY Y1;
D nhiờn, thc hin cụng thc ny, trc ht cn bit kớch thc hin ti ca ca
s, bng cỏch gi hm GetClientRect(). Hm ny in y cu trỳc RECT vi kớch thc
ca s. S dng hm MFC, on mó sau v tam giỏc ó cho lờn ca s, mapping gia ta
cỏc v ta mn hỡnh:
Int triangle[6]={2,5,5,2,2,2,};
CCLientDC dc(this);
Int newX,newY,startX,startY;
RECT clientRect;
GetClientRect(&clientRect);
For (int x=0;x<3;++x)
{
newX = triangle[x*2];
newY = maxY triangle[x*2+1];
if(x = = 0)
{
dc. MoveTo(newX,newY);
startX = newX;
startY = newY;
}
else dc.LineTo(newX,newY);
}
dc.LineTO(startX,startY);
}
Dũng u tiờn ca on mó nh ngha mt móng chc cỏc ta cỏc tam
giỏc. Tip theo, on mó tỡm ng cnh dng c ca ca s v khai bỏo cỏc bin cc b.
Cỏc bin newX, newY chc cỏc ta mn hỡnh ca mt im, cũn startX, startY cha
ta mn hỡnh im u tiờn ca tam giỏc. Cu trỳc RECT, clientRect, cha kớch thc

ca s. Sau ú hm GetClientRect() c gi in y cu trỳc clientRect. thnh phn
bottom cha chiu cao ca s. Giỏ tr ny c gỏn cho bin maxY.
Vũng lp for lp i lp li mng ta tam giỏc. Trong thõn vũng lp cỏc ta
(x,y) c mapping gia ta cỏc v ta mn hỡnh .
im u tiờn l im bt u tam giỏc. Cỏc im tip theo c dựng v ng thng
tam giỏc. Li gi LienTo() bờn ngoi vũng lp ni im cui cựng vi im u tiờn.

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
2.2. nh Ngha Vertex V Kiu D Liu Hỡnh Dng:
Mt hỡnh phng thỡ c xỏc nh bi mt tp hp cỏc vertex. Cỏc vertex ni vi nhau
bng cỏc on thng. Khi tt c vertex c ni thỡ hon thnh hỡnh dng.
qun lý cỏc kiu hỡnh dng khỏc nhau trong mt chng trỡnh c d dng,
cn nh ngha cp cu trỳc bao gm kiu d liu vertex.
Typedef struct vertex
{
int x, y; //Cu trỳc ny ch n gin l lu tr
}VERTEX; //cỏc ta cỏc vertex
V kiu d liu hỡnh phng
Typedef struct shape
{
int numVerts; //Gm mt s nguyờn ch s lng
VERTEX*vertices; //vertex trong hỡnh v mt con tr
}SHAPE; //tr n mng cu trỳc
Vi cỏc kiu d liu mi ny, ta cú th vit an mó v on thng tng quỏt hn
nh sau :
VERTEX triangleVerts[3]= {2,5,5,2,2,2}
SHAPE shape1 = {3,triangleVerts};
DrawShape(shape1);
Void DrawShape(SHAPE& shape1)

{
CclientDC dc (this);
Int newX,newY,startX,startY;
RECT clientRect;
GetClientRect(&clientRect);
Int maxY = clientRect.bottom;
For (int x =0 ;x<shape1.numVerts;++x)
{
newX shape1.vertices[x].x;
newY = maxY shape1.vertices[x].y;
if(x = = 0)
{
dc.MoveTo(newX,newY);
startX = newX;
startY = newY;
}
else dc.LineTo(newX,newY);

}
dc.LineTo(startX,startY);

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
}
Do DrawShape() đc tng quát hóa đ làm vic vi cu trúc SHAPE, hàm
này có th v mi loi hình phng.Ví d đ v mt hình ch nht, thì shape1 đc
đnh ngha nh sau:
VERTEX rectangleVerts[4]= {10,10,10010, 100 ,50,10,50};
SHAPE shape1 = {4,rectangleVerts};
Hay đi vi mt đa giác sáu cnh nh sau:






Hình 2.5
VERTEX shapeVerts[6]= {10,10,75,5,100,20,100,50,50,50,25};
SHAPE shape1 = {6,shapeVerts};
2.3.Các Phép Bin Hình:

Mt hình phng đc to bng cách đnh ngha vertex ca nó trong ta đ đ các,
mapping gia ta đ đ các và ta đ màn hình, ri v các đan thng nói các vertex.
Tuy nhiên, đây ch là s khi đu.  v hình  mi ni trên màn hình và theo mi
hng, hình nh cn đc thao tác theo nhiu cách khác nhau. Các thao tác nh vy
gi là các phép bin hình, bao gm tnh tuyn, co giãn và quay.
2.3.1.Phép Tnh Tin:

Tnh tin mt hình đn v trí mi ch đn gin là cng hoc tr ta đ ca
mi vertex vi mt giá tr. Tam giác trong hình 2.6 đc tnh tin 3 đn v theo
trc x và 2 đn v theo trc Y.

Hình 2.6: Tnh tin mt tam giác
Gi s cn tnh tin 20 đn v theo trc X vá 30 đn v theo trc y, mt tam giác có
đnh ngha nh sau:
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};
Công thc tnh tin mi vertex là :

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM

X2 = X1 + xTranslation;
Y2 = Y1 + yTranslation;
Trong chng trỡnh ton b phộp tnh tin nh sau:
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};
DrawShape(shape1);
Translate(shape1,20,30);
Void Traslate(SHAPE& shape,intxTrans,int yTrans)
{
for(int x =0;x< shape.numVerts;++x)
{
shape.vertices[x].x+ xtrans;
shape.vertices[x].y+ ytrans;
}
}
Void DrawShape(SHAPE& shape1)
{
CclientDC dc (this);
Int newX, newY, startX, startY;
RECT clientRect;
GetClientRect(&clientRect);
Int maxY = clientRect.bottom;
For (int x =0 ;x<shape1.numVerts;++x)
{
newX shape1.vertices[x].x;
newY = maxY shape1.vertices[x].y;
if(x = = 0)
{
dc.MoveTo(newX,newY);
startX = newX;

startY = newY;
}
else dc.LineTo(newX,newY);
}
dc.LineTo(startX,startY);
}
Hm Translate() cú cỏc i s l tham chiu n cu trỳc SHAPE, lng
tnh tin x v lng tnh tin y. Nú s dng vũng lp for gỏn lng tnh tin
trong ta (x,y) ca mi vertex.
2.3.2 .Phộp Co Gión:


THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
Thay vỡ cng hoc tr cỏc vertex vi mt giỏ tr nh khi tnh tin, co gión
mt hỡnh l nhõn cỏc vertex ca hỡnh ú vi mt h s co gión. Hỡnh 2.7 biu din
mt tam giỏc gión hai ln (h s co gión l 2).

Hỡnh 2.7: Co gión mt tam giỏc
Chỳ ý rng khụng ch riờng hỡnh, m ton b h ta co gión. Tc l, mt
im cú ta x l 2 n v, s l 4 n v khi co gión.
Gi s cn gión 4 ln (h s co gión l 4 ) mt tam giỏc cú nh ngha nh sau:
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};
Thỡ cụng thc co gión mi vertex l :
X2 = X1*scaleFactor;
Y2 = Y1*scaleFactor;
on mó phộp co gión s nh sau:
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};

Scale(shape1,4);
DrawShape(shape1);
Void Scale(SHAPE& shape,float scaleFactor)
{
for(int x =0;x< shape.numVerts;++x)
{
shape.vertices[x].x+=(int)(shape.xerticse[x]x*scaleFactor);
shape.vertices[x].y+=(int)(shape.xerticse[x]y*scaleFactor);
}
}
Void DrawShape(SHAPE& shape1)
{
CClientDC dc (this);
Int newX,newY,startX,startY;
RECT clientRect;
GetClientRect(&clientRect);
Int maxY = clientRect.bottom;
For (int x =0 ;x<shape1.numVerts;++x)
{
newX shape1.vertices[x].x;

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
newY = maxY shape1.vertices[x].y;
if(x = = 0)
{
dc.MoveTo(newX,newY);
startX = newX;
startY = newY;
}

else dc.LineTo(newX,newY);
}
dc.LineTo(startX,startY);
}
Hm Scale() cú cỏc i s l tham chiu n cu trỳc SHAPE v h s co
gión, thỡ h s co gión s nh hn 1. Chỳ ý rng cú th dựng h s co gión khỏc
nhau i vi 2 ta :
Void Scale(SHAPE& shape, float xScale, float yScale)
{
for(int x =0;x< shape.numVerts;++x)
{
shape.vertices[x].x+=(int)(shape.xerticse[x]x*xScale);
shape.vertices[x].y+=(int)(shape.xerticse[x]y*yScale);
}
}
Trong trng hp ny, sau khi co gión, khụng nhn c hỡnh ng dng.
Hỡnh 2.8 biu din vic co gión mt tam giỏc, vi h s co gin trc x bng 1 , v
h s co gión trc y bng 2.

Hỡnh 2.8: Co gión mt tam giỏc vi hai h s co gión khỏc nhau


2.3.3.Phộp Quay:

Quay mt hỡnh thỡ rc ri hn tnh tin hay co gión, vỡ phi dựng n phộp
toỏn phc tp hn, phi tớnh toỏn sin, cosin. Tuy nhiờn õy ta ch ỏp dng cụng
thc quay, m khụng tỡm hiu ti sau, lm gỡ
Hỡnh2.9 biu din vic quay 45 mt tam giỏc quanh gc ta .

THệ VIEN ẹIEN Tệ TRệẽC TUYEN

KILOBOOKS.COM


Gi s cn quay mt tam giỏc 45
0
nh sau :
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};
Cỏc cụng thc sau c ỏp dng cho cỏc vertex trong tam giỏc:
RotatedX = x*cos(angle) y*sine(angle);

RotatedY = y*cos(angle) x*sine(angle);
t ú nhn c vertex sau:
VERTEX triangleVerts[3]= { -21,49,0,70,-56,84};
Chỳ ý rng trong ú cú hai ta õm, do tam giỏc quay sang phn õm ca
trc x. Giỏ tr õm c chp nhn trong ta cỏc, nhng khụng th biu din
lờn mn hỡnh. hin th tam giỏc cn tnh tin nú sang phn dng ca trc x .
Ton b phộp quay v tnh tin s nh sau:
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};
Rotate(shape1,45);
Translate(shape1,100,0);
DrawShape(shape1);
Void Rotate(SHAPE& shape,int degrees)
{
int rotatedX,rotatedY;
double radians = 6.283185308/(360.0/degrees);
double c = cos(radians);
double c = sin(radians);
for(int x =0;x< shape.numVerts;++x)

{
rotatedX = (int) (shape.verticse[x]x*c
shape.vertices[x].y*s);
rotatedY = (int) (shape.verticse[x]y*c
shape.vertices[x].x*s);
shape.vertices[x].x = rotatedX;

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
shape.vertices[x].y = rotatedY;
}
}
Void Translate(SHAPE& shape1,int xtrans,int yTrans)
{
for(int x =0;x< shape.numVerts;++x)
{
shape.vertices[x].x += xTrans;
shape.vertices[x].y += yTrans;
}
}
Void DrawShape(SHAPE& shape1)
{
CClientDC dc (this);
Int newX,newY,startX,startY;
RECT clientRect;
GetClientRect(&clientRect);
Int maxY = clientRect.bottom;
For (int x =0 ;x<shape1.numVerts;++x)
{
newX shape1.vertices[x].x;

newY = maxY shape1.vertices[x].y;
if(x = = 0)
{
dc.MoveTo(newX,newY);
startX = newX;
startY = newY;
}
else dc.LineTo(newX,newY);
}
dc.LineTo(startX,startY);
}
Hm Rotate( ) nhn tham s l tham chiu n cu trỳc SHAPE v gúc quay().
Cụng vic u tiờn ca nú l i sang radian, do radian l n v o m cỏc hm
sin( ), v hm cosin( ) ca visual c++ yờu cu. Vi gúc quay dng thỡ hỡnh s
quay ngc chiu kim ng h, v ngc li
Cng ging nh cỏc hm Translate( ) v Scale( ), hm Rotate( ) s dng vũng lp
for tớnh ta (x,y) cho tng vertex.
2.4. S Dng Ma Trn Trong Cỏc Phộp Bin Hỡnh:

Mt chng trỡnh ha thng thc hin tt c cỏc phộp tớnh toỏn trờn vertex ca
i tng trc khi th hin i tng ra mn hỡnh. Cú th gi cỏc hm Translate( ),
Scale( ), v Rotate( ) cho cỏc phộp tớnh ny. Tuy nhiờn, vic thc hin nhiu phộp tớnh

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
nh vy cho nhiu vertex s tiêu phí thi gian. ó cng là lý do mà ma trn thng
đc dùng cho các phép bin hình.
Mt ma trn đn giãn là mt bng s sp xp trên các hàng và ct. Ging nh mng
trong lp trình, kích thc ma trn đc đnh ngha trên s hàng và ct mà nó có. ví d
ma trn 3*4 là ma trn có 3 hàng và 4 ct:


4 7 2 4
4 6 7 3
4 5 2 2

Trong chng trình ma trn đc trình bài nh sau:

Int matrix[3][4]=
{
4,7,2,4,
4.6.7.3.
4,5,2,2,
};

Thun li ca ma trn trong lp trình đ ha là có th trình bày nhiu phép bin hình
vi mt ma trn đn. Ngha là mi ma trn đn cha mi giá tr cn thit đ đng thi
dùng trong tnh tin, co giãn và quay mt hình.  thc hin điu đó thì cn bit đt
giá tr nào vào ma trn và cn bit phép nhân ma trn.

2.4.1.Các Kiu D Liu Dùng Trong  Ha 2-D:

 ha 2-D dùng trong ma trn : 1*3 và 3*3.
Ma trn 1*3 là ma trn đc bit , gi là vector. Vector cha các giá tr x,y và w đ
th hin mt vertex. Vy kiu d liu vertex nh sau :

Typedef struct vector
{
int x,y,w;
}VECTOR;


Trong đó ,w là giá tr thng dùng đ đn giãn hóa thao tác ma trn, mt dù
OpenGL đôi khi s dng đt bit giá tr này.Trong hu ht các trng hp, w bng 1.
Ngha là vertex đc biu din bi vector có dng: x, y, z Ma trn 3*3 cha các giá tr
cn thit cho các phép bin hình mt vertex (đc biu din bng kiu d liu vector, tc
cng là mt ma trn ) Kiu d liu ma trn 3*3 nh sau:
Typedef double MATRIX3*3[3][3];

2.4.2.Các Ma Trn Bin Hình :

Bc đu tiên là cung cp các giá tr thích hp cho ma trn. Giá tr đc dùng và
v trí ca nó trong ma trn ph thuc kiu bin hình.
Ma trn dùng cho phép tnh tin có dng:

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
1 0 0
0 1 0
xTrrans yTrans 1
Vi các bin xTrans và yTrans tng ng là s đn v theo chiu ngang và dc
dùng cho phép tnh tin, (tng t nh khi dùng công thc tnh tin ). Trong chng trình
ma trn này đc khi to nh sau:
MATRIX3*3 m;
m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0;
m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0;
m[2][0] = xTrans; m[2][1] = yTrans; m[2][2] = 1.0;
- Ma trn dùng cho phép co giãn có dng:
XScaleFactor 0 0
0 yScaleFactor 0
0 0 1


Vi các bin xScaleFactor và yScaleFactor tng ng là đ co giãn theo chiu
ngang và dc. Trong chng trình, ma trn này đc khi to nh sau :

MATRIX3*3 m;

m[0][0] = xScaleFactor; m[0][1] = 0.0; m[0][2] = 0.0;
m[1][0] = 0.0; m[1][1] = xScaleFactor; m[1][2] = 0.0;
m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0;
- Cui cùng ma trn dùng cho phép quay có dng :
Cos(radians) sin(radians) 0
-sin(radians) cos(radians) 0
0 0 1
Vi bin radian là góc quay (đn v radian). Trong chng trình, ma trn này đc
khi to nh sau :
MATRIX3*3 m;
m[0][0] = cos(radians); m[0][1] =sin(radians); m[0][2] = 0.2;
m[1][0] = -sin(radians); m[1][1] = cos(radians); m[1][2] = 0.0 ;
m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0;

2.4.3.Kt Hp Các Phép Bin Hình :

 mc trc, tng phép bin hình đc biu din bng các các ma trn riêng bit.
Tuy nhiên, nh đã nói, có th kt hp nhiu phép bin hình trong mt ma trn.
 kt hp hai phép bin hình, ta nhân hai ma trn ca chúng vi nhau Kt hp phép
bin hình tip theo bng cách nhân ma trn ca nó vi ma trn nhn đc  phép kt hp
trc. Hình 2.10 biu din các phép bin hình
Mt cách nhìn khác đc biu din  hình 2.12, nhng kt qu ca tng phép kt hp các
ma trn không đc th hin .

Ma tr฀n

k฀t
Các vector
C฀a hình

Ma tr฀n
Ma
Ma
Các vector

X

Hình đã đ฀฀c
bi฀n đ฀i
=

X

X

X

=

Hình đã đ฀฀c

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
















 nhân hai ma trn vi nhau, thì s ct trc phi bng s hàng ca ma trn sau.
Nh vy, ta có th nhân hai ma trn 1X3 v ma trn 3X3, hay nhân hai ma trn 3X3
vi nhau .
Hàm sau nhân hai ma trn 3X3:
Void MultMatrix(MATRIX3X3& product,
MATRIX3X3& matrix1, MATRIX3X3& matrix2)
{
for (int x = 0; x < 3; ++y)
{
double sum = 0;
for (int z = 0; z < 3; ++z)
sum + = matrix1[x][z]*matrix2[z][y];
product[x][y] = sum;
}
}
Các tham s ca hàm trên bao gm mt ma trn cha kt qu nhân, và hai ma trn
tham gia phép nhân .Ví d v cách s dng hàm nh sau:
MATRIX3X m1,m2,m3;


m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0;
m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0;
m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0;

m[0][0] = 9.0; m[0][1] = 8.0; m[0][2] = 7.0;
m[1][0] = 6.0; m[1][1] = 5.0; m[1][2] = 4.0;
m[2][0] = 3.0; m[2][1] = 2.0; m[2][2] = 3.0;
MultiMatrix(m3,m1,m2);
on mã khai báo ba ma trn 3X3 là m1, m2, m3. Sau đó khi to m1, m2, ri gi
hàm MulMatrix() đ nhân m1 vi m2, và lu tr kt qu trong m3. Do m1 là ma trn đn
v, kt qu cha trong m3 s có cùng giá tr nh trong m2.

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
Ma trn n v i cp n c nh ngha l loi ma trn ng chộo nXm chiu, vi cỏc
phn t ng chộo hỡnh n v:
I [
ik
], vi
ik
= 0 nu i k;

ik
= 1
nu i = k;
Trong lp trỡnh ha, ma trn n v thng c dựng khi to ma trn chớnh
l ma trn dựng kt hp cỏc phộp bin hỡnh. Vic khi to nh vy s chc chn khụng
tn ti giỏ tr l trong ma trn .


2.4.4.Thc Hin Bin Hỡnh:

Sau khi kt hp cỏc phộp bin hỡnh, ta nhn c mt ma trn chớnh cha cỏc giỏ tr
chớnh xỏc cn thit ng thi tnh tin, co gión v quay hỡnh. Cụng vic bin hỡnh bõy
gi ch n gin l nhõn ma trn chớnh vi cỏc vector ca hỡnh (xem hỡnh 2.10,2.11). V
nh vy cn mt hm khụng ch nhõn vector 1X3 vi ma trn 3X3, m nhõn ma trn vi
ton b danh sỏch vector:
Void Transform(SHAPE& shape, MATRIX3X3& m)
{
int transformedX,transformY;
for (int x= 0; x <shape.numverts; ++x)
{
transformX = (int) (shape.vertices[x].x*m[0][0] +
shape.vertices[x].y*m[1][0] + m[2][0]);

transformY = (int) (shape.vertices[x].y*m[0][0] +
shape.vertices[x].x*m[1][0] + m[2][0]);

}
}

Hm trờn cú cỏc i s l tham chiu n cỏc cu trỳc SHAPE v tham chiu n
móng MATRIX3X3.
2.4.5.Mt S Hm Ma Trn Tin ch:

Cú hai hm ma trn tin ớch thng c dựng lm d dng hn vic s dng
ma trn trong lp trỡnh. Chỳng gm:
- Hm khi to ma trn theo ma trn n v:
MATRIX3X m1,m2,m3;
m[0][0] = 1; m[0][1] = 0; m[0][2] = 0;

m[1][0] = 0; m[1][1] = 1; m[1][2] = 0;
m[2][0] = 0; m[2][1] = 0; m[2][2] = 1;
- Hm sao chộp ma trn:
Void intMatrix(MATRIX3X3& m)
{
for (int i=0; i <3; ++i)
for (int j=0; j <3; ++j)

THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
dst[i][j] = src [i][j];
}
2.4.6.Các Hàm Bin Hình Dùng Ma Trn:

- Hàm tnh tin :
Void Translate(MATRIX3X3& m,int xTrans,int yTrans)
{
MATRIX3X m1,m2;

m[0][0] = 1; m[0][1] = 0; m[0][2] = 0;
m[1][0] = 0; m[1][1] = 1; m[1][2] = 0;
m[2][0] = xTrans; m[2][1] =yTrans0; m[2][2] = 1;

MultMatrix(m2,m1,m);
CopyMatrix(m,m2);
}
Hàm có đi s là tham chiu đn ma trn chính (cha trng thái hin ti ca phép bin
hình) và các giá tr tnh tin x, y. u tiên, nó to ma trn tnh tin ; Ri nhân ma trn tnh
tin vi ma trn chính, lu kt qu trong ma trn cc b m2; Cui cùng sao chép m2 tr
li ma trn chính.

- Hàm co giãn:
Void Scale(MATRIX3X3& m,double xScale,double yScale)
{
MATRIX3X m1,m2;

m[0][0] = xScale; m[0][1] = 0; m[0][2] = 0;
m[1][0] = 0; m[1][1] = yScale; m[1][2] = 0;
m[2][0] = 0; m[2][1] =0; m[2][2] = 1;

MultMatrix(m2,m1,m);
CopyMatrix(m,m2);

}
- Hàm quay:
Void Rotate(MATRIX3X3& m,int degrees)
{
MATRIX3X m1,m2;
If (degrees = = 0) return;
Double radians = 6.283185308/(360.0/ degrees);
Double c = cos(radians);
Double s = sin(radians);
m[0][0] = c; m[0][1] = s; m[0][2] = 0;
m[1][0] = -s; m[1][1] = c; m[1][2] = 0;
m[2][0] = 0; m[2][1] =0; m[2][2] = 1;

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM

MultMatrix(m2,m1,m);
CopyMatrix(m,m2);


}
Hàm quay có các đi s là tham chiu đn ma trn chính và góc quay(đ). u tiên
nó kim tra góc quay có bng không hay không. Nu góc quay bng không, hàm kt thúc
đ loi tr, li chia cho 0. Nu khác không, hàm đi đ ra radians và tính sin, cosin. Tip
theo, Rotate khi to ma trn quay, nhân nó vi ma trn chính, lu kt qu vào ma trn
cc b m2. Cui cùng, sao chép m2 tr li ma trn chính.
Bây gi ta đã có mt b hàm dùng ma trn. Hãy xét cách dùng chúng trong
bin hình  đon mã sau:
MATRIX3X3 m;
IntMatrix(m);
Translate(m,10,15);
Scale(m,0.5,0.5);
Rotate(m,45);
Transform(shape1,m);
DrawShape(shape1);
Trc tiên đon mã khai báo mt ma trn bin hình 3X3 là m. Sau đó gi hàm
IntMatrix() đ khi to m theo ma trn đn v. M s là:
1.0000000000000 0.0000000000000 0.0000000000000
0.0000000000000 1.0000000000000 0.0000000000000
0.0000000000000 0.0000000000000 1.0000000000000
Li gi hàm Translate( ) kt hp m vi ma trn tnh tin cha các giá tr 10 và
15. Matrn bin hình m s là:
1.0000000000000 0.0000000000000 0.0000000000000
0.0000000000000 1.0000000000000 0.0000000000000
10.0000000000000 15.0000000000000 1.0000000000000
Sau khi gi hàm Scale( ), m cha các giá tr ca phép tnh tin và co giãn:
1.0000000000000 0.0000000000000 0.0000000000000
0.0000000000000 0.5000000000000 0.0000000000000
10.0000000000000 15.0000000000000 1.0000000000000

Cui cùng sau li gi hàm Rotate( ), m cha đy đ các phép tnh tin và quay:
0.35355339055702 0.3535533906295 0.0000000000000
-o.35355339062953 0.35355339055702 0.0000000000000
10.000000000000 15.000000000000 1.0000000000000
Li gi hàm Translate() áp dng ma trn cho mt vertex ca shape1. Sau đó
Drawshape() v hình đã bin hình lên màn hình.


THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
Chng 3: Ha Ba Chiu GDI
Trong chng này, chúng ta s tìm hiu:
- H ta đ đ các ba chiu.
- nh ngha vertex cho đi tng 3-D.
- Phép chiu song song và phép chiu phi cnh.
- Chuyn đng đi tng 3-D.

3.1.H Ta  Ba Chiu:
Mt đi tng ba chiu thì không th biu din trong h ta đ hai chiu ch gm hai
trc x và y.  to h ta đ mi, ta ch đn gin thêm mt trc z vào mt phng đ các,
đ bin đi thành hình khi. Mt dù các trc x, y, z có th hng theo mi phng, ta qui
đnh trc x theo chiu ngang, trc y theo chiu đng, trc z theo phng đi vào và ra màn
hình. ó là hng trc logic cho nhiu chng trình, xut phát t vic trc x và y chy
theo các phng tng ng vi ta đ màn hình.

3.2 .nh Ngha i Tng Ba Chiu:

Vic to mt hình hai chiu ch đn gin là đnh ngha tp vertex ca nó, ri nói các
vertex vi nhau. Nhng đi vi đi tng 3-D, vn đ có php tp hn, bi vì s lng
vertex là nhiu hn, đòi hi vic xác đnh vic nói các vertex đ hình thành đúng đi

tng yêu cu. Do đó, đi vi chúng, không ch đnh ngha các vertex, mà còn phi đnh
ngha các cnh. Mt đi tng 3-D đc xây dng trên các vertex và cnh đc gi là
mt mô hình khung li (wireframe model).
 đnh ngha mt mô hình khung li cn danh sách các vertex và cnh. Do đó, hin
nhiên là cn mt s kiu d liu mi.
-Trc tiên là kiu d liu đnh ngha vertex ca đi tng 3-D vi ba ta đ x, y,
z nh sau:
Typedef struct vertex
{
int x,y,z,w;
}VERTEX;
- v mt cnh, ta cn bit vertex khi đu và vertex kt thúc, sau đó ni chúng
li vi nhau. Kiu d liu đnh ngha cnh nh sau:
Typedef struct edge
{
UINT vertex1,vertex2;
}EDGE;
Vi vertex1 là đim xut phát cnh, và vertex2 cui.
- Kiu d liu ca mô hình khung li nh sau:
Typedef struct model
{
UINE numverts;
VERTEX* vertices;
UINE numEdges;
EDGE*edges;

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
}MODEL;
Nh vy, cu trúc MODEL bao gm hai s nguyên không du cha vertex và cnh

đi tng, mt con tr ch đn kiu d liu VERTEX cha đa ch ca danh sách vertex,
và m con tr ch đn kiu d liu EDGE cha đa ch ca danh sách cnh.


Hình 3.1Hình khi:


S dng các kiu d liu trên cho khi vuông,
vi s th t các đnh nh hình 3.1. Ta đ các
đnh ln lc là (0,4,0), (4,4,0), (4,4,-4), (0,4,-
4), (0,0,0,), (4,0,0), (4,0,-4),(0,0,-4).
Danh sách vertex s nh sau :
VERTEX cubeVerts[8] =
{
0,4,0,
4,4,0,
4,4,-4,
0,4,-4,
0,0,0,
4,0,0,
4,0,-4,
0,0,-4,
}
Chú ý rng ta đ z ca đi tng đã cho bng 0 hoc âm, do chiu tng ta đ z
hng ra khi màn hình .
Các ta đ dùng đnh ngha mt mô hình khung li, nh trong cu trúc cubeverts 
trên, thì đc xem là các ta đ cc b. Ta đ cc b tr thành ta đ th gii khi
chng trình s dng các phép tnh tin co giãn hoc quay v bin mô hình. Cui cùng,
chng trình đ ha bin đi các ta đ th gii thành ta đ màn hình đ có th th hin
mô hình lên màn hình.

Danh sách cnh ca khi vuông trên nh sau :
EDGE cubeedges[12]=
{
1,2,
2,3,
3,4,
4,1,
5,6,
6,7,
7,8,
8,5,
5,1,
6,2,

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN

×