Upload
tran-duc-anh
View
260
Download
4
Embed Size (px)
Citation preview
TRNG I HC LT KHOA CNG NGH THNG TIN
ThS. V PHNG BNH
GIO TRNH
HA MY TNH
Dnh cho sinh vin ngnh: Cng ngh phn mm, Mng v truyn thng
Lt, 2010
Gio trnh Ha My Tnh 2
MC LC
M U ...................................................................................................... 4
Chng 1 GII THIU V HA MY TNH ................................................ 5 1.1 Tng quan ha my tnh ......................................................................... 5
1.2 Cc thnh phn c bn ca h ha my tnh ................................................ 7
1.3 H ta th gii thc, h ta thit b v h ta chun ............................... 7 Chng 2 CC THUT TON V I TNG HA C BN .....................11 2.1 Thut ton v on thng ............................................................................11
2.1.1 Thut ton DDA (Digital DifferentialAnalyzer) ................................................. 12 2.1.3 Thut ton MidPoint .......................................................................................... 17
2.2 Thut ton MidPoint v ng trn ..............................................................23
2.3 Thut ton MidPoint v Ellipse ....................................................................27
2.4. ng cong tham s .................................................................................31
2.4.1. ng cong Bezier ................................................................................31
2.4.1.1. Thut ton de Casteljau .............................................................................. 31 2.4.1.2. Thut ton Horner....................................................................................... 34
2.4.2. ng cong B-Spline .............................................................................37
Bi tp chng 2 ...........................................................................................42
Chng 3 T MU .......................................................................................44 3.1 Gii thiu v mu sc ................................................................................44 3.2 T mu n gin ......................................................................................44
3.3 T mu theo dng qut (ScanConvert) ..........................................................48 3.4 T mu theo vt du loang (FloodFill) ..........................................................52 Bi tp chng 3 ...........................................................................................54
Chng 4 PHP BIN I HAI CHIU ............................................................55 4.1 Nhc li cc php ton c s vi ma ma trn. ..................................................55
4.2 Php tnh tin ...........................................................................................56
4.3 Php bin i t l ....................................................................................57 4.4 Php quay ...............................................................................................57
4.5 Php i xng .........................................................................................60 4.6 Php bin dng .........................................................................................60
Gio trnh Ha My Tnh 3
4.7 Php bin i Affine ngc ........................................................................61
4.8 H ta thun nht ..................................................................................62 4.9 Kt hp cc php bin i ...........................................................................63 Bi tp chng 4 ...........................................................................................64
Chng 5 GIAO CC I TNG HA ....................................................66 5.1. M u ..................................................................................................66 5.2. Giao ca hai on thng .............................................................................67 5.3. on thng v hnh ch nht .......................................................................68
5.3.1 Tm giao bng cch gii h phng trnh ....................................................... 69 5.3.2 Thut ton chia nh phn ............................................................................... 69 5.3.3 Thut ton Cohen-Sutherland ........................................................................ 72 5.3.4 Thut ton Liang-Barsky ............................................................................... 74
5.4. Giao ca on thng v a gic li ...............................................................77 5.5. Giao hai a gic .......................................................................................80 5.6. K thut Ray tracing .................................................................................85 Chng 6 HA BA CHIU ........................................................................91 6.1. Gii thiu ha 3 chiu ...........................................................................91 6.2. Biu din i tng 3 chiu ........................................................................92 6.3. Cc php bin i 3 chiu ..........................................................................98
6.3.1. H ta bn tay phi - bn tay tri .................................................................. 98 6.3.2. Cc php bin i Affine c s ......................................................................... 99
6.3.2.1 Php quay quanh trc x ................................................................................ 99 6.3.2.2 Php quay quanh trc y .............................................................................. 100 6.3.2.3 Php quay quanh trc z ............................................................................. 100 6.3.2.4 Php quay quanh trc song song vi trc ta ....................................... 101 6.3.2.5 Php quay quanh trc bt k ..................................................................... 103
PH LC: TH VIN HA OpenGL ....................................................... 107
TI LIU THAM KHO .............................................................................. 120
Gio trnh Ha My Tnh 4
M U
ha my tnh l mt trong nhng lnh vc hp dn v pht trin nhanh ca
Cng ngh Thng tin. N c ra i bi s kt hp ca 2 lnh vc thng tin v truyn
hnh, v c s dng rng ri trong hu ht cc ng dng nh khoa hc v cng ngh, y hc, gio dc, kin trc, v k c gii tr. Ngy nay, nh vo s tin b ca
khoa hc k thut nn phn cng v gi thnh ca my tnh cng lc cng ph hp,
cc k thut ha c ng dng trong thc t nhiu nn ngy cng c nhiu ngi
quan tm nghin cu n lnh vc ny.
Tuy nhin, vic dy v hc k thut ha my tnh th khng n gin v ch ny c nhiu vn phc tp, lin quan n tin hc v c ton hc. Hu ht cc gii
thut v, t mu cng cc php bin hnh u c xy dng da trn nn tng ca hnh hc khng gian hai chiu v ba chiu.
Gio trnh ha my tnh ny c xy dng da trn kinh nghim ging dy qua v da trn ti liu tham kho chnh l : Donald Hearn, M. Pauline Baker;
Computer Graphics; Prentice-Hall, Inc., Englewood Cliffs, New Jersey , 1986.
Gio trnh ha my tnh l mt mn hc c ging dy cho sinh vin chuyn ngnh Cng ngh Thng tin vi 45 tit l thuyt v 30 tit thc tp. Ni dung ca gio trnh ny gm c 3 vn chnh nh sau :
Trnh by cc thut ton v v t cc ng c bn nh ng thng, a gic, ng trn, ellipse v cc ng Bezier, B-Spline. Cc thut ton ny
gip cho sinh vin c th t thit k v v t mu mt m hnh ha .
Ni dung th hai cp n cc php bin i Affine, tm giao cc i tng, t mu ca ha hai chiu.
Ni dung th ba trnh by v quan st, hin th v bin i Affine trn khng
gian ba chiu.
Trong qu trnh bin son chc khng trnh khi thiu st, ti xin trn trng nhn c s gp ca cc qu ng nghip v sinh vin gio trnh ngy cng c hon thin hn.
Gio trnh Ha My Tnh 5
Chng 1
GII THIU V HA MY TNH
Ni dung chnh
Tng quan v ha my tnh.
Cc ng dng ca ha my tnh. Cc thnh phn c bn ca h ha my tnh.
H ta thc v h ta ha.
1.1 Tng quan ha my tnh
ha my tnh bao gm tt c nhng g lin quan n vic s dng my tnh
pht sinh ra hnh nh. Cc vn lin quan n cng vic ny bao gm: to, lu tr,
thao tc trn cc m hnh v cc nh.
Ngy nay, hu ht cc chng trnh son tho, bng tnh s dng ha trong
giao din vi ngi dng. S pht trin ca ha my tnh ngy cng rng ri vi cc ch ha hai chiu (2D) v 3 chiu (3D), v cao hn, n phc v trong cc lnh vc x hi hc khc nhau nh khoa hc, gio dc, y hc, k thut, thng mi v
gii tr. Tnh hp dn v a dng ca ha my tnh c th c minh ha rt trc quan thng qua vic kho st cc ng dng ca n.
ha my tnh c s dng rt rng ri v c n 80% cc ng dng lin quan
n hnh nh v c ng dng trong nhiu lnh vc khc nhau nh cng nghip,
thng mi, qun l, gio dc, gii tr, v.v. S lng cc chng trnh ha ng dng rt ln v pht trin lin tc. Sau y l mt s ng dng tiu biu ca ha trong thc t:
H tr thit k - CAD/CAM (Computer-Aided Design/ Computer-Aided Manufacturing): Cc h thng thit k v ch to vi s tr gip ca my tnh c ng dng trong cc lnh vc nh phn tch thit k kt cu xy dng,
cng nghip in t, cng nghip thi trang, cc ngnh cng nghip ch to
t, my bay, xe my....
Gio trnh Ha My Tnh 6
th v bn (Graphs and Charts): y l ng dng ch yu trong lnh vc ha minh ha, ng dng ny cho php hin th cc biu d liu cng
nh trong lnh vc biu din v x l ha. Mt trong s nhng ng dng hin nay l h thng thng tin a l GIS (Geographical Information System).:
Gii tr: Vi s h tr ha hin nay chng ta c th sn xut nhiu sn phm
phc v cho lnh vc gii tr c bit l phim hot hnh v cc tr chi trn
my tnh. Nhiu phn mm v ngn ng lp trnh h tr ra i cho php ta to
ra cc hnh nh ng gn vi vi cuc sng thc. Trong gio trnh ny chng
ta s lm quen vi cng c OpenGL.
ng dng m phng v thc ti o (Simulation and Virtual Reality): Bn cnh vic h tr thit k kin trc v trong sn xut cng nghip, ha my tnh
cn c ng dng rt quan trng trong m phng cc cng trnh kin trc, cc
di sn vn ha, trong ging dy cc mn hc. ng dng thc ti o l mc
cao hn ca m phng. Thc ti o p dng cc k thut ha kt hp vi cc thit b 3D to ra cc ng dng m phng ging nh thc nhng c
thc hin trn my tnh nh li my bay, bn sng trong qun s, gii phu
trong y khoa, .
X l nh (Image Processing): Cc k thut x l v thay i mt bc nh c sn v c p dng trong nhiu lnh vc ca i sng. V d ta c th s
dng phn mm khi phc mt bc nh, phn tch cc bc nh c chp
t v tinh...
K thut nhn dng (Pattern Recognition): y l mt lnh vc ca k thut x l nh, cc chuyn gia s xy dng mt th vin nh gc bng cch p dng
cc thut ton phn tch v chn lc t nhng nh mu c sn. Da trn th
vin cc chuyn gia c th phn tch v t hp nh
Giao din ha ngi dng (Graphical User Interface-GUI): Rt nhiu phn mm ng dng ngy nay cung cp GUI cho ngi dng. Thnh phn chnh ca mt giao din ha l chng trnh qun l ca s cho php ngi s
dng hin th nhiu ca s ngi ta gi l cc ca s hin th. Nh c GUI
m ngi s dng c th d dng thit k giao din cho cc chng trnh ng
dng.
Gio trnh Ha My Tnh 7
1.2 Cc thnh phn c bn ca h ha my tnh
pht trin h thng ha my tnh ta cn phi trang b c phn cng ln phn mm cng nh cc ng dng khc. Trong , cc thit b phn cng l ty thuc vo
tng ng dng ha c th m c th cn thit hoc khng cn thit.
Phn cng
Thit b thu nhn: ly d liu u vo cho ng dng ha nh bn phm, chut, my qut, camera, ...
Thit b hin th: hin th hnh nh ca ng dng ha nh cc loi mn hnh
CRT, LCD,
Thit b tng tc: lm giao tip trung gian gia ngi dng v cc ng dng ha thc ti o, to cm gic ngi dng ging nh thao tc trc tip trong
mi trng th gii thc nh gng tay, knh 3D,
Phn mm
Phn mm ha c th phn thnh 2 loi: cc cng c lp trnh v cc trnh ng
dng ha phc v cho mt mc ch no . Cc cng c lp trnh cung cp mt
tp cc th vin ha c th c dng trong cc ngn ng lp trnh cp cao nh
Pascal, C/C++/C#, Java, hay thm tr c c mt th vin ha c th nhng vo
cc ngn ng lp trnh cp bt k nh OpenGL, DirectX. Cc hm c s ca n bao
gm vic to cc i tng c s ca hnh nh nh on thng, a gic, ng trn, thay i mu sc, chn khung nhn, bin i affine,
pht trin cc ng dng ha my tnh cn c cc loi phn mm sau:
To m hnh: 3DS Max, Maya,
Lp trnh, pht trin ng dng: OpenGL, DirectX,
1.3 H ta th gii thc, h ta thit b v h ta chun
Mt h ha bao gm 3 min nh sau:
Min iu khin : bao bc ton b h thng.
Gio trnh Ha My Tnh 8
Min thc : nm trong min iu khin. Khi mt gi tr nm trong min
thc, n s c chuyn thnh s thc du phy ng, v khi c mt s ri
khi min ny th n s c chuyn thnh s nguyn.
Min hin th : nm trong min iu khin nhng phn bit vi min thc. Ch c gi tr s nguyn mi nm trong min hin th.
Trong lnh vc k thut ha, chng ta phi hiu c rng thc cht ca
ha l lm th no c th m t v bin i c cc i tng trong th gii thc trn my tnh. Cc i tng trong th gii thc c m t bng ta trong min
thc. Trong khi , h ta thit b li s dng h ta nguyn hin th cc hnh nh. y chnh l vn c bn cn gii quyt. Ngoi ra, cn c mt kh khn khc
na l vi cc thit b khc nhau th c cc c trng v thng s k thut khc nhau.
Do , cn c mt phng php chuyn i tng ng gia cc h ta v i tng
c th m t gn ng vi hnh nh thc bn ngoi.
Hai m hnh c bn ca ng dng ha l da trn mu s ha v da trn c trng hnh hc. Trong ng dng ha da trn mu s ha th cc i tng ha
c to ra bi li cc pixel ri rc. Cc pixel ny c th c to ra bng cc chng trnh v, my qut, ... Cc pixel ny m t ta xc nh v tr v gi tr mu.
Thun li ca ng dng ny l d dng thay i hnh nh bng cch thay i mu sc
hay v tr ca cc pixel, hoc di chuyn vng nh t ni ny sang ni khc. Tuy nhin,
iu bt li l khng th xem xt i tng t cc gc nhn khc nhau.
ng dng ha da trn c trng hnh hc bao gm cc i tng ha c s nh on thng, a gic, ...v.v. Chng c lu tr bng cc m hnh v cc thuc
tnh. Chng hn, on thng c m hnh bng hai im u v cui, c thuc tnh
nh mu sc, dy. Ngi s dng khng thao tc trc tip trn cc pixel m thao
tc trn cc thnh phn hnh hc ca i tng.
H ta th gii thc
H ta thc thng c dng m t cc i tng trong th gii thc l
h ta Descartes. Trong h ta ny, mi im P c biu din bi mt cp ta
(xp, yp) vi xp, yp R (xem hnh 1.1).
Gio trnh Ha My Tnh 9
Hnh 1.1 H ta thc
Trong :
Ox : trc honh.
Oy : trc tung.
xp
: honh im P.
yp
: tung im P.
H ta thit b
H ta thit b c dng cho mt thit b xut c th no , v d nh my
in, mn hnh, ...v.v. Trong h ta thit b th cc im cng c m t bi cp ta
(x,y). Tuy nhin, khc vi h ta thc l x, y . iu ny c ngha l cc im trong h ta thc c nh ngha lin tc, cn cc im trong h ta thit b l
ri rc. Ngoi ra, cc ta x, y ca h ta thit b ch biu din c trong mt
gii hn no ca .
V d : phn gii ca mn hnh trong ch ha l 640x480. Khi , x
(0,640) v y (0, 480) (xem hnh 1.2).
Gio trnh Ha My Tnh 10
H ta mn hnh
H ta thit b chun
Do cch nh ngha cc h ta thit b khc nhau nn hnh nh hin th chnh
xc trn thit b ny th cha chc hin th chnh xc trn tht b khc. Ngi ta xy dng mt h ta thit b chun i din chung cho tt c cc thit b c th m t cc hnh nh m khng ph thuc vo bt k thit b no.
Trong h ta chun, cc ta x, y s c gn cc gi tr trong on t [0,1]. Nh vy, vng khng gian ca h ta chun chnh l hnh vung n v c gc tri
di (0, 0) v gc phi trn l (1, 1).
Quy trnh hin th cc i tng thc nh sau (xem hnh 1.3):
Hnh 1.3 H ta thit b
Gio trnh Ha My Tnh 11
Chng 2
CC THUT TON
V I TNG HA C BN
Ni dung chnh
Cc thut ton v on thng: DDA, Bresenham, MidPoint.
Thut ton MidPoint v ng trn, ellipse.
V ng cong tham s Bezier, B-Spline.
2.1 Thut ton v on thng
Hnh 2.1: Cc im gn on thng thc
Xt on thng c h s gc m (0, 1] v x > 0. Vi cc on thng dng ny, nu (xi, yi) l im c xc nh bc th i th im k tip (xi+1, yi+1) bc th i+1 s l mt trong hai im sau:
Vn t ra l chn im v nh th no on thng c v gn vi on
Gio trnh Ha My Tnh 12
thng thc nht v ti u ha v mt tc , thi gian thc.
2.1.1 Thut ton DDA (Digital DifferentialAnalyzer)
DDA (hay cn gi l thut ton s gia) l thut ton v on thng xc nh cc im da vo h s gc ca phng trnh ng thng y = m.x + b. Trong , m = y/x, y = yi+1
- yi
, x = xi+1
- xi. Nhn thy trong hnh v 2.1 th ta ca im x
s tng 1 n v trn mi im v, cn vic quyt nh chn yi
l yi
+ 1 hay yi
s ph
thuc vo gi tr sau khi lm trn ca tung y. Tuy nhin, nu tnh trc tip gi tr
thc ca y mi bc t phng trnh y = m.x + b th cn mt php ton nhn v mt php ton cng s thc:
yi+1
= m.xi+1
+ b = m(xi
+ 1) + b = m.xi
+ b + m
ti u tc , ngi ta kh php nhn trn s thc.
Ta c : yi
= m.xi
+ b
yi+1
= yi
+ m
Tm li, khi 0 < m 1th:
xi+1
= xi
+ 1
yi+1
= yi
+ m
Trng hp m > 1: chn bc tng trn trc y mt n v.
xi+1
= xi
+
yi+1
= yi
+ 1
Hai trng hp ny dng v mt im bt u t bn tri n im cui cng bn phi ca ng thng (xem hnh 2.2). Nu im bt u t bn phi n im cui cng bn tri th xt ngc li :
0 < m 1: xi+1= xi 1
Gio trnh Ha My Tnh 13
yi+1:= yi - m
m > 1: xi+1 = xi
yi+1 = yi 1
Hnh 2.2 : Hai trng hp m >1 v 0 < m < 1
Ci t minh ha thut ton DDA
void DDALine(int x0, int y0, int x1, int y1)
{ int x;
float dx, dy, y, m; dx:= x1 x0;
dy:= y1 y0;
m:= dy/dx;
y = y0;
for (x=x0; x
Gio trnh Ha My Tnh 14
y = y+m
}
}
Tng t, ta c th tnh ton cc im v cho trng hp m < 0, |m| 1 hoc |m| > 1. 2.1.2 Thut ton Bresenham
Hnh 2.3 : Thut ton Bresenham v on thng c 0 m 1.
Gi (xi +1, yi +1) l im thuc on thng (xem hnh 2.3). Ta c y = m(xi +1) + b.
t d1 = yi +1 - yi ; d2 = (yi +1) - yi +1
Vic chn im (xi +1, yi +1) l P1 hay P2 ph thuc vo vic so snh d1 v d2 hay du ca d1 - d2 :
Nu d1 - d2 < 0 : chn im P1, tc l yi +1 = yi
Nu d1 - d2 0 : chn im P2, tc l yi +1 = yi +1
Xt Pi = x(d1 - d2)
Ta c : d1 - d2 = 2yi+1 - 2yi - 1
= 2m(xi+1) + 2b - 2yi - 1
Gio trnh Ha My Tnh 15
Pi = x(d1 - d2) = x[2m(xi+1) + 2b - 2yi - 1]
= x[2(y/x)(xi+1) + 2b - 2yi - 1]
= 2y(xi+1) - 2x.yi + x(2b - 1)
= 2y.xi - 2x.yi + 2y + x(2.b - 1)
Vy C = 2y + x(2b - 1) = Const (hng s)
Pi = 2y.xi - 2x.yi + C
Nhn xt rng nu ti bc th i ta xc nh c du ca Pi th xem nh ta xc
nh c im cn chn bc (i + 1). Ta c :
Pi +1 - Pi = (2y.xi+1 2x.yi+1 + C) - (2y.xi - 2x.yi + C )
Pi +1 = Pi + 2y 2x( yi+1 - yi )
- Nu Pi < 0 : chn im P1, tc l yi +1= yi v Pi +1 = Pi + 2y.
- Nu Pi 0 : chn im P2, tc l yi +1= yi +1 v Pi +1 = Pi + 2y 2x
- Gi tr P0 c tnh t im v u tin (x0, y0) theo cng thc :
P0 = 2y.x0 2x.y0 + C
Do (x0, y0) l im nguyn thuc v on thng nn ta c :
y0 = 2m.x0 + b = x0 + b
Th vo phng trnh trn ta c :
P0 = 2y x
Ci t minh ha thut ton Bresenham
void Bresenham_Line (int x1,int y1,int x2,int y2)
Gio trnh Ha My Tnh 16
{
int dx, dy, x, y, P, incre1, incre2;
dx = x2 - x1; dy = y2 - y1;
P = 2*dy - dx;
incre1 = 2*dy ; incre2 = 2*(dy - dx) ;
x= x1; y=y1;
glVertex2i(x, y);
while (x < x2 )
{
x = x +1 ;
if (P < 0) P = P + incre1
else
{
y = y+1 ;
P = P + incre2
}
glVertex2i(x, y);
}
}
Gio trnh Ha My Tnh 17
Nhn xt
- Thut ton Bresenham ch thao tc trn s nguyn v ch tnh ton trn php
cng v php nhn 2. iu ny l mt ci tin lm tng tc ng k so vi
thut ton DDA.
- tng chnh ca thut ton ny l ch xt du Pi quyt nh im k tip, v s dng cng thc truy hi Pi +1 - Pi tnh Pi bng cc php ton n
gin trn s nguyn.
- Tuy nhin, vic xy dng trng hp tng qut cho thut ton Bresenham c
phc tp hn thut ton DDA.
2.1.3 Thut ton MidPoint
Pitteway cng b thut ton MidPoint vo 1967, Van Aken ci tin 1984. Xt h s gc thuc [0, 1]. Gi thit rng chn P v, xc nh pixel tip theo s l ti N hay NE (xem hnh 2.4). Giao ca ng thng vi Xp+1 ti Q, M l trung im ca NE v E.
Hnh 2.4: Thut ton MidPoint v on thng
tng ca thut ton MidPoint l xt im M xem nm pha no ca ng thng, nu M nm pha trn ng thng th chn E (tc l ng thng gn vi E hn NE), ngc li chn NE. V vy, ta cn xc nh v tr tng i ca M so vi ng thng cha on thng cn v.
Phn tch thut ton v on thng da trn phng trnh dng tng qut ca
Gio trnh Ha My Tnh 18
ng thng cha on thng: F(x, y)= a.x + b.y + c
Ta c:
Suy ra dng tng qut: . Hay tng ng:
.
T , ta c cc h s ca phng trnh dng tng qut l :
a = dy, b = - dx, c = B.dx
Gi tr hm ti M: F(M)=F(xp + 1, yp + ) = d o Nu d > 0, M nm di ng thng th chn NE. o Nu d < 0, M nm pha trn th chn E. o Nu d = 0, chn E hay NE ty .
Gi tr ca hm ti M ca ca im tip theo s v o Gi gi tr d va tnh l:
o Gi s va chn E:
l s gia ca im tip theo.
o Gi s va chn NE:
l s gia ca
im tip theo.
Tnh gi tr khi u ca d ti cc trung im
Gio trnh Ha My Tnh 19
o Gi s v on thng t (x0, y0) n (x1, y1), t trung im th nht c ta (x0 + 1, y0 + ). Suy ra:
o F(x0, y0) = 0 dstart = a + = dy
o Trnh s thp phn ca dstart, nh ngha li hm nh sau:
F(x, y)=2(a.x + b.y + c)
o Do vy, ta c:
dstart = 2dy - dx; E = 2dy; NE = 2(dy - dx)
Ci t minh ha thut ton MidPoint
void MidPoint_Line(int x0, int y0, int x1, int y1, int color)
{
int dx, dy, x, y, d, incrE, incrNE ;
dx = x1 x0;
dy = y1 y0;
d = 2*dy - dx;
incrE = 2*dy;
incrNE = 2*(dy - dx);
x = x0;
y =y0;
Gio trnh Ha My Tnh 20
glVertex2i(x, y);
while (x
Gio trnh Ha My Tnh 21
C mt tnh cht i xng c th p dng v on thng trong cc trng
hp h s gc khng thuc [0, 1] m khng ph thuc vo thut ton. iu ny c ngha l ta s ly i xng cc on thng ny v trng hp thuc on
[0,1], tnh ton xong mi ta (x, y) ta li ly i xng tr li ri v. Sau y l chng trnh ci t thut ton DDA tng qut cho tt c cc trng
hp theo phng php ly i xng :
void LineDDA_DX(int x1, int y1, int x2, int y2) { if (x2 < x1) { int t = x2; x2 = x1; x1 = t;
t = y2; y2 = y1; y1 = t; }
double m; int dx = x2 - x1; int dy = y2 - y1; m = (double)dy / (double)dx;
int d; if (m > 1) { d = 1;
int temp = x1; x1 = y1; y1 = temp;
temp = x2; x2 = y2; y2 = temp;
dy = y2 - y1; dx = x2 - x1; m = (double)dy / (double)dx; } else if (m > 0) { d = 2; }
Gio trnh Ha My Tnh 22
else if (m > -1) { d = 3; y1 = -y1; y2 = -y2;
dy = y2 - y1; dx = x2 - x1; m = (double)dy / (double)dx; } else { d = 4; int temp2 = x1; x1 = -y1; y1 = temp2;
temp2 = x2; x2 = -y2; y2 = temp2;
dy = y2 - y1; dx = x2 - x1; m = (double)dy / (double)dx; }
int x; double y; y = y1; for (x = x1; x
Gio trnh Ha My Tnh 23
}
}
2.2 Thut ton MidPoint v ng trn
Trong h ta Descartes, phng trnh ng trn bn knh R c dng:
Vi tm O(0,0) : x2 + y2 = R2 Vi tm C(xc, yc): (x - xc)2 + (y - yc )2 = R2
Trong h ta cc :
x = xc + R.cos
y = yc + Y.sin
vi [0, 2pi].
Hnh 2.5: i xng 8 im trong ng trn
Do tnh i xng ca ng trn C (xem hnh 2.5) nn ta ch cn v 1/8 cung trn, sau ly i xng qua 2 trc ta v 2 ng phn gic th ta v c c
ng trn.
Thut ton MidPoint a ra cch chn yi+1 l yi hay yi-1 bng cch so snh im
Gio trnh Ha My Tnh 24
thc Q(xi+1, y) vi im gia M l trung im ca S1 v S2. Chn im bt u v l (0, R). Gi s (xi, yi) l im nguyn tm c bc th i (xem hnh 2.6), th im (xi+1, yi+1) bc i+1 l s la chn gia S1 v S2.
Hnh 2.6 : ng trn vi im Q(x +1, y) v im MidPoint.
t F(x, y) = x2 + y2 - R2, ta c :
F(x, y) < 0 , nu im (x, y) nm trong ng trn. F(x, y) = 0 , nu im (x, y) nm trn ng trn. F(x, y) > 0 , nu im (x, y) nm ngoi ng trn.
Xt Pi = F(M) = F(xi +1, y - ). Ta c :
Nu Pi < 0 : im M nm trong ng trn. Khi , im thc Q gn vi im S1 hn nn ta chn yi+1 = yi.
Nu Pi >= 0 : im M nm ngai ng trn. Khi , im thc Q gn vi im S2 hn nn ta chn yi+1 = yi - 1.
Mt khc :
Pi+1 - Pi = F(xi+1+1, yi+1 - ) - F(xi + 1, yi - )
Gio trnh Ha My Tnh 25
= [(xi+1 +1)2 + (yi+1 - )2 - R2 ] - [(xi +1)2 + (yi - )2 - R2]
= 2xi + 3 + ((yi+1)2 + (yi)2 ) - (yi+1 - yi)
Vy :
Nu Pi < 0 : chn yi+1 = yi. Khi , Pi+1 = Pi + 2xi + 3
Nu Pi >= 0 : chn yi+1 = yi - 1. Khi , Pi+1 = Pi + 2xi - 2yi + 5.
Pi ng vi im ban u (x0, y0) = (0, R) l:
P0 = F(x0 + 1, y0 - ) = F(1, R - ) = R
rt gn biu thc trn v trnh vic tnh ton s thc, ta t P0 = P0 -
= 1 R. Ta c nhn xt rng du ca P0 khng thay i trong thut ton MidPoint.
Ci t minh ha thut ton MidPoint v dng trn
void Ve_doi_xung_8diem(int xc, int yc, int x, int y)
{
glVertex2i(x + xc, y + yc);
glVertex2i(y + xc, x + yc);
glVertex2i(-x + xc, -y + yc);
glVertex2i(-y + xc, -x + yc);
glVertex2i(-x + xc, y+ yc);
glVertex2i(-y + xc, x + yc);
glVertex2i(x + xc, -y + yc);
glVertex2i(y + xc, -x + yc);
Gio trnh Ha My Tnh 26
}
void MidPoint_Circle(int xc, int yc, int r);
{
int x, y, p;
x=0 ;
y=r;
p=1 - r;
while ( y > x)
{
Ve_doi_xung_8diem(xc, yc, x, y);
if (p < 0) p=p + 2*x + 3
else
{
p = p + 2*(x - y) + 5 ;
y =y - 1;
}
x = x + 1;
}
}
Gio trnh Ha My Tnh 27
2.3 Thut ton MidPoint v Ellipse
Xt phng trnh elp c tm ti gc ta
p dng thut ton MidPoint v ng trn v elp. Tnh i xng ca elp l khi bit ta mt im c th d dng suy ra ta ba im i xng vi n qua
cc trc Ox, Oy v gc ta .
V elp ch c tnh cht i xng bn im nn ta phi v mt phn t ca elp,
sau mi ly i xng v cc phn cn li ca elp. u tin ta tm ranh gii hai
min trong gc phn t th nht ca elp
Hnh 2.7: Phn chia hai min ca elp
V tr: im P l tip im ca tip tuyn c h s gc 1
Xc nh: Vc t vung gc vi tip tuyn ti tip im, gi tr gradient:
Ti P cc thnh phn i v j ca vc t gradient c cng ln. tng ca thut ton l nh gi hm ti trung im hai ta pixel chn v tr tip theo v. Du ca n cho bit trung im nm trong hay ngoi elp.
Hnh 2.8: Phn tch v hai min ca ellipse
Gio trnh Ha My Tnh 28
Xt min 1
Tnh bin quyt nh ti trung im u tin nu im ang xt l xp, yp:
d = F(x, y) = F(xp + 1, yp - )
Nu d < 0: chn E, x tng 1, y khng thay i.
Nu d 0: chn SE, x tng 1, y gim 1:
Xt min 2:
Tng t, tnh bin quyt nh d = F(x, y) = F(xp + , yp - 1)
o Nu d < 0: chn SE, x tng 1, y gim 1.
o Nu d 0: chn S, x khng tng, y gim 1.
Tm s gia nh min 1, ta c:
o S = a2(-2yp + 3)
o SE = b2(2xp + 2) + a2(-2y + 3)
Tm gi tr khi u ca s gia d:
Min 1: o Gi s a, b nguyn, im bt u v l (0, b) o Trung im th nht: (1, b - 1/2)
Gio trnh Ha My Tnh 29
Min 2: Ph thuc vo trung im (xp + 1, yp - ) ca im tip theo im cui
cng ca min 1.
Ci t minh ha thut ton MidPoint v Elp
void Ve_doi_xung_4diem(int xc, int yc, int x, int y)
{
glVertex2i(x + xc, y + yc);
glVertex2i(-x + xc, y + yc);
glVertex2i(-x + xc, -y + yc);
glVertex2i(-y + xc, x + yc); } void ellipse(int xc, int yc, int a, int b) {
int x, y;
float d1, d2; x=0; //{Khi ng} y=b; d1=b2-a2b+a2/4; Ve_doixung_4diem(x, y); while (a2(y-1/2)>b2(x+1)) {Vng 1} {
Gio trnh Ha My Tnh 30
If (d10) // {Vng 2} {
if (d2
Gio trnh Ha My Tnh 31
2.4. ng cong tham s 2.4.1. ng cong Bezier
2.4.1.1. Thut ton de Casteljau
Thut ton de Casteljau da trn dy cc im iu khin xy dng vi gi tr t trong on [0, 1] tng ng vi mt im P(t). Do , thut ton sinh ra mt dy cc im t cc im iu khin cho trc. Khi cc im iu khin thay i, ng
cong s thay i theo. Cch xy dng ng cong da trn php ni suy tuyn tnh v do rt d dng giao tip. Ngoi ra, phng php ny cng a ra nhiu tnh cht
quan trng ca ng cong.
Parabol da trn ba im
Trong mt phng R2 xt ba im P0, P1, P2. t
Trong , t [0, 1]. Ni cch khc, vi mi t [0, 1], cc im )(10 tP , )(11 tP nm trn cc on thng P0P1 v P1P2 tng ng.
Hnh 2.9: ng cong Bezier xc nh bi ba im iu khin
Gio trnh Ha My Tnh 32
Lp li php ni suy tuyn tnh trn cc im mi )(10 tP v )(11 tP ta c:
Qu tch ca )(:)( 20 tPtP = khi t thay i trong on [0, 1] s cho ta ng cong nh trn hnh (b).
D dng suy ra
Suy ra P(t) l ng cong parabol theo bin t.
V d: Phng trnh ng cong Bezier P(t) tng ng ba im iu khin P0(1, 0), P1(2, 2), P2(6, 0) l:
Tng qut cho trng hp s im iu khin 3 ta c:
Thut ton de Casteljau cho L + 1 im iu khin
Trong mt phng R2 xt L+1 im P0, P1,..., PL. Vi mi gi tr t cho trc, ta xy
dng theo quy np ng cong )(0 tPL nh sau:
Bc 1: [Khi to] t r = 0 v iri PtP =:)( vi mi i=0, 1, , L-r. Bc 2: [Kt thc?] Nu r = L dng; ngc li t
Bc 3: Thay r bi r+1 v chuyn sang bc 2.
Ci t minh ha thut ton Casteljau
Point Casteljau(float t)
Gio trnh Ha My Tnh 33
{ Point Q[Max]; int i, r;
for (i = 0; i
Gio trnh Ha My Tnh 34
2.4.1.2. Thut ton Horner
a thc Bernstein v ng cong Bezier
Cch tip cn trong phn trc cho ta thut ton hnh hc v ng cong Bezier.
Phn ny trnh by cch biu din gii tch ca ng cong Bezier.
Tht vy, d dng chng minh rng ng cong Bezier P(t) tng ng cc im iu khin P0, P1,, PL, xc dnh bi:
trong
l a thc Bernstein, v
kL
l t hp chp k ca L phn t.
V d, t nh ngha trn, ta c cc a thc Bernstein bc ba:
th minh ha ca bn a thc ny khi t [0, 1]:
Gio trnh Ha My Tnh 35
Hnh 2.10 . Cc a thc Bernstein bc ba
V d, phng trnh tham s ca ng cong Bezier tng ng bn im iu
khin P0(1, 0), P1(2, 3), P2(6, 0), P3 (9, 2) c dng:
V ng cong Bezier qua a thc Bernstein
Da vo lc Horner tnh gi tr a thc Bernstein, ta xy dng th tc
xc nh ng cong Bezier hiu qu hn Casteljau. Mt v d nhn lng nhau ca lc Horner trong trng hp a thc bc ba:
Tng t vi ng cong Bezier bc ba:
Gio trnh Ha My Tnh 36
trong , s = 1 t. Nhn xt rng:
Do , ta c chng trnh tnh gi tr hm Bezier P(t) trong trng hp tng qut, vi NumVertices chnh l s im iu khin L+1.
Ci t minh ha thut ton Horner
Point Horner_Bezier(float t) {
int i, L_choose_i; float Fact, s; Point Q; s = 1.0 - t;
Fact = 1.0;
L_choose_i = 1;
Q.x = P[0].x*s; Q.y = P[0].y*s; for(i = 1; i < L; i++) {
Fact *= t;
L_choose_i *= (L - i + 1)/i; Q.x = (Q.x + Fact*L_choose_i*P[i].x)*s; Q.y = (Q.y + Fact*L_choose_i*P[i].y)*s;
} Q.x += Fact*t*P[L].x; Q.y += Fact*t*P[L].y; return(Q);
}
Gio trnh Ha My Tnh 37
2.4.2. ng cong B-Spline
ng cong Bezier c iu khin mt cch ton cc, c ngha l khi mt
im iu khin thay i th ton b ng cong cng thay i theo. Trong thc t, ta
mong mun thay i mt on trn ng cong nh hnh 2.11, tc l iu khin mt
cch a phng. iu ny ng cong Bezier khng thc hin c. Do , ta cn
tm cc a thc trn li (hm trn) m vn gi tnh cht tt ca a thc Bernstein v cc a thc ny c gi tr cha trong on [0, 1] ngi thit k iu khin ng cong theo mong mun mt cch a phng.
c th iu khin hnh dng cc hm trn, ta cn xy dng cc hm lin tc
Rk(t) l nhng a thc tng khc. Do , Rk(t) trn mi khong (ti, ti+1] l mt a thc. Suy ra, ng cong P(t) l tng cc a thc tng khc vi trng lng l cc im iu khin. Chng hn, trong khong no th ng cong c dng:
Hnh 2.11: Thay i ng cong mong mun
Trong khong k tip, ng cong c cho bi mt cc a thc khc, v tt c cc on cong ny to thnh mt ng cong lin tc. ng cong ny c gi l
Gio trnh Ha My Tnh 38
ng cong Spline. Trn mt h cc hm trn, ta chn xy dng cc hm trn c gi tr nh nht v do iu khin a phng tt nht. Khi , ta gi ng cong ny l B-Spline. Mi hm B-Spline phc thuc vo m v c bc m-1, chng ta k hiu Nk,m thay cho Rk(t). Do , phng trnh ng cong B-Spline c dng:
Nh vy, xc nh ng cong B-Spline, ta cn:
Vector knot T = (t0, t1, ..., ). L +1 im iu khin P0, P1, ..., PL.
Bc m ca cc hm B-spline.
Cng thc xc nh hm quy B-spline Nk,m
vi k = 0, 1, , L, v
V d, xt vector Knot T= (t0 = 0, t1 = 1, t2 = 2,...) c khong cch gia cc Knot l 1. Khi :
th ca hm N0,2(t) trn on [0, 2] l cc a thc bc 1 v l mt tam gic vi cc nh (0, 0), (1, 1) v (2, 0).
Gio trnh Ha My Tnh 39
Hnh 2.12: th cc hm B-spline tuyn tnh.
Trong thc t, m = 3, v m = 4 thng c s dng tng ng vi ng
cong B-Sline bc 2 v bc 3.
m = 3
Hnh 2.13: th hm B-Spline bc 2(m=2)
Gio trnh Ha My Tnh 40
Hnh 2.14: th hm B-Spline bc 3 (m=4)
Ci t minh ha thut ton v ng cong B-Spline
void Create_Knot(int m) {
if (L < m || L + m > Max) return;
int i;
for (i = 0; i < m; i++) Knot[i] = 0; for (; i
Gio trnh Ha My Tnh 41
}
int N(int k, int m, float t) {
if (m == 1) { if (t < Knot[k] || t > Knot[k + 1]) return 0; return 1;
} else { float Sum, Demo1, Demo2; Demo1 = Knot[k + m - 1] - Knot[k]; if (Demo1 != 0) Sum = (t - Knot[k]) * N(k, m - 1, t) / Demo1; else Sum = 0;
Demo2 = Knot[k + m] - Knot[k + 1]; if (Demo2 != 0)
Sum += (Knot[k + m] - t) * N(k + 1, m - 1, t) / Demo2; return Sum;
} }
Point Brestern_Spline(float t) { Create_Knot(M); Point Q = new Point(); Q.X = 0; Q.Y = 0; float x = 0, y = 0; for (int i = 0; i
Gio trnh Ha My Tnh 42
{ x += N(i, M, t) * P[i].X; y += N(i, M, t) * P[i].Y; } Q.X = (int)x; Q.Y = (int)y;
return Q; }
Bi tp chng 2
1. Vit chng trnh v bu tri c 1.000 im sao, mi im sao xut hin vi mt mu ngu nhin. Nhng im sao ny hin ln ri t t tt cng
rt ngu nhin.
2. Vit chng trnh v on thng AB vi theo gii thut DDA.
3. Vit chng trnh v on thng AB vi theo gii thut Bresenham. 4. Tng t nh bi tp 3 nhng s dng gii thut MidPoint trong trng
hp h s gc thuc [0, 1]. 5. Ci tin bi tp 3, vit chng trnh v ng thng bng gii thut
MidPoint cho tt c cc trng hp ca h s gc. Lu xt trng hp c bit khi ng thng song song vi trc tung hay vi trc honh.
6. Vit chng trnh v on thng trong trng hp h s gc tng qut bng phng php ly i xng vi cc thut ton DDA, Bresenham, MidPoint.
7. Vit chng trnh v mt ng trn tm O bn knh R theo thut ton MidPoint.
8. Ci tin bi tp 7 v ng trn c (t mu ng trn). 9. Vit chng trnh v Elippse theo thut ton MidPoint. 10. Ci tin bi tp 9 v Elippse c (t mu Elippse). 11. Vit chng trnh v mt hnh ch nht, mt hnh vung v mt hnh
Gio trnh Ha My Tnh 43
bnh hnh. 12. Vit chng trnh v mt tam gic. Ta cc nh c nhp t bn
phm, mi cnh c mt mu khc nhau. 13. Vit chng trnh v mt a gic c n nh. 14. Vit chng trnh v ng cong Bezier vi n im iu khin: P1, P2,
, Pn nhp t file text.
15. Vit chng trnh v ng cong B-Spline vi n im iu khin: P1, P2, , Pn nhp t file text.
Gio trnh Ha My Tnh 44
Chng 3
T MU
Ni dung chnh
C s v mu sc.
Cc thut ton t mu n gin Thut ton t mu bng dng qut (ScanConvert). Thut ton t mu theo bin (FloodFill).
3.1 Gii thiu v mu sc
T mu mt vng l thay i mu sc ca cc im v nm trong vng cn t.
Mt vng t thng c xc nh bi mt ng khp kn no gi l ng bin.
Dng ng bin n gin thng gp l a gic. Vic t mu thng chia lm 2 cng on :
Xc nh v tr cc im cn t mu.
Quyt nh t cc im trn bng mu no. Cng on ny s tr nn phc tp khi ta cn t theo mt mu t no ch khng phi t thun
mt mu.
Gio trnh gii thiu 3 cch tip cn chnh t mu:
T mu theo tng im (c th gi l t mu n gin). T mu theo dng qut (ScanConvert). T mu da theo vt du loang (FloodFill).
3.2 T mu n gin
Thut ton ny bt u t vic xc nh mt im c thuc vng cn t hay
khng , nu ng th s t vi mu mun t.
Khng mt tnh tng qut, ta xt t mu mt a gic bt k. u tin ta tm hnh ch nht nh nht c cc cnh song song vi hai trc ta cha a gic cn t da
Gio trnh Ha My Tnh 45
vo hai ta (xmin, ymin), (xmax, ymax). Trong , xmin, ymin l honh v tung nh nht, xmax, ymax l honh v tung ln nht ca cc nh ca a gic.
Cho x i t xmin n xmax, y i t ymin n ymax. Xt im P(x, y) c thuc a gic khng, nu c th t vi mu cn t (xem hnh 3.1).
Hnh 3.1: a gic ni tip hnh ch nht.
Nguyn tc xc nh mt im nm trong a gic Mt im nm trong a gic th s giao im t mt tia bt k xut pht t im
ct bin ca a gic phi l mt s l. Tia xut pht c th sang phi hay sang tri.
c bit, ti cc nh cc tr th mt giao im phi c tnh 2 ln (xem hnh 3.2).
V d : Xt a gic gm 13 nh l P0, P1, ....., P12
Hnh 3.2: a gic c 13 nh.
Gio trnh Ha My Tnh 46
Gi tung ca nh Pi l Pi.y . Nu :
- Pi.y < Min(Pi+1.y, Pi-1.y) hay Pi.y > Max(Pi+1.y, Pi-1.y) th Pi l nh cc tr. - Pi-1.y < Pi.y < Pi+1.y hay Pi-1 > Pi.y > Pi+1.y th Pi l nh n iu.
- Pi = Pi+1 v Pi.y < Min(Pi+2.y, Pi-1.y) hay Pi > Max(Pi+2.y, Pi-1.y) th on [Pi, Pi+1] l on cc tr.
- Pi = Pi+1 v Pi-1.y < Pi.y < Pi+2.y hay Pi-1 > Pi.y > Pi+2.y th on [Pi,Pi+1] l on n iu.
Thut ton xc nh im nm trong a gic
- Vi mi nh ca a gic ta nh du l 0 hay 1 theo qui c nh sau: nu l
nh cc tr hay on cc tr th nh s 0. Nu l nh n iu hay on n iu th nh du 1.
- Xt s giao im ca tia na ng thng t P l im cn xt vi bin ca a
gic. Nu s giao im l chn th kt lun im khng thc a gic. Ngc
li, s giao im l l th im thuc a gic.
Minh ha thut ton xt im thuc a gic
int next(int i) { return ( (i + n + 1) mod n ); } int prev(int i) { return ((i + n - 1) mod n ); } bool PointInpoly(Point[] d; Point P;int n)
{ int count, I, x_cut;
count = 0;
for (i = 0; i< n; i++) if (d[i].y == P.y ) {
Gio trnh Ha My Tnh 47
if d[i].x > P.x { if ((d[prev(i)].y < P.y) && (P.y < d[next(i)].y)) || ((d[prev(i)].y > P.y) && (P.y > d[next(i)].y)) count = count + 1;
if (d[next(i)].y == P.y) if ((d[prev(i)].y < P.y) && (P.y < d[next(next(i))].y)) || ((d[prev(i)].y > P.y && (P.y > d[next(next(i))].y))
count = count + 1;
} } else //d[i].y = P.y if ((d[i].y < P.y) && (P.y < d[next(i)].y)) || ((d[i].y > P.y) && (P.y > d[next(i)].y)) { x_cut := d[i].x + Round((d[next(i)].x - d[i].x) / (d[next(i)].y - d[i].y) * (P.y - d[i].y)); if x_cut >= P.x count := count + 1; }
if (count mod 2 = 0) return false; return true;
}
Minh ha thut ton t a gic
void TomauDagiac ( Point[] d; int n, int maubien) {
int x, y;
Point P;
for (x=xmin; x
Gio trnh Ha My Tnh 48
if getpixel(x,y) != maubien putpixel(x,y,color); }
}
Nhn xt: Thut ton t n gin c u im l t rt mn v c th s dng c cho a gic li hay a gic lm, hoc a gic t ct, ng trn, ellipse. Tuy
nhin, gii thut ny s tr nn chm khi ta phi gi hm PointInpoly nhiu ln.
khc phc nhc im ny ngi ta a ra thut ton t mu theo dng qut.
3.3 T mu theo dng qut (ScanConvert)
tng: S dng giao im gia cc bin a gic v ng qut xc nh cc im nm trong a gic.
Hnh 3.3: T mu theo dng qut.
Cc bc thut ton:
- Tm ymin, ymax ln lt l gi tr nh nht, ln nht ca tp cc tung ca cc
nh ca a gic cho.
- ng vi mi dng qut y = k vi k thay i t ymin n ymax, lp : - Tm tt c cc honh giao im ca dng qut y = k vi cc cnh ca a
gic.
- Sp xp cc honh giao im theo th t tng dn : x0, x1,..., xn.
- V cc on thng trn ng thng y = k ln lt c gii hn bi cc cp cch qung nhau: (x0, x1), (x1, x2
), ....
Vn cn ch
Gio trnh Ha My Tnh 49
- Hn ch c s cnh cn tm giao im ng vi mi dng qut v ng vi mi
dng qut khng phi lc no cng giao vi cc cnh ca a gic. - tm giao im gia cnh a gic v dng qut, ta c nhn xt sau:
Trong , m l h s gc ca cnh.
- Gii quyt trng hp s giao im i qua nh n iu th tnh s giao im
l 1 hay i qua nh cc tr th tnh s giao im l 0 (hoc 2).
Thut ton ScanConvert
void ScanFill(Point[] Poly) { int min_y = Poly[0].Y, max_y = Poly[0].Y; int min_x = Poly[0].X, max_x = Poly[0].X; for (int i = 1; i < Poly.Length; i++) { if (Poly[i].Y > max_y) max_y = Poly[i].Y; if (Poly[i].Y < min_y) min_y = Poly[i].Y;
if (Poly[i].X > max_x) max_x = Poly[i].X; if (Poly[i].X < min_x) min_x = Poly[i].X; } Point G = new Point(); Point A, B;
for (int y = min_y; y < max_y; y++)
Gio trnh Ha My Tnh 50
{ List list = new List(); for (int i = 0; i < Poly.Length - 1; i++) { A = Poly[i]; B = Poly[i + 1]; if (Giao(A, B, new Point(min_x, y), new Point(max_x, y), ref G) == true) { if (G == Poly[j]) { if (j == 0) {
if ((G.Y > Poly[Poly.Length - 1].Y && G.Y > Poly[1].Y) || (G.Y < Poly[Poly.Length - 1].Y && G.Y < Poly[1].Y))
{ list.Add(G); } } else {
if ((G.Y > Poly[j - 1].Y && G.Y > Poly[j + 1].Y) || (G.Y < Poly[j - 1].Y && G.Y < Poly[j + 1].Y))
{ list.Add(G); } }
else {
list.Add(G); }
} }
Gio trnh Ha My Tnh 51
A = Poly[Poly.Length - 1]; B = Poly[0]; if (Giao(A, B, new Point(min_x, y), new Point(max_x, y), ref G) == true) { if (G == Poly[j]) { if (j == 0) {
if ((G.Y > Poly[Poly.Length - 1].Y && G.Y > Poly[1].Y) || (G.Y < Poly[Poly.Length - 1].Y && G.Y < Poly[1].Y))
{ list.Add(G); } } else {
if ((G.Y > Poly[j - 1].Y && G.Y > Poly[j + 1].Y) || (G.Y < Poly[j - 1].Y && G.Y < Poly[j + 1].Y))
{ list.Add(G); } }
else {
list.Add(G); }
SortList(list); DrawList(list); } } void SortList(List list) {
Gio trnh Ha My Tnh 52
for (int i = 0; i < list.Count - 1; i++) { for (int j = i + 1; j < list.Count; j++) { if (list[i].X > list[j].X) { Point t = list[i]; list[i] = list[j]; list[j] = t; } } } } void DrawList(List list) { for (int i = 0; i < list.Count - 1; i += 2) { Line (list[i], list[i + 1]); } }
3.4 T mu theo vt du loang (FloodFill)
tng
Thut ton nhm t mu vng kn, gii hn bi mu Bcolor, mu s dng t
l Fcolor vi im (x, y) nm trong vng t mu. Thut s dng php gi quy, ban u (x, y) c kim tra mu, nu mu ca
n l Fcolor hoc Bcolor th tin trnh kt thc. Trong trng hp ngc li,
im (x,y) c t vi mu Fcolor v qu trnh gi quy vi cc im lng ging ca (x, y). Cc im lng ging c s dng l bn lng ging.
Gio trnh Ha My Tnh 53
X
X (x, y) X X
Suy ra, bn lng ging ca (x, y) l: (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)
Chng trnh minh ha thut ton FloodFill byte[] getPixel(int x, int y)
{ int[] Pos = new int[2];
glRasterPos2i(x, y); glGetIntegerv(GL_CURRENT_RASTER_POSITION, Pos);
int width = 1, height = 1; byte[] pixels = new byte[3 * width * height];
glReadPixels(Pos[0], Pos[1], width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels);
return pixels; }
void FloodFill(int x, int y, int Bcolor, byte[] Fcolor) {
glColor3ubv(Fcolor); if(getPixel(x, y) != Bcolor && getPixel(x, y) != Fcolor) {
glVertex2i(x, y); Boundary(x+1,y,Bcolor,Fcolor); Boundary(x-1,y,Bcolor,Fcolor); Boundary(x,y+1,Bcolor,Fcolor); Boundary(x,y-1,Bcolor,Fcolor);
} }
Thut ton quy trn s khng kh thi nu nh vng cn t mu ln. Khi ,
thi gian thc thi v vng nh lu tr trong qu trnh quy l rt ln. khc phc
iu ny, ta s xt thut ton kh quy bng cch dng mng lu tr cc pixel (hng i) thay v gi hm quy:
Gio trnh Ha My Tnh 54
Chng trnh kh quy
void FloodFill(int x, int y, int Bcolor, byte[] Fcolor) { glColor3ubv(Fcolor); byte[] color;
int count=0;
Point mPT[MaxPT]; mPT[count].x=x; mPT[count].y=y; while(count>0) { count--;
color = getPixel(mPT[count].x, mPT[count].y); if(color != Bcolor && color != Fcolor) { glVertext2i(x,y);
mPT[count].x=x+1; mPT[count++].y=y; mPT[count].x=x-1; mPT[count++].y=y;
mPT[count].x=x; mPT[count++].y=y+1; mPT[count].x=x; mPT[count++].y=y-1;
} }
}
Bi tp chng 3
1. Vit chng trnh v mt a gic n nh, xt xem mt im P no c thuc
a gic khng ?
2. Vit chng trnh v mt a gic n nh. T a gic bng gii thut t n gin.
3. Vit chng trnh v mt a gic n nh. T a gic bng gii thut FloodFill. Lu cho cc trng hp ca a gic : hnh ch nht, a gic li, a gic lm.
4. Vit chng trnh v mt a gic n nh. T a gic bng gii thut
ScanConvert.
Gio trnh Ha My Tnh 55
Chng 4
PHP BIN I HAI CHIU
Ni dung chnh
Cc php bin i ma trn.
Cc php bin i Affine 2D c s. Cc php bin i 2D gp.
4.1 Nhc li cc php ton c s vi ma ma trn.
Cng, tr ma trn: Ch thc hin cho hai ma trn cng bc
[A(m, n)] + [B(m, n)] = [C(m, n)]
Nhn hai ma trn: Ma trn bc n1 m1 v ma trn bc n2 m2 nhn c vi nhau nu m1 = n2
v
o ma trn vung: Khng c php chia ma trn
Nu [A][X]=[Y] th [X]=[A]-1 [Y], trong [A]-1 l ma trn o ca ma trn vung [A].
[A][A]-1 = [I], trong [I] l ma trn n v.
Tnh ||A||: Thay cc phn t ca[A] bng cc phn ph i s ca n. Phn ph i s ca phn t (aij) l:
Gio trnh Ha My Tnh 56
[Mij] c to ra nh xa hng i, ct j ca [A].
4.2 Php tnh tin
C hai quan im v php bin i hnh hc, l :
Bin i i tng : thay i ta ca cc im m t i tng theo mt
qui tc no .
Bin i h ta : To ra mt h ta mi v tt c cc im m t i
tng s c chuyn v h ta mi.
Cc php bin i hnh hc c s l : tnh tin, quay, bin i t l. Php bin i
Affine hai chiu (gi tc l php bin i) l mt nh x T bin i im P(Px, Py) thnh im Q(Qx, Qy) theo h phng trnh sau:
Nu gi trx v try ln lt l di theo trc honh v trc tung th ta im
mi Q(x', y') sau khi tnh tin im P(x, y) s l :
Trong , (trx, try) c gi l vector tnh tin hay vector di (xem hnh 4.1).
Hay Q = P.M + tr,
Gio trnh Ha My Tnh 57
Hnh 4.1 : Php bin i tnh tin im P thnh Q
4.3 Php bin i t l
Php bin i t l lm thay i kch thc i tng. co hay gin ta ca mt im P(x, y) theo trc honh v trc tung ln lt l Sx v Sy (gi l cc h s t l), ta nhn Sx v Sy ln lt cho cc ta ca P.
Khi cc gi tr Sx, Sy nh hn 1, php bin i s thu nh i tng.
Ngc li, khi cc gi tr ny ln hn 1, php bin i s phng ln i tng.
Khi Sx = Sy , ngi ta gi l php ng dng. y l php bin i bo ton tnh cn xng ca i tng. Ta gi l php phng i nu |S|>1 v l php thu nh nu |S|
Gio trnh Ha My Tnh 58
Php quay quanh gc ta
Ta c cng thc bin i ca php quay im P(x, y) quanh gc ta gc (xem hnh 4.2):
Hay Q = P.M, trong :
Hnh 4.2 : Php quay quanh gc ta
Php quay quanh mt im bt k
Hnh 4.3 : Php quay quanh mt im bt k.
Gio trnh Ha My Tnh 59
Xt im P(P.x, P.y) quay quanh im V(V.x, V.y) mt gc n im Q(Q.x,Q.y). Ta c th xem php quay quanh tm V c kt hp t php cc bin c bn sau:
Php tnh tin (-V.x, -V.y) dch chuyn tm quay v gc ta . Quay quanh gc ta O mt gc . Php tnh tin (V.x, V.y) a tm quay v v tr ban u.
Ta cn xc nh ta ca im Q (xem hnh 4.3).
T php tnh tin (-V.x,-V.y) bin i im P thnh P' ta c:
P' = P + V
Hay
P'.x = P.x - V.x
P'.y = P.y - V.y
Php quay quanh gc ta bin i im P' thnh Q'
Q' = P'.M
Hay
Q'.x = P'.x.cos - P'.y.sin
Q'.y = P'.x.sin + P'.y.cos
Php tnh tin (V.x, V.y) bin i im Q' thnh Q ta c
Q = Q' + V
Hay
Q.x = Q'.x + V.x
Q.y = Q'.y + V.y
Gio trnh Ha My Tnh 60
Q.x = (P.x - V.x)cos - (P.y - V.y) sin + V.x
Q.y = (P.x - V.x)sin + (P.y - V.y) cos + V.y
Q.x = P.x.cos - P.y.sin + V.x (1- cos) + V.y.sin
Q.y = P.x.sin + P.y.cos - V.x.sin + V.y (1- cos)
Vy, Q = P.M + tr, trong :
4.5 Php i xng
Php i xng trc c th xem l php quay quanh trc i xng mt gc 1800.
Phng trnh ban u :
Q.x = a.P.x + c.P.y + trx
Q.y = b.P.x + d.P.y + try
Hay
o Trc i xng l trc honh :
Ta c :
o Tng t trc i xng l trc tung :
Ta c :
4.6 Php bin dng
Php bin dng lm thay i, mo m hnh dng ca cc i tng. Bin dng
theo phng trc x s lm thay i honh cn tung gi nguyn.
Gio trnh Ha My Tnh 61
V d, bin i im P(P.x, P.y) thnh im Q(Q.x, Q.y) theo phng trc x l php bin i c biu din bi phng trnh sau:
Q.x = P.x + h.P.y
Q.y = P.y
- Bin dng theo phng trc y s lm thay i tung cn honh gi nguyn.
Q.x = P.x
Q.y = g.P.x + P.y
4.7 Php bin i Affine ngc
Php bin i ngc dng khi phc mt php bin i thc hin. Gi Q l nh ca P qua php bin i T c ma trn bin i M l P.M
Php bin i ngc T-1 s c ma trn bin i l M-1 l ma trn nghch o ca
ma trn M. Vi ma trn bin i Affine dng:
th ma trn nghch o l:
Php tnh tin
Gio trnh Ha My Tnh 62
Php quay
Php bin i t l
Php bin dng
4.8 H ta thun nht
Ta thun nht ca mt im trn mt phng c biu din bng b ba s t l (xh, yh, h) khng ng thi bng 0 v lin h vi cc ta (x, y) ca im bi cng thc :
Nu mt im c ta thun nht l (x, y, z) th n cng c ta thun nht l (h.x, h.y, h.z), trong h l s thc khc 0 bt k. Mt im P(x, y) s c biu din di dng ta thun nht l (x, y, 1). Trong h ta thun nht cc ma trn ca
Gio trnh Ha My Tnh 63
php bin i c biu din nh sau :
Php tnh tin
Php quay
Php bin i t l
Thun li ca h ta thun nht l khi ta kt hp hai hay nhiu php bin i
affine thi ma trn hp ca nhiu php bin i c tnh bng cch nhn cc ma trn
ca cc php bin i thnh phn.
4.9 Kt hp cc php bin i
Qu trnh p dng cc php bin i lin tip to nn mt php bin i tng th c gi l s kt hp cc php bin i.
Kt hp php tnh tin
Nu ta thc hin php tnh tin ln im P c im P', ri li thc hin tip
mt php tnh tin khc ln P' c im Q. Nh vy, im Q l nh ca php bin i kt hp hai php tnh tin lin tip.
Gio trnh Ha My Tnh 64
Vy kt hp hai php tnh tin l mt php tnh tin. T , ta c kt hp ca
nhiu php tnh tin l mt php tnh tin.
Kt hp php quay
Tng t, ta c ta im Q l im kt qu sau khi kt hp hai php quay quanh gc ta MR1(1) v MR2(2) l :
Kt hp php bin i t l
Tng t nh php tnh tin, ta c ta im Q l im c c sau hai php tnh tin M1(Sx1, Sy1), M2(Sx2, Sy2) l:
Bi tp chng 4
1. V mt hnh bnh hnh bng cch s dng php tnh tin. (V on thng AB, sau tnh tin AB thnh on thng CD//AB; v AD, tnh tin AD thnh BC.
2. Vit chng trnh v mt hnh vung ABCD (xem hnh v).
Gio trnh Ha My Tnh 65
Tnh tin hnh vung n v tr khc.
Phng to hnh vung ABCD.
Bin dng hnh vung thnh hnh thoi.
3. V mt elip, sau v thm 3 elip khc c cng tm vi elip cho, c dn trc Ox l k v Oy l 1.
4. Vit chng trnh m phng s chuyn ng ca tri t quay quanh mt tri.
5. Vit chng trnh v mt ng trn tm O bn knh R. V mt ng knh AB, v quay ng knh ny quanh tm ng trn.
6. Tm v tr mi ca tam gic A(1, 1), B(3, 2), C(2, 4) qua php quay gc 30o qua im (5, 5).
Gio trnh Ha My Tnh 66
Chng 5
GIAO CC I TNG HA
Ni dung chnh
Khi nim ca s.
Thit k v ci t c cc thut ton tm giao cc i tng ha: ng
thng, hnh ch nht, a gic.
K thut Ray tracing.
5.1. M u
Hnh nh trong h ta th gii thc c hin th trn cc h ta thit b
da trn h ta ha. Chng hn, trong mt vng ha ta cn xc nh vng no ca hnh nh s c hin th v mun t n u trn h ta thit b. Mt vng
n l hoc vi vng ca hnh nh c th c chn. Nhng vng ny c th c t
nhng v tr tch bit, hoc mt vng c th c chn vo mt vng ln hn. Qu trnh bin i ny lin quan n nhng thao tc nh tnh tin, bin i t l vng c
chn v xa b nhng phn bn ngoi vng c chn.
Vng c dng hnh ch nht c xc nh trong h ta th gii thc c gi
l mt ca s (window). Cn vng hnh ch nht trn thit b hin th ca s nh x n c gi l mt vng quan st (viewport).
Hnh 5.1: Ca s v vng quan st
Gio trnh Ha My Tnh 67
nh x mt vng ca s vo trong mt vng quan st, kt qu l ch hin th nhng phn trong phm vi ca s. Mi th bn ngoi ca s s b loi b. Cc th tc loi b cc phn hnh nh nm bn ngoi bin ca s c gi l cc thut ton tm
giao hoc ct xn (clipping).
Vn t ra trn y cng l mt trong nhng vn c s, quan trng ca
ha my tnh nh xc nh phn giao ca cc i tng ha: giao ca hai on
thng, on thng v hnh cha nht, a gic v hnh ch nht, Cc thut ton cn thc hin nhanh nht c th minh ha cp nht cc kt qu thay i trong ng dng
ha. Phng php gii tch c dng gii quyt cc bi ton trong chng ny.
5.2. Giao ca hai on thng
Ta xt giao ca hai ng thng i qua hai im c minh ha thng qua th d
n gin sau: ng thng i qua ta (4,2) v ta (2,0) c giao vi on thng i qua (0,4) v (4,0)?
Gii php
- Xc nh phng trnh ng thng qua 2 im y = ax + b, trong a = (y2 - y1)/(x2 - x1)
- T th d trn, ta c: y = x - 2 v y = - x + 4 giao im ti (3, 1)
Tng qut: nu ta c y = a1 + b1x v y = a2 + b2x th giao im s ti:
xi = -(a1 - a2)/(b1 - b2) yi = a1 + b1xi
Trng hp c bit: ng thng song song vi trc x hay trc y, hay song song vi nhau. Nu s dng phng php tm giao ng thng: i hi kim tra ta ca giao ng thng c nm trong cc on thng.
Phng php biu din on thng bng tham s s hiu qu hn, on thng th nht t (xA, yA) n (xB, yB); on thng th hai t (xC, yC) n (xD, yD); tnh ton giao ca 2 on thng ti ta c t, s:
Gio trnh Ha My Tnh 68
v
Hnh 5.2: Biu din tham s ca on thng
5.3. on thng v hnh ch nht
V tr tng i ca on thng v hnh ch nht (R) c bn trng hp sau:
1. C hai u mt ca on thng nm trong hnh ch nht, chng hn AB. 2. Mt trong hai u mt ca on thng nm trong hnh ch nht, chng hn
BC.
3. C hai u mt ca on thng nm ngoi hnh ch nht nhng c giao
im, chng hn CD.
Gio trnh Ha My Tnh 69
4. C hai u mt ca on thng nm ngoi hnh ch nht v khng c giao
im, chng hn DE.
Hnh 5.3: Cc trng hp giao ca on thng v hnh ch nht
Hai trng hp 1 v 4 gi l cc trng hp tm thng, tc l xc nh c
ngay c tn ti giao im hay khng. Cc trng hp cn li ta phi tin hnh thut
ton xc nh giao im s c trnh by trong phn tip theo sau.
Hnh 5.4: Hai trng hp tm thng ca giao on thng v hnh ch nht
5.3.1 Tm giao bng cch gii h phng trnh
a bi ton v xc nh giao im ca hai on thng c trnh by trong phn
3.2. Theo phng php ny, chng ta cn tnh ton v kim tra nhiu kh nng; do
khng hiu qu.
5.3.2 Thut ton chia nh phn
Gio trnh Ha My Tnh 70
Mt tip cn l da trn c ch nh m c pht trin bi Cohen v
Sutherland. Mi im hai u mt on thng trong hnh nh s c gn mt m nh phn 4 bit, c gi l m vng, gip nhn ra vng ta ca mt im. Cc vng
ny c xy dng da trn s xem xt vi bin ca s, nh hnh 6-8. Mi v tr bit trong m vng c dng ch ra mt trong bn v tr ta tng ng ca im so
vi ca s: bn tri (left), phi (right), trn nh (top), di y (bottom). Vic nh s theo v tr bit trong m vng t 1 n 4 cho t phi sang tri, cc vng ta c th lin quan vi v tr bit nh sau:
Hnh 5.5: M ha cc u mt ca on thng
Gi tr 1 bt k v tr no ch ra rng im v tr tng ng, ngc li bit v tr l 0. Nu mt im nm trong ca s, m v tr l 0000. Mt im bn di v bn tri ca s c m vng l 0101.
Ci t minh ha thut ton m ha
byte EncodePoint(Point LeftTop, Point RightBottom, Point P) {
byte code = 0; if (P.X < LeftTop.X) { code |= 8; } if (P.X > RightBottom.X) { code |= 4; } if (P.Y < RightBottom.Y)
Gio trnh Ha My Tnh 71
{ code |= 2; } if (P.Y > LeftTop.Y) { code |= 1; }
return code;
}
Thut ton chia nh phn
1. Nu E(A) = 0 v E(B) = 0 kt lun AB (R) = AB; thut ton dng.
2. Nu [E(A) AND E(B)] != 0 kt lun AB (R) = ; kt thc thut ton.
3. Nu E(A) = 0 v E(B) 0(tc A (R) v B (R)) thc hin:
a. t C = A, D = B.
b. Trong khi di ||CD|| ln hn t M l trung im ca on CD.
Nu E(M) = 0 th cp nht C = M ngc li D = M.
c. Kt lun AB (R) = AM; kt thc thut ton.
4. Nu E(A) = 0 v E(B) = 0, hon i vai tr ca A v B; lp li bc 3.
5. Ngc li, thc hin:
a. t C = A, D = B.
b. Trong khi di ||CD|| ln hn t M l trung im ca on CD.
Nu E(M) = 0 p dng Bc 3 cho hai on MC v MD. Kt lun AB(R) = CD;kt thc thut ton.
Nu [E(M) AND E(R)] != 0 t C = M.
Gio trnh Ha My Tnh 72
Nu [E(M) AND E(D)] != 0 t D = M.
Nu [E(R) AND E(D)] != 0 kt lun AB (R)= ; kt thc thut ton.
Hnh 5.6: Minh ha ca thut ton chia nh phn.
5.3.3 Thut ton Cohen-Sutherland
Xc nh nhanh on thng c cn ct xn hay khng nh cc php ton logc
AND v OR:
Kt qu php OR hai m u mt on thng cho kt qu 0: c hai im
nm trong ch nht.
Kt qu php AND hai m u mt on thng cho kt qu khc 0: c hai im nm ngoi ch nht.
Hnh 5.7: on thng giao vi hnh ch nht
Giao ca on thng vi cc cnh ch nht song song trc tung:
x c gi tr Xmin, Xmax v h s gc a = (y2 - y1)/(x2 - x1)
Gio trnh Ha My Tnh 73
y = y1 + a(x x1)
Giao on thng vi cc cnh song song trc honh:
y c gi tr Ymin, Ymax v h s gc a = (y2 - y1)/(x2 - x1)
x = x1 + (y - y1)/a
Ci t thut ton Cohen-Shutherland
void InterLineRectangle(Point LeftTop, Point RightBottom, Point A, Point B) { byte codeA, codeB, codeOut; float x = 0, y = 0; codeA = EncodePoint(LeftTop, RightBottom, A); codeB = EncodePoint(LeftTop, RightBottom, B); while (true) { if (codeA == 0 && codeB == 0) { return true;
} if ((codeA & codeB) != 0) { return false; }
if (codeA != 0) codeOut = codeA; else codeOut = codeB;
if ((codeOut & 8) != 0)//L { x = LeftTop.X; y = A.Y + (float)((x - A.X) * (B.Y - A.Y)) / (float)(B.X - A.X); }
Gio trnh Ha My Tnh 74
else if ((codeOut & 4) != 0) //R { x = RightBottom.X;
y = A.Y + (float)((x - A.X) * (B.Y - A.Y)) / (float)(B.X - A.X); } else if ((codeOut & 2) != 0)//B { y = RightBottom.Y; x = A.X + (float)((y - A.Y) * (B.X - A.X)) / (float)(B.Y - A.Y); } else if ((codeOut & 1) != 0)//T { y = LeftTop.Y; x = A.X + (float)((y - A.Y) * (B.X - A.X)) / (float)(B.Y - A.Y); }
if (codeOut == codeA) { A.X = (int)x; A.Y = (int)y; codeA = EncodePoint(LeftTop, RightBottom, A); } else { B.X = (int)x; B.Y = (int)y; codeB = EncodePoint(LeftTop, RightBottom, B); } } }
5.3.4 Thut ton Liang-Barsky
Gio trnh Ha My Tnh 75
Mt thut ton tm giao on thng v hnh ch nht hiu qu dng phng trnh
tham s c pht trin bi Liang v Barsky. Nhn xt rng hnh ch nht (R) gm tp cc im nm trong mt phng gii hn bi cc ng thng qua cc cnh
gii hn ca n; tc l:
Phng trnh tham s ca on AB: P(t) := A + t (B - A) vi t [0, 1]. Nh vy bi ton a v xc nh cc gi tr tham s t tha h cc bt phng trnh sau:
Hay tng ng : qi pit , i = 0,1, 2, 3. Trong :
p0 = dx, q0 = xmin - xA
p1 = -dx, q1 = xA - xmax
p2 = dy, q2 = ymin - yA
p3 = -dy, q3 = yA - yAmax
vi dx = xB xA ; dy = yB yA.
Nu tn ti ch s i {0, 1, 2, 3} sao cho pi = 0 v qi > 0 th h bt phng trnh trn v nghim ; tc l on thng AB giao vi hnh nht bng rng. Ngc li, ta t :
t0 := max{0, max{ | pi > 0, i = 0, 1, 2, 3}}
t1 := min{1,min{ | pi < 0, i = 0, 1, 2, 3}}.
Khi h bt phng trnh tng ng vi : t0 t t1. iu ny ch ra rng, iu kin on thng AB c giao im vi hnh ch nht (R) l t0 t1 :
T , ta c thut ton sau :
Gio trnh Ha My Tnh 76
Bc 1: Tnh pi, qi vi i = 0, 1, 2, 3.
Bc 2: Khi to i = 0 v t0 = 0, t1 = 1.
Bc 3: Nu pi = 0 v qi > 0 th kt lun ; kt thc thut ton.
Bc 4: Nu pi > 0 t t0 := max{t0, }. Chuyn sang bc 7.
Bc 5: Nu pi < 0 t t1 := min{t1, }. Chuyn sang bc 7.
Bc 6: Nu t0 > t1 th kt lun ; kt thc thut ton.
Bc 7: Nu i < 3 thay i = i + 1 v lp li bc 3; Ngc li, kt lun
; trong :
C = A + t0(B A)
D = A +t1(B A)
V d, xt hnh ch nht :
v hai im A(1, -2) v B(10, 9). Ta c phng trnh tham s ca on thng AB l: A + t(B - A). Ta cn gii h phng trnh:
Hay tng ng :
Vy
Suy ra, giao im ca AB v hnh ch nht l on thng CD, trong :
Gio trnh Ha My Tnh 77
Thut ton Liang v Barsky gim bt cc tnh ton cn thit ct cc on. Mi
ln cp nht t0 v t1 ch cn mt php chia, v cc giao im vi ca s c tnh ch
mt ln, khi m cc gi tr t0 v t1 va hon thnh. Ngc li, thut ton ca Cohen-Sutherland lp li vic tnh giao im ca on vi cc bin ca s, v mi php tnh
giao im cn c hai php chia v nhn.
5.4. Giao ca on thng v a gic li
V tr tng i ca mt im vi on thng
Trong nhiu ng dng, ta quan tm n khi nim na mt phng trong v na mt
phng ngoi xc nh bi mt on thng. Khi nim ny lin quan mt thit n php vector ca on thng.
Hnh 5.8: V tr tng i ca im Q vi on thng l.
Phng trnh tng qut ca on thng l c dng a.x + b.y + c = 0. K hiu:
l cc na mt phng ngoi v na mt phng trong xc nh bi l, trong D = -c, n = (a, b)t. Tiu chun kim tra im Q thuc mt na phng no ca on thng l:
Gio trnh Ha My Tnh 78
1.
2.
3.
Thut ton xc nh giao im on thng v a gic li
Hnh 5.9: Giao ca on thng v a gic li
Thut ton Cyrus-Beck da trn tiu chun loi b n gin bng cch xc nh v tr tng i ca mt im vi mt on thng. Gi s a gic li (R) c nh ngha nh mt dy cc nh Pi = (xi, yi), i=0, 1,..., L, trong h ta thc vi P0 = PL. Mc ch ca phn ny l loi b nhng phn ca on AB khng nm trong ca s (R) (Hnh 5.9).
K hiu li, i = 0, 1,..., L, l on thng i qua hai nh lin tip Pi, Pi+1. t:
l cc na mt phng ngoi v mt phng trong xc nh bi li, trong ni l php vector ca li c chn hng ra na mt phng ngoi v Di l hng s no . V (R) l tp li nn c xc nh bi:
tng ca thut ton nh sau:
Gio trnh Ha My Tnh 79
Vi mi on thng li, i =0, 1,..., L, chng ta loi b phn ca on thng AB
thuc na mt phng ngoi xc nh bi li v cp nht AB=AB( il ). Nu ti bc no , AB ( +il ) th kt lun giao ca on thng v a gic li
bng trng; ngc li, nu bc cui cng phn on thng AB cn li nm trong (R) chnh l phn giao cn tm.
Thut ton
void Cyrus_Beck(Point *A, Point *B, VertPtr Poly) {
float t_in = 0.0, t_out = 1.0, t_hit, Denom, D; Point F, S;
Vector c, n, a;
VertPtr Tempt = Poly; if (Tempt == NULL)
return False; F = Tempt->Vertex;
c.dx = (*B).x - (*A).x; c.dy = (*B).y - (*A).y; a.dx = (*A).x; a.dy = (*A).y; while ((Tempt = Tempt->Next) != NULL) {
S = Tempt->Vertex;
n.dx = (S.y - F.y); n.dy = -(S.x - F.x); D = n.dx*F.x + n.dy*F.y; if ((Denom = Dot2D(n, c)) == 0.0)
if (Dot2D(n, a) > D) return false; else {
t_hit = (D - Dot2D(n, a)) / Denom; if (Denom > 0.0)
Gio trnh Ha My Tnh 80
if (t_out > t_hit) t_out = t_hit; else
if (t_in < t_hit) t_in = t_hit; if (t_in > t_out) return false;
} F=S;
} F.x = (1 - t_in)*(*A).x + t_in*(*B).x; F.y = (1 - t_in)*(*A).y + t_in*(*B).y; S.x = (1 - t_out)*(*A).x + t_out*(*B).x; S.y = (1 - t_out)*(*A).y + t_out*(*B).y; *A = F;
*B = S;
return true;
}
5.5. Giao hai a gic
Thut ton Sutherland-Hodgman
K hiu Subj v Clip l danh sch cc nh ca hai a gic (S) v (C) tng ng. C bn kh nng xy ra gia mi cnh ca (S) v ca (C):
1. Hai nh F v S nm trong: xut S.
2. nh F nm trong v S nm ngoi: tm giao im I v xut n.
3. Hai nh F v S nm ngoi: khng xut. 4. nh F nm ngoi v S nm trong: tm giao im I; xut I v S.
Gio trnh Ha My Tnh 81
Hnh 5.10: Bn trng hp vi mi cnh ca (S)
Xt v d hnh (a):
Gio trnh Ha My Tnh 82
Hnh 5.11: V d thut ton Sutherland-Hodgman
Gio trnh Ha My Tnh 83
1. Danh sch Subj sau khi ct (S) vi cnh bn tri ca (C):
(1, 2, D, E, F, G, 3, 4, I, A, 1).
2. Danh sch Subj sau khi ct (S) vi cnh bn di ca (C):
(5, 6, E, F, 7, 5, 4, I, A, 1, 5).
3. Danh sch Subj sau khi ct (S) vi cnh bn phi ca (C):
(8, 9, F, 7, 5, 4, I, A, 1, 5, 8).
4. Danh sch Subj sau khi ct (S) vi cnh bn trn ca (C):
(9, F, 7, 5, 4, I, 10, 11, 5, 8, 9).
Thut ton Weiler-Atherton
Cch tip cn ca Weiler-Atherton nhm tm ra giao ca hai a gic bt k, thm ch c l hng trong cc a gic. Ngoi ra c th tm phn hp v hiu hai a gic na.
Xt v d hnh 5.12 sau:
Hnh 5.12: V d thut ton Weiler-Atherton
Hai a gic (S) v (C) c biu din bi danh sch cc nh, k hiu Subj = (A, B, C, D, E, A) v Clip = (a, b, c, d, e, a) tng ng.
Gio trnh Ha My Tnh 84
Tt c cc giao im ca hai a gic c xc nh v lu vo mt danh
sch. Trong v d trn c tt c su giao im: 1, 2, 3, 4, 5, 6.
Thc hin tin trnh: ln theo hng thun v nhy l xy dng hai danh
sch:
Subj: (A, 1, B, 2, C, 3, 4, D, 5, 6, E, A)
Clip: (a, b, 4, 5, c, d, e, 6, 3, 2, 1, a)
Xut pht t giao im i vo l im i t ngoi vo trong ca a gic (C), duyt trn (S) n khi gp giao im th chuyn sang duyt trn (C), v lp li. Qu kt thc khi gp im xut pht ban u. Tip tc kim tra giao im trn (S) cha c i qua v lp li tin trnh trn. Ta c hai a gic sinh ra l (1, B, 2, 1) v (3, 4, 5, 6, 3).
Hp hai a gic (S) (C)
i trn (S) theo hng thun cho n khi gp im ra l im i t trong ra ngoi ca a gic (C) duyt cho n khi gp giao im khc vi (C) th duyt sang (C) cho n khi gp giao im k tip ri chuyn sang (S). Qu trnh kt thc khi gp im xut pht ban u. Kt qu (S) (C) gm hai a gic:
(2, C, 3, 2) (l hng). (4, D, 5, c, d, e, 6, E, A, 1, a, b, 4).
Gio trnh Ha My Tnh 85
Hiu hai a gic (C) \ (S)
i trn (S) theo hng thun cho n khi gp im vo duyt cho n khi gp giao im khc vi (C) th duyt sang (C) theo hng ngc cho n khi gp giao im k tip ri chuyn sang (S). Qu kt thc khi gp im xut pht ban u.
(C) \ (S): (1, B, 2, 3, 4, b, a, 1); v (5, 6, e, d, c, 5). (S) \ (C): (4, 5, D, 4); v (6, 3, C, 2, 1, A, E, 6).
5.6. K thut Ray tracing
K thut Ray tracing l phng php p dng mt s khi nim hnh hc to ng dng ha m phng qu trnh chuyn ng ca tia sng trong bung kn. K
thut Ray tracing l mt cng c quan trng trong ha my tnh tng hp hnh
nh. Trong tng hp hnh nh, cc tia sng nhn to ln theo trong th gii thc ba
chiu cha nhiu i tng. ng i ca mi tia sng xuyn qua cc i tng hoc phn x li ty theo mc phn x ca i tng cho n khi n dng li i
tng no . Mu ca i tng ny s c t cho pixel tng ng trn thit b
hin th. M phng qu trnh Ray tracing rt d dng trong khng gian hai chiu.
Ta xt qu o ca tri pinpall nh khi va chm vo cc i tng trong bung kn. Hnh bn di minh ha nht ct ngang ca mt bung kn c nm bc tng v cha ba tr trn. Tri pinpall bt u ti v tr S va di chuyn theo hng vector c cho n gp vt cn s b phn x v di chuyn theo hng mi. Qu trnh c lp li nhiu ln. Qu o ca tri pinpall l ng gp khc m ta c th hnh dung ng i ca tia sng di chuyn trong bung kn.
By gi ta s xy dng thut ton xc nh i tng giao vi tia sng s trc v v tr va trm ti . V tr va chm l im khi u cho cho ng i k tip vi
hng di chuyn mi.
Gio trnh Ha My Tnh 86
Hnh 5.13: V d v Ray tracing.
Vector phn x
Hnh 5.14 phn gii vector c gm thnh phn m dc theo n v thnh phn e vung gc vi n. Ta c, r = e m. Nhng e = c m nn r = c 2m.
Hnh 5.14: Phn x tia sng
V vector m l vector phn gii ca vector c theo vector n nn
,
Th tc xc nh vector phn x r t vector c v php vector n
void Reflection(Vector c, Vector n, Vector *r)
{
Gio trnh Ha My Tnh 87
float Coeff = 2.Dot2D(c, n)/Dot2D(n, n);
(*r).dx = c.dx Coeff.n.dx;
(*r).dy = c.dy Coeff.n.dy;
}
Giao ca tia sng v ng thng
Phng trnh tham s ca tia sng xut pht t S chuyn ng theo vector ch
phng c cho bi
R(t):= S + c.t, t 0.
Bc tng tng ng ng thng:
trong , php vector n hng ra ngoi bung kn. Nu 0 th tia sng ct ng thng ti Ph = S + cth , trong :
V d, cho ng thng 6x 8y + 10 = 0 v tia sng xut pht t S(2, 4) di chuyn theo vector ch phng c= (2, 1)t. ng thng c n =(6,8)t v D = 10. Ta c:
Suy ra giao im I:
I = S + t.c =(2, 4) + (2, 1) = (1, ).
Vector phn x:
Gio trnh Ha My Tnh 88
Th tc xc nh thi im giao th
void Ray_With_Line(Point S, Vector c, Vector normal, float D, float *t_hit)
{
float Denom = Dot2D(normal, c);
Vector2D s;
PointToVector2D(S, &s);
if (Denom == 0.0)
*t_hit = -1.0;
else
*t_hit = (D - Dot2D(normal, s))/Denom;
}
Giao ca tia sng v hnh trn
Hnh tr tng ng ng trn (C) bn knh R tm I. Xt s tng giao ca tia sng v ng trn. Ta c:
Suy ra:
Hay tng ng:
Gio trnh Ha My Tnh 89
trong , .
Nghim ca phng trnh (c th l nghim o)
V d, cho ng trn (x 1)2 + (y 4)2 = 4 v tia sng xut pht t S(8, 9) di chuyn theo vector ch phng c = (-1, -1)t.
Phng trnh giao im:
A.t2 + 2B.t + C = 0,
trong , .
Suy ra:
Vy ta giao im l Ph = S + th.c =(8 5, 9 5) = (3, 4).
Vector phn x:
Th tc xc nh thi im giao
void Ray_With_Circle(Point S, Vector c, Point Center, float Rad,float *t_hit)
{
float A, B, C, delta;
Vector tempt;
Gio trnh Ha My Tnh 90
tempt.dx = S.x - Center.x;
tempt.dy = S.y - Center.y;
A = Dot2D(c, c);
B = Dot2D(tempt, c);
C = Dot2D(tempt, tempt) - Rad*Rad;
delta = B*B - A*C;
if (delta < 0.0)
*t_hit = -1.0;
else
*t_hit = (-B - sqrt(delta))/A;
}
Gio trnh Ha My Tnh 91
Chng 6
HA BA CHIU
Ni dung chnh
Gii thiu ha 3 chiu (3D). Hin th i tng 3D. Cc php bin i Affine 3D c s.
6.1. Gii thiu ha 3 chiu
Cc i tng trong th gii thc phn ln l cc i tng 3 chiu cn thit b
hin th ch 2 chiu. Do vy, mun c hnh nh 3 chiu ta cn phi gi lp. Chin lc
c bn l chuyn i tng bc. Hnh nh s c hnh thnh t t, ngy cng chi tit hn.
Qui trnh hin th nh 3 chiu nh sau
Bin i t h ta i tng sang h ta th gii thc. Mi i tng c
m t trong mt h ta ring c gi l h ta i tng.
C 2 cch m hnh ha i tng:
o Solid modeling: m t cc vt th (k c bn trong). o Boudary representation: ch quan tm n b mt i tng.
Cc i tng c th c biu din bng m hnh Wire-Frame. Nhn thy rng khi biu din i tng, ta c th chn gc ta v n v o lng sao cho vic biu
din l thun li nht. Thng th ngi ta chun ha kch thc ca i tng khi biu din. Biu din bin cho php x l nhanh cn silid modeling cho hnh nh y v xc thc hn.
Gio trnh Ha My Tnh 92
o Loi b cc i tng khng nhn thy c: Loi b cc i tng hon
ton khng th nhn thy trong cnh. Thao tc ny gip ta lc b bt cc i tng khng cn thit do gim chi ph x l.
o Chiu sng cc i tng: Gn cho cc i tng mu sc da trn cc c
tnh ca cc cht to nn chng v cc ngun sng tn ti trong cnh. C
nhiu m hnh chiu sng v to bng : constant-intensity, Interpolate,...
o Chuyn t word space sang eye space. Thc hin mt php bin i h ta t v tr quan st v gc ta v mt phng quan st v mt v tr
mong c.
Hnh nh hin th ph thuc vo v tr quan st v gc nhn.
H qui chiu c gc t ti v tr quan st v ph hp vi hng nhn s
thun li cho cc x l tht.
o Loi b phn nm ngoi: Thc hin vic xn i tng trong cnh cnh
nm gn trong mt phn khng gian hnh chp ct gii hn vng quan st
m ta gi l viewing frustum. Viewung frustum c trc trng vi tia nhn,
kch thc gii hn bi vng ta mun quan st. o Chiu t khng gian nhn xung khng gian mn hnh: Thc hin vic chiu
cnh 3 chiu t khng gian quan st xung khng gian mn hnh. C 2
phng php chiu l php chiu song song v php chiu phi cnh. Khi
chiu ta phi tin hnh vic kh mt khut c th nhn c hnh nh
trung thc. Kh mt khut cho php xc nh v tr (x, y) trn mn hnh thuc v i tng no trong cnh.
o Chuyn i tng sang dng pixel.
o Hin th i tng.
6.2. Biu din i tng 3 chiu
Trong ha my tnh, cc i tng lp th c th c m t bng cc b mt ca chng. V d : mt hnh lp phng c xy dng t su mt phng, mt hnh tr
c xy dng t s kt hp ca mt mt cong v hai mt phng v hnh cu c xy
dng t ch mt mt cong. Thng thng biu din mt i tng bt k, ngi ta dng phng php xp x a cc mt v dng cc mt a gic.
Gio trnh Ha My Tnh 93
im trong khng gian 3 chiu c ta (x,y,z) m t mt v tr trong khng gian.
typedef struct { int x;
int y;
int z;
} Point _3D ;
Vect : xc nh bi 3 ta dx, dy, dz m t mt hng v di ca vc t.
Vc t khng c v tr trong khng gian.
222|| dzdydxV ++=
Tch v hng ca hai vc t
V1* V
2 = dx
1dx
2 + dy
1dy
2 + dz
1dz
2
Hay V1* V
2 = |V
1||V
2| cos
typedef struct { int dx; int dy; int dz;
} Vector ;
on thng trong khng gian 3 chiu: biu din t hp tuyn tnh ca 2 im
biu din dng tham s ca on thng, ta c :
P = P1
+ t( P2
P1
) , ( 0 t 1)
typedef struct { Point P1;
Point P2;
} Segment ;
Gio trnh Ha My Tnh 94
Tia (Ray) : l mt on thng vi mt u nm v cc.
Biu din dng tham s ca tia :
P = P1
+ t.V , ( 0 t < )
typedef struct { Point P1;
Vector V;
} Ray;
ng thng (Line): l mt on thng vi c hai u nm v cc
Biu din dng tham s ca ng thng
P = P1 + t.V , ( t < )
typedef struct { Point P1;
Vector V;
} Line;
a gic (Polygon) : l mt vng gii hn bi hn dy cc im ng phng .
typedef struct { Point *Points;
int nPoints;
} Polygon;
C th biu din mt mt a gic bng mt tp hp cc nh v cc thuc tnh km theo. Khi thng tin ca mi mt a gic c nhp, d liu s c in vo cc bng s c dng cho cc x l tip theo, hin th v bin i.
Cc bng d liu m t mt a gic c th t chc thnh hai nhm : bng hnh
hc v bng thuc tnh. Cc bng lu tr d liu hnh hc cha ta cc nh v cc tham s cho bit v nh hng trong khng gian ca mt a gic. Thng tin v thuc
Gio trnh Ha My Tnh 95
tnh ca cc i tng cha cc tham s m t trong sut, tnh phn x v cc thuc
tnh kt cu ca i tng. Mt cch t chc thun tin lu tr cc d liu hnh hc l to ra 3 danh sch : mt bng lu nh, mt bng lu cnh v mt bng lu a gic.
Trong :
o Cc gi tr ta cho mi nh trong i tng c cha trong bng lu nh.
o Bng cnh cha cc con tr tr n bng nh cho bit nh no c ni vi mt cnh ca a gic.
o Cui cng l bng lu a gic cha cc con tr tr n bng lu cnh cho
bit nhng cnh no to nn a gic.
Mt phng (Plane) :
typedef struct { Vector N;
int d; } Plane;
Phng trnh biu din mt phng c dng : A.x + B.y + C.z + D = 0. Trong (x, y, z) l mt im bt k ca mt phng v A, B, C, D l cc hng s din t thng tin khng gian ca mt phng.
xc nh phng trnh mt phng, ta ch cn xc nh 3 im khng thng
hng ca mt phng ny. Nh vy, xc nh phng trnh mt phng qua mt a
gic, ta s s dng ta ca 3 nh u tin (x1,y1), (x2,y2), (x2,y3) trong a gic ny.
T phng trnh mt phng trn, ta c:
A.xk
+ B.yk
+ C.zk
+ D = 0 , k = 0, 1, 2, 3.
Trong :
Gio trnh Ha My Tnh 96
Khai trin cc nh thc trn ta c :
A = y1 (z2
z3) + y2 (z3
z1) + y3 (z1
z2)
B = z1 (x2
x3) + z2 (x3
x1) + z3 (x1
x2)
C = x1 (y2
- y3) + x2 (y3
y1) + x3 (y1
y2)
A = - x1 (y2z3
y3z2) x2 (y3z1
y1z3) x3 (y1z2
y2
z1)
Hng ca mt phng thng c xc nh thng qua vc t php tuyn ca n. Vc
t php tuyn n = (A,B,C).
Hnh 5.15: Mt phng trong khng gian
M hnh khung ni kt
Mt phng php thng dng v n gin m hnh ha i tng l m hnh
khung ni kt. Mt m hnh khung ni kt gm c mt tp cc nh v tp cc cnh
ni cc nh . Khi th hin bng m hnh ny, cc i tng 3 chiu c v rng v khng ging thc t lm. Tuy nhin, v bng m hnh ny th nhanh nn ngi ta thng dng n trong vic xem phc tho cc i tng. hon thin hn, ngi ta
dng cc k thut to bng v loi b cc ng khut, mt khut.
Gio trnh Ha My Tnh 97
Vi m hnh khung ni kt, hnh dng ca i tng 3 chiu c biu din bng
hai danh sch: danh sch cc nh v danh sch cc cnh ni cc nh . Danh sch cc nh cho bit thng tin hnh hc, cn danh sch cc cnh xc nh thng tin v s
kt ni. Chng ta hy quan st mt vt th ba chiu c biu din bng m hnh
khung ni kt nh sau:
Hnh 5.16: M hnh khung kt ni
Bng danh sch cc cnh v nh biu din vt th
Gio trnh Ha My Tnh 98
Ngi ta c th v cc i tng theo m hnh khung ni kt bng cch s dng cc
php chiu song song hay php chiu phi cnh s c gii thiu chng 6.
6.3. Cc php bin i 3 chiu
6.3.1. H ta bn tay phi - bn tay tri
H ta theo qui c bn tay phi : bn tay phi sao cho ngn ci hng
theo trc z, khi nm tay li, cc tay chuyn ng theo hng t trc x n trc y.
Hnh 5.17: H ta bn tay phi
H ta ta theo qui c bn tay tri : bn tay phi sao cho ngn ci hng
theo trc z, khi nm tay li, cc ngn tay chuyn ng theo hng t trc x n
trc y.
Hnh 5.18: H ta bn tay tri
H ta thun nht: Mi im (x