Giáo trình Đồ họa máy tính - Bài: Các thuật toán xén điểm đoạn thẳng - Dương Anh Đức, Lê Đình Huy
ÑOÀ HOÏA MAÙY TÍNH
Caùc thuaät toaùn xeùn
ù ä ù ù
ñieåm, ñoaïn thaúng
å ï ú
Daãn nhaäp
ã
ä
· Thao taùc loaïi boû caùc phaàn hình aûnh naèm ngoaøi moät
vuøng cho tröôùc ñöôïc goïi laø xeùn hình.
· Vuøng ñöôïc duøng ñeå xeùn hình goïi laø cöûa soå xeùn (clip
window).
· Cho cöûa soå hình chöõ nhaät coù toïa ñoä cuûa caùc ñieåm
döôùi beân traùi vaø ñieåm treân beân phaûi laàn löôït laø
xmin , ymin
xmax , ymax
vaø .
Px, y
ñöôïc coi laø naèm beân trong cöûa soå
· Moät ñieåm
neáu thoûa heä baát phöông trình :
x
£ x £ xmax
ì
í
î
min
.
ymin £ y £ ymax
· Baây giôø, ta seõ xeùt baøi toaùn xeùn ñoaïn thaúng ñöôïc cho
P
x1, y1
P2
x2 , y2
vaøo cöûa soå hình
bôûi hai ñieåm
vaø
1
chöõ nhaät treân.
P7
P4
P2
P2
P6
P8
P1
P1
P'6
Window
Window
P3
P'5
(a)
P5
(b)
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 1/11
ÑOÀ HOÏA MAÙY TÍNH
Vaán ñeà toái öu hoùa toác ñoä
à á ù á
á
ä
· YÙ töôûng chung :
¨ Ñoái vôùi caùc ñoaïn thaúng ñaëc bieät nhö naèm hoaøn toaøn
trong hoaëc hoaøn toaøn beân ngoaøi cöûa soå (ví duï nhö ñoaïn
P1P2 vaø P3P4 trong hình treân) : khoâng caàn phaûi tìm giao
ñieåm.
¨ Ñoái vôùi caùc ñoaïn thaúng coù khaû naêng caét cöûa soå : caàn phaûi
ñöa ra caùch tìm giao ñieåm nhanh.
· Nhaän xeùt
¨ Caùc ñoaïn thaúng maø coù caû hai ñieåm naèm hoaøn toaøn trong
cöûa soå thì caû ñoaïn thaúng naèm trong cöûa soå, ñaây cuõng
chính laø keát quaû sau khi xeùn (ví duï nhö ñoaïn thaúng
P1P2), maët khaùc ñoái vôùi caùc ñoaïn thaúng maø coù hai ñieåm
naèm veà cuøng moät phía cuûa cöûa soå thì luoân naèm ngoaøi cöûa
soå vaø seõ bò maát sau khi xeùn (ví duï nhö ñoaïn thaúng P3P4).
¨ Vôùi caùc ñoaïn thaúng coù khaû naêng caét cöûa soå (ví duï nhö
ñoaïn thaúng P5P6 vaø P7P8) ñeå vieäc tìm giao ñieåm nhanh
caàn ruùt goïn vieäc tìm giao ñieåm vôùi nhöõng bieân cöûa soå
khoâng caàn thieát ñeå xaùc ñònh phaàn giao neáu coù cuûa ñoaïn
thaúng vaø cöûa soå.
· Ngöôøi ta thöôøng söû duïng phöông trình tham soá cuûa
ñoaïn thaúng trong vieäc tìm giao ñieåm giöõa ñoaïn thaúng
vôùi cöûa soå.
x = x1 + t
y = y1 + t
(
x2 - x1
y2 - y1
)
= x1 + tDx, Dx = x2 - x1
= y1 + tDy, Dy = y2 - y1, 0 £ t £ 1
· Neáu giao ñieåm öùng vôùi giaù trò t naèm ngoaøi ñoaïn
0,1
thì giao ñieåm ñoù seõ khoâng thuoäc veà cöûa soå.
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 2/11
ÑOÀ HOÏA MAÙY TÍNH
Thuaät toaùn Cohen - Sutherland
ä
ù
· Keùo daøi caùc bieân cuûa cöûa soå, ta chia maët phaúng
thaønh chín vuøng goàm cöûa soå vaø taùm vuøng xung
quanh noù.
TOP
0101
0001
1001
0100
0110
0010
1010
4
3
2
1
LEFT
LEFT
RIGHT
0000
RIGHT
TOP
Window
BOTTOM
BOTTOM
1000
· Khaùi nieäm maõ vuøng (area code)
¨ Moät con soá 4 bit nhò phaân goïi laø maõ vuøng seõ ñöôïc gaùn
cho moãi vuøng ñeå moâ taû vò trí töông ñoái cuûa vuøng ñoù so vôùi
cöûa soå.
¨ Baèng caùch ñaùnh soá töø 1 ñeán 4 theo thöù töï töø phaûi qua
traùi, caùc bit cuûa maõ vuøng ñöôïc duøng theo quy öôùc sau ñeå
chæ moät trong boán vò trí töông ñoái cuûa vuøng so vôùi cöûa soå
bao goàm : traùi, phaûi, treân, döôùi. Ví duï :
Bit 1 : traùi (LEFT)
Bit 2 : phaûi (RIGHT)
Bit 3 : treân (TOP)
Bit 4 : döôùi (BOTTOM)
¨ Giaù trò 1 töông öùng vôùi vò trí bit naøo trong maõ vuøng seõ
chæ ra raèng ñieåm ñoù ôû vò trí öông öùng, ngöôïc laïi bit ñoù seõ
ñöôïc ñaët baèng 0.
¨ Caùc giaù trò bit trong maõ vuøng ñöôïc tính baèng caùch xaùc
x, y
thuoäc vuøng ñoù vôùi caùc bieân
ñònh toïa ñoä cuûa ñieåm
x < x
cuûa cöûa soå. Bit 1 ñöôïc ñaët laø 1 neáu
ñöôïc tính töông töï.
min , caùc bit khaùc
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 3/11
ÑOÀ HOÏA MAÙY TÍNH
Thuaät toaùn
ä
ù
· Gaùn maõ vuøng töông öùng cho caùc ñieåm ñaàu cuoái
P , P
c1,c
2 cuûa ñoaïn thaúng caàn xeùn laàn löôït laø
coù nhaän xeùt :
2 . Ta
1
¨ Caùc ñoaïn thaúng naèm hoaøn toaøn beân trong cöûa soå seõ coù
c = c = 0000
, öùng vôùi caùc ñoaïn naøy, keát quaû sau khi
xeùn laø chính noù.
1
2
c1 ,c2
ñeàu
kÎ 1,..4
¨ Neáu toàn taïi
, sao cho vôùi bit thöù k cuûa
coù giaù trò 1, luùc naøy ñoaïn thaúng seõ naèm veà cuøng phía öùng
vôùi bit k so vôùi cöûa soå, do ñoù naèm hoaøn toaøn ngoaøi cöûa
soå. Ñoaïn naøy seõ bò loaïi boû sau khi xeùn. Ñeå xaùc ñònh tính
chaát naøy, ñôn giaûn chæ caàn thöïc hieän pheùp toaùn logic
c1,c
AND treân
2 . Neáu keát quaû khaùc 0000, ñoaïn thaúng seõ
naèm hoaøn toaøn ngoaøi cöûa soå.
c1,c2
¨ Neáu
khoâng thuoäc veà hai tröôøng hôïp treân, ñoaïn
thaúng coù theå hoaëc khoâng caét ngang cöûa soå, chaéc chaén seõ
toàn taïi moät ñieåm naèm ngoaøi cöûa soå, khoâng maát tính toång
P
quaùt giaû söû ñieåm ñoù laø 1 . Baèng caùch xeùt maõ vuøng cuûa
c1
P
laø
ta coù theå xaùc ñònh ñöôïc caùc bieân maø ñoaïn
1
thaúng coù theå caét ñeå töø ñoù choïn moät bieân vaø tieán haønh
P '
tìm giao ñieåm
ñoaïn thaúng ban ñaàu ñöôïc xeùn thaønh
ta laïi laëp laïi thao taùc ñaõ xeùt cho ñoaïn thaúng môùi
cuûa ñoaïn thaúng vôùi bieân ñoù. Luùc naøy,
1
P P '
. Sau ñoù chuùng
1
1
P P '
1
1
cho tôùi khi xaùc ñònh ñöôïc phaàn naèm trong hoaëc loaïi boû
toaøn boä ñoaïn thaúng.
¨ Caùc ñieåm giao vôùi caùc bieân cöûa soå cuûa ñoaïn thaúng coù theå
ñöôïc tính töø phöông trình tham soá. Ví duï : tung ñoä y cuûa
ñieåm giao ñoaïn thaúng vôùi bieân ñöùng cuûa cöûa soå coù theå
y = y1 + mx - x1
, trong ñoù x coù theå laø
tính töø coâng thöùc
xmax
xmin
hay
.
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 4/11
ÑOÀ HOÏA MAÙY TÍNH
Löu ñoà thuaät toaùn Cohen - Sutherland
Begin
EnCode(P1,c1);
EnCode(P2,c2)
(c1!=0000) || (c2!=0000)
No
Yes
(c1&c2 == 0000)
Yes
No
Xaùc ñònh giao ñieåm cuûa ñoaïn
thaúng vôùi bieân cuûa cöûa soå
baèng caùch xeùt maõ vuøng cuûa
ñieåm naèm ngoaøi cöûa soå
End
// Ñoaïn CT tính maõ vuøng
void EnCode(POINT p, CODE &c, RECT rWin)
{
c = 0;
if(p.x < rWin.Left)
c |= LEFT;
if(p.x > rWin.Right)
c |= RIGHT;
if(p.y > rWin.Top)
c |= TOP;
if(p.y < rWin.Bottom)
c |= BOTTOM;
}
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 5/11
ÑOÀ HOÏA MAÙY TÍNH
Thuaät toaùn Liang - Barsky
ä
ù
· Thuaät toaùn Liang-Barsky ñöôïc phaùt trieån döïa vaøo
vieäc phaân tích daïng tham soá cuûa phöông trình ñoaïn
thaúng.
x = x1 + t
y = y1 + t
(
x2 - x1
y2 - y1
)
= x1 + tDx, Dx = x2 - x1
= y1 + tDy, Dy = y2 - y1,
0 £ t £ 1
· ÖÙng vôùi moãi giaù trò t, ta seõ coù moät ñieåm P töông öùng
thuoäc ñöôøng thaúng.
t ³ 1
t £ 0
¨ Caùc ñieåm öùng vôùi
¨ Caùc ñieåm öùng vôùi
¨ Caùc ñieåm öùng vôùi
seõ thuoäc veà tia P2x.
seõ thuoäc veà tia P2x’.
0 £ t £ 1
P P2
seõ thuoäc veà ñoaïn thaúng
.
1
x
P2(x2, y2)
t>1
t=1
P1(x1, y1)
t=0
t<0
x'
· Taäp hôïp caùc ñieåm thuoäc veà phaàn giao cuûa ñoaïn thaúng
vaø cöûa soå öùng vôùi caùc giaù trò t thoûa heä baát phöông
x
y
£ x1 + tDx £ xmax
£ y1 + tDy £ ymax
ì
ï
í
min
min
trình :
ï
0 £ t £ 1
î
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 6/11
ÑOÀ HOÏA MAÙY TÍNH
p1 = - Dx, q1 = x1 - xmin
p2 = Dx, q2 = xmax - x1
p3 = - Dy, q3 = y1 - ymin
p4 = Dy, q4 = ymax - y1
· Ñaët
· Luùc naøy ta vieát heä phöông trình treân döôùi daïng :
p t £ q , k = 1,2,3,4
0 £ t £ 1
ì
í
î
k
k
· Nhö vaäy vieäc tìm ñoaïn giao thöïc chaát laø tìm nghieäm
cuûa heä baát phöông trình naøy. Coù hai khaû naêng xaûy
ra ñoù laø :
¨ Heä baát phöông trình voâ nghieäm, nghóa laø ñöôøng thaúng
khoâng coù phaàn giao vôùi cöûa soå neân seõ bò loaïi boû.
¨ Heä baát phöông trình coù nghieäm, luùc naøy taäp nghieäm seõ
tÎ
t1,t2
Í
0,1
.
laø caùc giaù trò t thoûa
· Ta xeùt caùc tröôøng hôïp :
$ kÎ 1,2,3,4: (pk = 0) Ù (qk < 0)
¨ Neáu
thì roõ raøng baát
phöông trình öùng vôùi k treân laø voâ nghieäm, do ñoù heä voâ
nghieäm.
" kÎ 1,2,3,4: (p ¹ 0) Ú (q ³ 0)
thì vôùi caùc baát
¨ Neáu
k
k
phöông trình maø öùng vôùi pk = 0 laø caùc baát phöông trình
hieån nhieân, luùc naøy heä baát phöông trình caàn giaûi töông
ñöông vôùi heä baát phöông trình coù pk ¹ 0.
pkt £ qk
p < 0
¨ Vôùi caùc baát phöông trình
t ³ qk / pk
maø
, ta coù
k
.
pkt £ q
p > 0
¨ Vôùi caùc baát phöông trình
t £ qk / pk
k maø
, ta coù
k
.
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 7/11
ÑOÀ HOÏA MAÙY TÍNH
t1,t2
vôùi :
· Vaäy nghieäm cuûa heä baát phöông trình laø
ì
ï
ï
ì
í
î
ü
qk
pk
t = max(
, p < 0 U
{
0
}
)
ý
1
k
þ
ü
ï
ï
í
ì
qk
pk
t = min(
, p > 0 U
{1
}
)
í
ý
2
k
î
þ
ï
ï
ï
t1 £ t2
ï
î
Q1Q2
· Neáu heä treân coù nghieäm thì ñoaïn giao
seõ laø
Q (x + t Dx, y + t Dy),Q (x + t Dx, y + t Dy)
.
1
1
1
1
1
2
1
2
1
2
· Neáu xeùt thuaät toaùn naøy ôû khía caïnh hình hoïc ta coù :
$ k Î
1,2,3,4
: (pk = 0) Ù (qk < 0)
töông öùng
¨ Tröôøng hôïp
vôùi tröôøng hôïp ñoaïn thaúng caàn xeùt song song vôùi moät
p = 0
trong caùc bieân cuûa cöûa soå (
) vaø naèm ngoaøi cöûa soå
k
q < 0
(
) neân seõ bò loaïi boû sau khi xeùn.
k
t = rk = qk / pk
seõ töông öùng vôùi
p ¹ 0
¨ Vôùi
, giaù trò
k
giao ñieåm cuûa ñoaïn thaúng vôùi bieân k keùo daøi cuûa cöûa soå.
p < 0
Tröôøng hôïp
thaúng veà voâ cöïc, ta coù ñöôøng thaúng ñang xeùt seõ coù höôùng
p > 0
, keùo daøi caùc bieân cöûa soå vaø ñoaïn
k
ñi töø beân ngoaøi vaøo beân trong cöûa soå. Neáu
thaúng seõ coù höôùng ñi töø beân trong cöûa soå ñi ra. Do ñoù hai
t1 ,t2
, ñöôøng
k
ñaàu muùt cuûa ñoaïn giao seõ öùng vôùi caùc giaù trò
ñöôïc
t1
tính nhö sau : Giaù trò
rk = qk / p pk < 0
chính laø giaù trò lôùn nhaát cuûa caùc
(ñöôøng thaúng ñi töø ngoaøi vaøo
k maø
trong cöûa soå) vaø 0; giaù trò
t2
chính laø giaù trò nhoû nhaát
(ñöôøng thaúng ñi töø trong
pk > 0
k maø
rk = qk / p
cuûa caùc
cöûa soå ñi ra) vaø 1.
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 8/11
ÑOÀ HOÏA MAÙY TÍNH
Thuaät toaùn xeùn ña giaùc
ä ù ù ù
Sutherland - Hodgemand
Daãn nhaäp
ã
ä
· Chuùng ta coù theå hieäu chænh caùc thuaät toaùn xeùn ñoaïn
thaúng ñeå xeùn ña giaùc baèng caùch xem ña giaùc nhö laø
moät taäp caùc ñoaïn thaúng lieân tieáp noái vôùi nhau. Tuy
nhieân, keát quaû sau khi xeùn nhieàu khi laïi laø taäp caùc
ñoaïn thaúng rôøi nhau.
· Ñieàu chuùng ta mong muoán ôû ñaây ñoù laø keát quaû sau
khi xeùn phaûi laø moät caùc ña giaùc ñeå sau naøy coù theå
chuyeån thaønh caùc vuøng toâ.
(a)
(b)
(c)
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 9/11
ÑOÀ HOÏA MAÙY TÍNH
Thuaät toaùn Sutherland - Hodgeman
ä
ù
· Thuaät toaùn naøy seõ tieán haønh xeùn ña giaùc laàn löôït vôùi
caùc bieân cöûa soå. Ñaàu tieân, ña giaùc seõ ñöôïc xeùn doïc
theo bieân traùi cuûa cöûa soå, keát quaû sau böôùc naøy seõ
ñöôïc duøng ñeå xeùn tieáp bieân phaûi, roài cöù töông töï nhö
vaäy cho caùc bieân treân, döôùi. Sau khi xeùn heát vôùi boán
bieân cuûa cöûa soå, ta ñöôïc keát quaû cuoái cuøng.
· Vôùi moãi laàn xeùn ña giaùc doïc theo moät bieân naøo ñoù
Vi ,Vi+1
cuûa cöûa soå, neáu goïi
laø hai ñænh keà caïnh
ViV
i+1 , ta coù 4 tröôøng hôïp coù theå xaûy ra khi xeùt töøng
caëp ñænh cuûa ña giaùc ban ñaàu vôùi bieân cuûa cöûa soå nhö
sau:
Vi+1
naèm trong, ta löu giao ñieåm I
Vi
¨ Neáu
naèm ngoaøi,
ViVi+1
Vi+1
cuûa
vôùi bieân cuûa cöûa soå vaø
.
Vi
Vi
Vi+1
,
Vi+1
¨ Neáu caû
,
ñeàu naèm trong, ta seõ löu caû
.
Vi
vaø I.
Vi
Vi+1
¨ Neáu
naèm trong,
naèm ngoaøi, ta seõ löu
Vi+1
Vi
¨ Neáu caû
,
ñeàu naèm ngoaøi, ta khoâng löu gì caû.
Vi
I
Vi+1
Vi
Vi+1
Vi
Vi+1
I
Vi+1
Vi
(i)
(ii)
(iii)
(iv)
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 10/11
ÑOÀ HOÏA MAÙY TÍNH
Caøi ñaët haøm xeùn ña giaùc theo moät caïnh cuûa cöûa soå
void ClipEdge(POINT *pIn, int N, POINT *pOut, int &Cnt, int Edge, RECT rWin)
{
int FlagPrevPt = FALSE;
Cnt = 0;
POINT pPrev;
pPrev = pIn[0];
if(Inside(pPrev, Edge, rWin)) // Save point
{
pOut[Cnt] = pPrev;
Cnt++;
FlagPrevPt = TRUE;
}
for(int i=1; i<N; i++)
{
if(FlagPrevPt) // Diem bat dau nam trong
{
if(Inside(pIn[i], Edge, rWin)) // Save point P
{
pOut[Cnt] = pIn[i];
Cnt++;
}
else // Save I
{
FlagPrevPt = FALSE;
pOut[Cnt] = Intersect(pPrev, pIn[i], Edge, rWin);
Cnt++;
}
}
else // Diem bat dau canh nam ngoai
{
if(Inside(pIn[i], Edge, rWin)) // Save point I, P
{
FlagPrevPt = TRUE;
pOut[Cnt] = Intersect(pPrev, pIn[i], Edge, rWin);
Cnt++;
pOut[Cnt] = pIn[i];
Cnt++;
}
}
pPrev = pIn[i];
}
// Neu Diem cuoi va dau giao voi bien cua cua so Save point I
if(!(Inside(pIn[N], Edge, rWin) == Inside(pPrev, Edge, rWin)))
{
pOut[Cnt] = Intersect(pPrev, pIn[N], Edge, rWin);
Cnt++;
}
pOut[Cnt] = pOut[0];
}// ClipEdge
Döông Anh Ñöùc, Leâ Ñình Duy
Caùc thuaät toaùn xeùn hình 11/11
Bạn đang xem tài liệu "Giáo trình Đồ họa máy tính - Bài: Các thuật toán xén điểm đoạn thẳng - Dương Anh Đức, Lê Đình Huy", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
- giao_trinh_do_hoa_may_tinh_bai_cac_thuat_toan_xen_diem_doan.pdf