Giáo trình Đồ họa máy tính - Chương 2, Phần 1: Các đối tượng đồ họa cơ sở

CHÖÔNG 2  
CAÙC ÑOÁI TÖÔÏNG ÑOÀ HOÏA CÔ SÔÛ  
Baát kì moät aûnh moâ taû theá giôùi thöïc naøo bao giôø cuõng ñöôïc caáu truùc töø  
taäp caùc ñoái töôïng ñôn giaûn hôn. Ví duï moät aûnh theå hieän baøi trí cuûa moät caên  
phoøng seõ ñöôïc caáu truùc töø caùc ñoái töôïng nhö caây caûnh, tuû kính, baøn gheá,  
töôøng, aùnh saùng ñeøn, … Vôùi caùc aûnh ñoà hoïa phaùt sinh baèng maùy tính, hình  
daïng vaø maøu saéc cuûa moãi ñoái töôïng coù theå ñöôïc moâ taû rieâng bieät baèng  
hai caùch : hoaëc laø baèng daõy caùc pixel töông öùng hoaëc laø baèng taäp caùc ñoái  
töôïng hình hoïc cô sôû nhö ñoaïn thaúng hay vuøng toâ ña giaùc, … Sau ñoù, caùc aûnh  
seõ ñöôïc hieån thò baèng caùch naïp caùc pixel vaøo vuøng ñeäm khung.  
Hình 2.1 – AÛnh caùnh tay robot ñöôïc caáu taïo töø caùc ñoái töôïng ñoà hoïa cô sôû  
Vôùi caùc aûnh ñöôïc moâ taû baèng caùc ñoái töôïng hình hoïc cô sôû, caàn phaûi coù  
moät quaù trình chuyeån caùc ñoái töôïng naøy veà daïng ma traän caùc pixel tröôùc.  
Quaù trình naøy coøn ñöôïc goïi laø quaù trình chuyeån ñoåi baèng doøng queùt (scan-  
converting). Baát kì coâng cuï laäp trình ñoà hoïa naøo cuõng phaûi cung caáp caùc haøm  
ñeå moâ taû moät aûnh döôùi daïng caùc ñoái töôïng hình hoïc cô sôû hay coøn goïi laø  
caùc ñoái töôïng ñoà hoïa cô sôû (output primitives) vaø caùc haøm cho pheùp keát hôïp  
taäp caùc ñoái töôïng cô sôû ñeå taïo thaønh ñoái töôïng coù caáu truùc phöùc taïp hôn.  
Moãi ñoái töôïng ñoà hoïa cô sôû ñöôïc moâ taû thoâng qua döõ lieäu veà toïa ñoä vaø  
caùc thuoäc tính cuûa noù, ñaây chính laø thoâng tin cho bieát kieåu caùch maø ñoái  
töôïng ñöôïc hieån thò. Ñoái töôïng ñoà hoïa cô sôû ñôn giaûn nhaát laø ñieåm vaø ñoaïn  
thaúng, ngoaøi ra coøn coù ñöôøng troøn, vaø caùc ñöôøng conics, maët baäc hai, caùc  
maët vaø ñöôøng splines, caùc vuøng toâ ña giaùc, chuoãi kí töï, … cuõng ñöôïc xem laø  
caùc ñoái töôïng ñoà hoïa cô sôû ñeå giuùp xaây döïng caùc aûnh phöùc taïp. Chöông  
naøy seõ khaûo saùt caùc thuaät toaùn hieån thò caùc ñoái töôïng ñoà hoïa cô sôû cho  
caùc thieát bò hieån thò daïng ñieåm.  
Xeùt veà maët baûn chaát, caùc thuaät toaùn naøy thöïc hieän quaù trình chuyeån ñoåi  
caùc ñoái töôïng ñoà hoïa cô sôû ñöôïc moâ taû trong heä toïa ñoä thöïc veà daõy caùc  
pixel coù toïa ñoä nguyeân cuûa thieát bò hieån thò. Coù hai yeâu caàu ñaët ra cho caùc  
thuaät toaùn naøy ñoù laø :  
Ñoái töôïng ñöôïc moâ taû trong heä toïa ñoä thöïc laø ñoái töôïng lieân tuïc, coøn ñoái  
töôïng trong heä toïa ñoä thieát bò laø ñoái töôïng rôøi raïc, do ñoù baûn chaát cuûa quaù  
trình chuyeån ñoåi naøy chính laø söï rôøi raïc hoùa vaø nguyeân hoùa caùc ñoái töôïng  
sao cho coù theå xaùc ñònh caùc ñieåm nguyeân xaáp xæ ñoái töôïng moät caùch toát nhaát,  
thöïc nhaát. Nghóa laø ñoái töôïng hieån thò baèng löôùi nguyeân treân thieát bò hieån  
thò phaûi coù hình daïng töông töï nhö ñoái töôïng trong löôùi toïa ñoä thöïc vaø “coù  
veû” lieân tuïc, lieàn neùt. Söï lieân tuïc treân löôùi nguyeân cuûa thieát bò hieån thò coù  
ñöôïc do maét ngöôøi khoâng theå phaân bieät ñöôïc hai ñieåm quaù gaàn nhau.  
Do caùc ñoái töôïng ñoà hoïa cô sôû laø thaønh phaàn chính caáu truùc caùc ñoái töôïng  
phöùc taïp neân caùc thuaät toaùn hieån thò chuùng caàn phaûi ñöôïc toái öu hoùa veà  
maët toác ñoä, ñaây chính laø ñieåm maáu choát cho vieäc ra ñôøi caùc thuaät toaùn  
khaùc nhau.  
Hình 2.2 – Quaù trình chuyeån ñoåi moät ñoaïn thaúng veà daõy caùc pixel töông öùng  
1. CAÙC ÑOÁI TÖÔÏNG ÑOÀ HOÏA CÔ SÔÛ  
1.1. Heä toïa ñoä theá giôùi thöïc vaø heä toïa ñoä thieát bò  
1.1.1. Heä toïa ñoä theá giôùi thöïc  
Heä toïa ñoä theá giôùi thöïc (hay heä toïa ñoä thöïc) laø heä toïa ñoä ñöôïc duøng moâ  
taû caùc ñoái töôïng theá giôùi thöïc. Moät trong caùc heä toïa ñoä thöïc thöôøng ñöôïc  
duøng nhaát ñoù laø heä toïa ñoä Descartes. Vôùi heä toïa ñoä naøy, baát kì moät ñieåm  
naøo trong maët phaúng cuõng ñöôïc moâ taû baèng moät caëp toïa ñoä (x, y) trong ñoù  
x, y R. Goác toïa ñoä laø ñieåm O coù toïa ñoä (0, 0). Caùc truïc toïa ñoä coù chieàu  
döông ñöôïc quy öôùc nhö hình 2.3; Ox, Oy laàn löôït ñöôïc goïi laø truïc hoaønh, truïc  
tung; x laø khoaûng caùch töø ñieåm ñeán truïc hoaønh hay coøn ñöôïc goïi laø hoaønh  
ñoä, y laø khoaûng caùch töø ñieåm ñeán truïc tung hay coøn ñöôïc goïi laø tung ñoä.  
Caùc toïa ñoä theá giôùi thöïc cho pheùp ngöôøi duøng söû duïng baát kì moät thöù  
nguyeân (dimension) quy öôùc nhö foot, cm, mm, km, inch, ... naøo vaø coù theå lôùn  
nhoû tuøy yù.  
1.1.2. Heä toïa ñoä thieát bò  
Heä toïa ñoä thieát bò laø heä toïa ñoä ñöôïc duøng bôûi moät thieát bò xuaát cuï theå naøo ñoù nhö  
maùy in, maøn hình, ... Ñaëc ñieåm chung cuûa caùc heä toïa ñoä thieát bò ñoù laø :  
Caùc ñieåm trong heä toïa ñoä thieát bò cuõng ñöôïc moâ taû bôûi moät caëp toïa ñoä (x,  
y), tuy nhieân ñieåm khaùc vôùi heä toïa ñoä thöïc laø x, y N. Ñieàu naøy cho thaáy  
caùc ñieåm trong heä toïa ñoä thöïc ñöôïc ñònh nghóa lieân tuïc, coøn caùc ñieåm trong  
caùc heä toïa ñoä thieát bò laø rôøi raïc do tính chaát cuûa taäp caùc soá töï nhieân.  
Caùc toïa ñoä x, y cuûa heä toïa ñoä thieát bò khoâng theå lôùn tuøy yù maø ñeàu bò giôùi  
haïn trong moät khoaûng naøo ñoù. Moät soá thieát bò chæ cho x chaïy trong  
ñoaïn[0,639], y chaïy trong ñoaïn [0,479]. Khoaûng giôùi haïn caùc toïa ñoä x, y laø  
khaùc nhau ñoái vôùi töøng loaïi thieát bò khaùc nhau.  
y
y
y
PWC(x,y)  
ymax  
PDC(x,y)  
O
x
x
O
xmax  
x
(a)  
(b)  
Hình 2.3 – Heä toïa ñoä thöïc (a) vaø heä toïa ñoä thieát bò (b)  
Heä toïa ñoä vôùi caùc höôùng cuûa caùc truïc toïa ñoä nhö treân coøn ñöôïc goïi laø heä  
toïa ñoä theo quy öôùc baøn tay phaûi.  
Ngoaøi ra do caùch toå chöùc boä nhôù neân thoâng thöôøng caùc heä toïa ñoä thieát bò  
thöôøng döïa treân heä toïa ñoä theo quy öôùc baøn tay traùi.  
y
O
x
O
x
y
(a)  
(b)  
Hình 2.4 - Heä toïa ñoä theo quy öôùc baøn tay phaûi (a) vaø quy öôùc baøn tay traùi (b)  
1.2. Ñieåm  
Ñieåm laø thaønh phaàn cô sôû ñöôïc ñònh nghóa trong moät heä toïa ñoä. Ñoái vôùi heä  
toïa ñoä hai chieàu moãi ñieåm ñöôïc xaùc ñònh bôûi caëp toïa ñoä (x, y).  
Ngoaøi thoâng tin veà toïa ñoä, ñieåm coøn coù thuoäc tính laø maøu saéc.  
1.3. Ñoaïn thaúng, ñöôøng gaáp khuùc  
Moät ñöôøng thaúng coù theå xaùc ñònh neáu bieát hai ñieåm thuoäc noù. Phöông trình  
ñöôøng thaúng ñi qua hai ñieåm (x1, y1) vaø (x2, y2) coù daïng sau :  
x x1  
y y1  
x2 x1  
y2 y1  
hay ôû daïng töông ñöông :  
x x1 y2 y1  
y y1 x2 x1  
   
Khai trieån ta coù daïng : y mx b, trong ñoù :  
Dy  
m   
, Dy y2 y1, Dx x2 x1  
Dx  
b y1 mx1  
Ñaây coøn ñöôïc goïi laø phöông trình ñoaïn chaén cuûa ñöôøng thaúng.  
Neáu khai trieån döôùi daïng :  
y2 y1  
x   
x2 x1  
y x1 y2 x2 y1 0  
vaø ñaët A y2 y1, B    
x2 x1 ,C x2 y1 x1 y2 thì phöông trình ñöôøng thaúng seõ coù  
daïng Ax By C 0, daïng naøy ñöôïc goïi laø phöông trình toång quaùt cuûa ñöôøng thaúng.  
Phöông trình tham soá cuûa ñöôøng thaúng coù daïng caùc toïa ñoä x, y ñöôïc moâ taû  
qua moät thaønh phaàn thöù ba laø t. Daïng naøy raát thuaän tieän khi khaûo saùt caùc  
ñoaïn thaúng.  
x   
y   
1t  
1t  
x1 tx2  
y1 ty2  
Neáu t  
vaø (x2, y2), neáu t  
0,1  
, ta coù caùc ñieåm (x,y) thuoäc veà ñoaïn thaúng giôùi haïn bôûi hai ñieåm (x1, y1)  
, , ta seõ coù toaøn boä ñöôøng thaúng.  
Moät ñoaïn thaúng laø moät ñöôøng thaúng bò giôùi haïn bôûi hai ñieåm ñaàu, cuoái.  
(x2, y2)  
t>1  
t=1  
(x1, y1)  
t=0  
t<0  
Hình 2.5 – Daïng tham soá cuûa phöông trình ñöôøng thaúng  
Ñöôøng gaáp khuùc laø taäp caùc ñoaïn thaúng noái vôùi nhau moät caùch tuaàn töï.  
Caùc ñoaïn thaúng naøy khoâng nhaát thieát phaûi taïo thaønh moät hình kheùp kín vaø  
caùc ñoaïn coù theå caét laãn nhau. Ñieåm giao cuûa hai ñoaïn thaúng ñöôïc goïi laø  
ñænh. Caùc ñöôøng gaáp khuùc ñöôïc xaùc ñònh qua danh saùch caùc ñænh, moãi ñænh  
ñöôïc cho bôûi caùc caëp toïa ñoä  
xi , yi .  
Moät ña giaùc laø moät ñöôøng gaáp khuùc coù ñieåm ñaàu vaø ñieåm cuoái truøng  
nhau.  
(a)  
(b)  
Hình 2.6 – Ñöôøng gaáp khuùc (a) vaø ña giaùc (b)  
Caùc thuoäc tính cuûa ñoaïn thaúng bao goàm :  
Maøu saéc  
Ñoä roäng cuûa neùt veõ.  
Kieåu neùt veõ cuûa ñoaïn thaúng : coù theå laø moät trong caùc daïng nhö hình 2.7.  
Haàu heát caùc coâng cuï ñoà hoïa ñeàu ñònh nghóa taäp caùc kieåu neùt veõ ñoaïn thaúng  
coù theå duøng vaø cho pheùp ngöôøi duøng ñònh nghóa kieåu ñoaïn thaúng cuûa mình  
thoâng qua moät maãu (pattern) goàm caùc soá 0, 1.  
Ñoái vôùi ñöôøng gaáp khuùc, caùc ñoaïn thaúng trong cuøng moät ñöôøng gaáp khuùc  
thì coù cuøng moät thuoäc tính.  
Hình 2.7 – Moät soá kieåu neùt veõ cuûa ñoaïn thaúng  
1.4. Vuøng toâ  
Moät vuøng toâ bao goàm ñöôøng bieân vaø vuøng beân trong. Ñöôøng bieân laø  
moät ñöôøng kheùp kín ví duï nhö ña giaùc.  
Caùc thuoäc tính cuûa vuøng toâ bao goàm:  
Thuoäc tính cuûa ñöôøng bieân : chính laø caùc thuoäc tính nhö thuoäc tính cuûa  
ñoaïn thaúng.  
Thuoäc tính cuûa vuøng beân trong : bao goàm maøu toâ vaø maãu toâ.  
Hình 2.8 – Vuøng toâ vôùi caùc daïng ñöôøng bieân vaø maãu toâ khaùc nhau  
1.5. Kí töï, chuoãi kí töï  
Caùc chuoãi kí töï giuùp hieån thò noäi dung caùc thoâng ñieäp theo moät ngoân ngöõ  
naøo ñoù.  
Caùc thuoäc tính cuûa kí töï bao goàm :  
Maøu saéc cuûa caùc kí töï.  
Font chöõ : boä kí töï duøng hieån thò; Noù ñònh nghóa kieåu, kích thöôùc cuûa kí töï  
hieån thò. Hình daïng cuûa moãi kí töï coù theå ñöôïc xaùc ñònh bôûi moät taäp caùc  
ñöôøng gaáp khuùc (tröôøng hôïp font vector) hay laø maãu caùc pixel (font  
bitmap). Coù nhieàu loaïi font khaùc nhau nhö font bitmap, font truetype, font  
CHR, ...  
Kích thöôùc : chieàu cao vaø chieàu roäng cuûa kí töï. Caùc kí töï ñònh nghóa baèng  
ñöôøng gaáp khuùc coù theå deã daøng thay ñoåi kích thöôùc hôn laø caùc kí töï ñònh  
nghóa baèng maãu caùc pixel.  
Khoaûng caùch giöõa caùc kí töï.  
Söï canh chænh (gioùng leà) : canh traùi (left text), canh phaûi (right text), canh  
giöõa (center text), canh ñeàu nhau (justify text).  
Caùch hieån thò tuaàn töï cuûa caùc kí töï : coù theå laø phaûi sang traùi, töø treân xuoáng  
döôùi, töø traùi sang phaûi, töø döôùi leân treân.  
Höôùng cuûa kí töï.  
Hình 2.9 – Daïng bitmap vaø vector cuûa font kí töï B  
2. CAÙC THUAÄT TOAÙN VEÕ ÑÖÔØNG  
Giaû söû toïa ñoä caùc ñieåm nguyeân sau khi xaáp xæ ñoái töôïng thöïc laàn löôït laø  
xi , yi  
Baøi toaùn ñaët ra laø neáu bieát ñöôïc  
nguyeân tieáp theo i1, yi1 seõ ñöôïc xaùc ñònh nhö theá naøo.  
Nhaän xeùt raèng ñeå ñoái töôïng hieån thò treân löôùi nguyeân ñöôïc lieàn neùt, caùc ñieåm maø  
,i 0,.... Ñaây laø caùc ñieåm nguyeân seõ ñöôïc hieån thò treân maøn hình.  
xi , yi laø toïa ñoä nguyeân xaùc ñònh ôû böôùc thöù i, ñieåm  
x
x
i1, yi1 coù theå choïn chæ laø moät trong taùm ñieåm ñöôïc ñaùnh soá töø 1 ñeán 8 trong hình 2.10  
(ñieåm ñen chính laø xi , yi ).Hay noùi caùch khaùc : i1, yi1 xi 1, yi 1  
x
.
Daùng ñieäu cuûa ñöôøng seõ cho ta gôïi yù khi choïn moät trong taùm ñieåm treân.  
Caùch choïn caùc ñieåm nhö theá naøo seõ tuøy thuoäc vaøo töøng thuaät toaùn treân cô  
sôû xem xeùt tôùi vaán ñeà toái öu toác ñoä.  
4
5
6
3
7
2
1
8
Hình 2.10 – Caùc ñieåm  
x
i1, yi1 coù theå choïn ôû böôùc (i+1)  
2.1. Thuaät toaùn veõ ñoaïn thaúng  
Xeùt ñoaïn thaúng coù heä soá goùc 0 m 1vaø Dx 0  
Vôùi caùc ñoaïn thaúng daïng naøy, neáu xi , yi laø ñieåm ñaõ xaùc ñònh ñöôïc ôû böôùc thöù i  
i1, yi1 ôû böôùc thöù (i+1) seõ laø moät trong hai tröôøng  
.
(ñieåm maøu ñen) thì ñieåm caàn choïn  
hôïp nhö hình veõ sau :  
x
Hình 2.11 – Caùc ñieåm  
x
i1, yi1 choïn ôû böôùc (i+1) cho tröôøng hôïp  
(xi+1, yi+1)  
2
yi  
(xi+1, yi)  
1
xi  
ñoaïn thaúng coù heä soá goùc 0<m<1  
x
yi1  
xi 1  
i1  
Nhö vaäy :  
yi , yi 1  
Vaán ñeà coøn laïi laø caùch choïn moät trong hai ñieåm treân nhö theá naøo ñeå coù  
theå toái öu veà maët toác ñoä.  
2.1.1. Thuaät toaùn DDA (Digital Differential Analyzer)  
Vôùi thuaät toaùn DDA, vieäc quyeát ñònh choïn yi1 laø yi hay yi 1, döïa vaøo phöông  
trình cuûa ñoaïn thaúng y mx b. Nghóa laø, ta seõ tính toïa ñoä cuûa ñieåm  
xi 1, y thuoäc veà  
ñoaïn thaúng thöïc. Tieáp ñoù, yi1 seõ laø giaù trò sau khi laøm troøn giaù trò tung ñoä y.  
y m  
yi1 Round  
xi 1 b  
Nhö vaäy :  
y
   
(xi+1, Round(y))  
(xi+1, y)  
(xi, yi)  
Hình 2.12 – Minh hoïa thuaät toaùn DDA  
Neáu tính tröïc tieáp giaù trò thöïc y ôû moãi böôùc töø phöông trình y mx bthì phaûi caàn  
moät pheùp toaùn nhaân vaø moät pheùp toaùn coäng soá thöïc. Ñeå caûi thieän toác ñoä, ngöôøi ta tính giaù  
trò thöïc cuûa y ôû moãi böôùc theo caùch sau ñeå khöû pheùp tính nhaân treân soá thöïc :  
Nhaän xeùt raèng : ysau mxi1 b m  
xi 1 b  
ytröôùc mxi b  
ysau ytröôùc m  
Löu ñoà thuaät toaùn DDA veõ ñoaïn thaúng qua hai ñieåm (x1, y1) vaø (x2,y2)  
Begin  
m=Dy/Dx;  
x=x1;  
y=y1;  
putpixel(x, Round(y), c);  
No  
x<x2  
Yes  
x=x+1;  
y=y+m;  
putpixel(x, Round(y),c);  
End  
Caøi ñaët minh hoïa thuaät toaùn DDA  
#define Round(a) int(a+0.5)  
int Color = GREEN;  
void LineDDA (int x1, int y1, int x2, int y2)  
{
int x = x1;  
float y = y1;  
float m = float(y2-y1)/(x2-x1);  
putpixel(x, Round(y), Color);  
for(int i=x1; i<x2; i++)  
{
x++;  
y +=m;  
putpixel(x, Round(y), Color);  
}
} // LineDDA  
Nhaän xeùt  
Vieäc söû duïng coâng thöùc ysau ytröôùc m ñeå tính giaù trò y taïi moãi böôùc ñaõ  
giuùp cho thuaät toaùn DDA nhanh hôn haún so vôùi caùch tính y töø phöông  
trình y mx b do khöû ñöôïc pheùp nhaân treân soá thöïc. Tuy nhieân, vieäc  
coäng doàn giaù trò thöïc m vaøo y coù theå seõ tích luõy sai soá laøm cho haøm laøm  
troøn coù keát quaû sai daãn tôùi vieäc xaùc ñònh vò trí cuûa ñieåm veõ ra bò cheäch  
höôùng so vôùi ñöôøng thaúng thöïc. Ñieàu naøy chæ xaûy ra khi veõ ñoaïn thaúng khaù  
daøi.  
Tuy ñaõ khöû ñöôïc pheùp nhaân soá thöïc nhöng thuaät toaùn DDA vaãn coøn bò haïn  
cheá veà maët toác ñoä do vaãn coøn pheùp toaùn coäng soá thöïc vaø laøm troøn. Coù theå  
khaéc phuïc thao taùc coäng soá thöïc m vaø laøm troøn trong thuaät toaùn baèng caùch  
Dy  
nhaän xeùt m   
vôùi Dy, Dx laø caùc soá nguyeân.  
Dx  
2.1.2. Thuaät toaùn Bresenham  
Thuaät toaùn Bresenham ñöa ra caùch choïn yi1 laø yi hay yi 1 theo moät höôùng khaùc  
sao cho coù theå toái öu hoùa veà maët toác ñoä so vôùi thuaät toaùn DDA. Vaán ñeà maáu choát ôû ñaây laø  
laøm theá naøo ñeå haïn cheá toái ña caùc pheùp toaùn treân soá thöïc trong thuaät toaùn.  
(xi+1, y)  
P
yi+1  
y
d2  
d1  
S
yi  
xi  
xi+1  
Hình 2.13 – Minh hoïa thuaät toaùn Bresenham  
Goïi  
Ñaët  
xi 1, y  
d1 y yi  
d2 yi 1 y  
laø ñieåm thuoäc ñoaïn thaúng. Ta coù: y m  
xi 1 b.  
Xeùt taát caû caùc vò trí töông ñoái cuûa y so vôùi yi vaø yi 1, vieäc choïn ñieåm  
S hay P phuï thuoäc vaøo vieäc so saùnh d1 vaø d2 hay daáu cuûa d1 d2 :  
x
i1, yi1  
laø  
Neáu d1 d2 0 , ta seõ choïn ñieåm S, töùc laø yi1 yi  
Ngöôïc laïi, neáu d1 d2 0 , ta seõ choïn ñieåm P, töùc laø yi1 yi 1 .  
d1 d2 Dx 2y 2yi 1  
xi 1 b 2yi 1  
.
Xeùt pi Dx  
pi Dx  
2
m
Dy  
Dx  
Dx.  
Thay m   
c 2Dy 2b1  
Nhaän xeùt raèng do Dx 0 neân daáu cuûa bieåu thöùc d1 d2 cuõng chính laø daáu cuûa pi  
vaøo phöông trình treân ta ñöôïc : pi 2Dyxi 2Dxyi c , vôùi  
.
Hay noùi moät caùch khaùc, neáu taïi böôùc thöù i ta xaùc ñònh ñöôïc daáu cuûa pi thì xem nhö ta xaùc  
ñònh ñöôïc ñieåm caàn choïn ôû böôùc (i+1). Vaán ñeà coøn laïi laø laøm theá naøo ñeå tính ñöôïc pi taïi  
moãi böôùc thaät nhanh.  
Ta coù :  
pi1 pi   
pi1 pi 2Dy  
pi1 pi 2Dy 2Dx  
2Dyxi1 2Dxyi1 c  
xi1 xi 2Dx  
yi1 yi  
2Dyxi 2Dxyi c  
yi1 yi  
, do xi1 xi 1  
Töø ñaây ta coù theå suy ra caùch tính pi1 töø pi nhö sau :  
Neáu pi 0 thì pi1 pi 2Dy do ta choïn yi1 yi  
.
Ngöôïc laïi, neáu pi 0, thì pi1 pi 2Dy 2Dx, do ta choïn yi1 yi 1 .  
Giaù trò p0 ñöôïc tính töø ñieåm veõ ñaàu tieân  
p0 2Dyx0 2Dxy0 c 2Dyx0 2Dxy0 2Dy 2b1 Dx  
x0 , y0  
theo coâng thöùc  
:
.
Dy  
Do  
x0 , y0  
laø ñieåm nguyeân thuoäc veà ñoaïn thaúng neân ta coù y0 mx0 b   
x0 b  
Dx  
Theá vaøo phöông trình treân ta suy ra : p0 2Dy Dx.  
Löu ñoà thuaät toaùn Bresenham  
Begin  
p=2Dy-Dx;  
Const1=2Dy;  
Const2=2(Dy-Dx);  
x=x1;  
y=y1;  
putpixel(x, y, c);  
No  
x<x2  
Yes  
No  
p<0  
Yes  
p=p+Const1;  
p=p+Const2;  
y=y+1  
x=x+1;  
putpixel(x,y,c);  
End  
Caøi ñaët minh hoïa thuaät toaùn Bresenham  
void LineBres (int x1, int y1, int x2, int y2)  
{
int Dx, Dy, p, Const1, Const2;  
int x, y;  
Dx  
Dy  
p
= x2 - x1;  
= y2 - y1;  
= 2*Dy - Dx; // Dy <<1 - Dx  
Const1 = 2*Dy; // Dy <<1  
Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1  
x = x1;  
y = y1;  
putpixel(x, y, Color);  
for(i=x1; i<x2; i++)  
{
if (p<0)  
p += Const1;  
else  
{
p += Const2;  
y++;  
}
x++;  
putpixel(x, y, Color);  
}
} // LineBres  
Nhaän xeùt  
Thuaät toaùn Bresenham chæ laøm vieäc treân soá nguyeân vaø caùc thao taùc treân soá  
nguyeân chæ laø pheùp coäng vaø pheùp dòch bit (pheùp nhaân 2) ñieàu naøy laø moät  
caûi tieán laøm taêng toác ñoä ñaùng keå so vôùi thuaät toaùn DDA. YÙ töôûng chính cuûa  
thuaät toaùn naèm ôû choã xeùt daáu pi ñeå quyeát ñònh ñieåm keá tieáp, vaø söû duïng  
coâng thöùc truy hoài pi1 pi ñeå tính pi baèng caùc pheùp toaùn ñôn giaûn treân  
soá nguyeân.  
Thuaät toaùn naøy cho keát quaû töông töï nhö thuaät toaùn DDA.  
2.1.3. Thuaät toaùn MidPoint  
Thuaät toaùn MidPoint ñöa ra caùch choïn yi1 laø yi hay yi 1 baèng caùch so saùnh  
ñieåm thöïc Q  
xi 1, y vôùi ñieåm MidPoint laø trung ñieåm cuûa S vaø P. Ta coù :  
Neáu ñieåm Q naèm döôùi ñieåm MidPoint, ta choïn S.  
Ngöôïc laïi neáu ñieåm Q naèm treân ñieåm MidPoint ta choïn P.  
Q(xi+1, y)  
P
yi+1  
yi  
MidPoint  
S
xi  
xi+1  
Hình 2.14 – Minh hoïa thuaät toaùn MidPoint  
Ta coù daïng toång quaùt cuûa phöông trình ñöôøng thaúng :  
Ax By C 0  
vôùi A y2 y1, B    
x2 x1 ,C x2 y1 x1 y2  
Ñaët  
F
x, y  
Ax By C, ta coù nhaän xeùt :  
 0,neáu  
x,y  
naèm phía treân ñöôøng thaúng  
thuoäc veàñöôøng thaúng  
naèm phía döôùi ñöôøng thaúng.  
F
x, y  
0,neáu  
0,neáu  
x,y  
x,y  
Luùc naøy vieäc choïn caùc ñieåm S, P ôû treân ñöôïc ñöa veà vieäc xeùt daáu cuûa  
1
2
pi 2F  
MidPoint  
2F x 1, y   
.
i
i
Neáu pi 0, ñieåm MidPoint naèm phía treân ñoaïn thaúng. Luùc naøy ñieåm thöïc  
Q naèm döôùi ñieåm MidPoint neân ta choïn S, töùc laø yi1 yi  
.
Ngöôïc laïi, neáu pi 0, ñieåm MidPoint naèm phía döôùi ñoaïn thaúng. Luùc naøy  
ñieåm thöïc Q naèm treân ñieåm MidPoint neân ta choïn P, töùc laø yi1 yi 1 .  
Maët khaùc :  
1
2
1
2
pi1 p 2F x 1, yi1  
2F x 1, y   
i
i1  
i
i
1
2
1
2
pi1 p 2 A  
x
i1 1  
B yi1   
C 2 A  
xi 1  
B y   
C  
i
i
pi1 pi 2A 2B  
Vaäy :  
yi1 yi  
2Dy 2Dx  
yi1 yi  
pi1 pi 2Dy, neáu pi 0 do ta choïn yi1 yi  
.
pi1 pi 2Dy 2Dx, neáu pi 0 do ta choïn yi1 yi 1 .  
x0 , y0  
Ta tính giaù trò p0 öùng vôùi ñieåm ban ñaàu  
, vôùi nhaän xeùt raèng  
x0 , y0 laø  
ñieåm thuoäc veà ñoaïn thaúng, töùc laø coù : Ax0 By0 C 0  
1
2
1
2
p 2F x 1, y   
2 A  
x0 1  
B y   
C  
0
0
0
0
p0 2  
Ax0 By0 C 2A B 2A B 2Dy Dx  
Nhaän xeùt raèng thuaät toaùn MidPoint cho keát quaû töông töï nhö thuaät toaùn  
Bresenham.  
2.2. Thuaät toaùn veõ ñöôøng troøn  
Phöông trình ñöôøng troøn coù taâm laø goác toïa ñoä, baùn kính R laø : x2 y2 R2  
Töø phöông trình naøy ta coù theå ñöa veà daïng y   R2 x2 . Ñeå veõ caùc ñöôøng  
troøn coù taâm baát kì, ñôn giaûn chæ caàn tònh tieán caùc ñieåm sau khi veõ  
xong ñöôøng troøn coù taâm laø goác toïa ñoä theo vector tònh tieán  
.
xC , yC  
xC , yC .  
2.2.1. Moät soá caùch tieáp caän veõ ñöôøng troøn  
Do tính ñoái xöùng neân ñeå veõ toaøn boä ñöôøng troøn, ta chæ caàn veõ cung ¼  
ñöôøng troøn sau ñoù laáy ñoái xöùng ñeå xaùc ñònh caùc ñieåm coøn laïi.  
Moät trong nhöõng caùch ñôn giaûn nhaát laø cho x chaïy töø 0 ñeán R, sau ñoù tính y töø coâng  
thöùc treân (chæ laáy giaù trò döông) roài laøm troøn ñeå xaùc ñònh giaù trò nguyeân töông öùng. Caùch  
laøm naøy khoâng hieäu quaû do gaëp phaûi caùc pheùp toaùn nhaân vaø laáy caên laøm haïn cheá toác ñoä,  
ngoaøi ra ñöôøng troøn veõ ra theo caùch naøy coù theå khoâng lieàn neùt (tröø tröôøng hôïp R lôùn) khi  
x gaàn R (do chæ coù moät giaù trò y duy nhaát cho moät giaù trò x). Chuùng ta coù theå khaéc phuïc  
ñieàu naøy baèng caùch ñieàu chænh ñoái töôïng thay ñoåi laø x (roài tính y theo x) hay y (roài tính x  
theo y) tuøy vaøo giaù trò tuyeät ñoái cuûa heä soá goùc ñöôøng troøn laø lôùn hôn hay nhoû hôn 1,  
nhöng caùch laøm naøy ñoøi hoûi theâm caùc pheùp tính toaùn vaø kieåm tra neân laøm cho thuaät toaùn  
phöùc taïp theâm. (Xem hình 2.15)  
Moät caùch tieáp caän khaùc laø veõ caùc ñieåm  
ñeán 900. Caùch naøy seõ khaéc phuïc haïn cheá ñöôøng khoâng lieàn neùt cuûa thuaät  
toaùn treân, tuy nhieân ñieåm haïn cheá chính cuûa thuaät toaùn naøy ñoù laø choïn  
Rcos  
, Rsin  
, vôùi  
chaïy töø 00  
  
böôùc nhaûy cho  
nhö theá naøo cho phuø hôïp khi baùn kính thay ñoåi.  
(0,17)  
(17,0)  
Hình 2.15 – Ñöôøng troøn veõ ra khoâng lieàn neùt theo caùch veõ treân  
2.2.2. Thuaät toaùn MidPoint  
Do tính ñoái xöùng cuûa ñöôøng troøn (C) neân ta chæ caàn veõ cung (C1/8) laø cung 1/8  
ñöôøng troøn, sau ñoù laáy ñoái xöùng. Cung (C1/8) ñöôïc moâ taû nhö sau (cung cuûa  
phaàn toâ xaùm trong hình veõ) :  
2
2
0 x R  
2
R
y R  
2
(-x,y)  
(x,y)  
(-y,x)  
(y,x)  
R
2
(-y,-x)  
(y,-x)  
(-x,-y)  
(x,-y)  
Hình 2.16 – Caùc vò trí ñoái xöùng treân ñöôøng troøn (C) töông öùng vôùi (x,y)  
Nhö vaäy neáu coù (x, y) (C1/8) thì caùc ñieåm : (y, x), (y,-x), (x,-y), (-x,-y), (-y,-x), (-  
y,x), (-x,y) seõ thuoäc (C).  
Choïn ñieåm baét ñaàu ñeå veõ laø ñieåm (0,R). Döïa vaøo hình veõ, neáu  
xi , yi  
laø  
ñieåm nguyeân ñaõ tìm ñöôïc ôû böôùc thöù i, thì ñieåm  
laø söï löïa choïn giöõa S vaø P.  
x
i1, yi1  
ôû böôùc thöù (i+1)  
x
yi1  
xi 1  
i1  
Nhö vaäy :  
yi , yi 1  
Töông töï nhö thuaät toaùn MidPoint veõ ñoaïn thaúng, vieäc quyeát ñònh choïn moät  
trong hai ñieåm S vaø P seõ ñöôïc thöïc hieän thoâng qua vieäc xeùt daáu cuûa moät  
haøm naøo ñoù taïi ñieåm MidPoint laø ñieåm naèm giöõa chuùng.  
Q(xi+1, y)  
S
P
yi  
MidPoint  
yi-1  
xi  
xi+1  
Hình 2.17 – Thuaät toaùn MidPoint veõ ñöôøng troøn  
Ñaët  
F
x, y  
x2 y2 R2 , ta coù :  
 0,neáu  
x,y  
x,y  
x,y  
naèm trong ñöôøng troøn  
naèm treân ñöôøng troøn  
naèm ngoaøi ñöôøng troøn.  
F
x, y  
0,neáu  
0,neáu  
1
2
Xeùt pi F  
MidPoint  
F x 1, y . Ta coù :  
i
i
Neáu pi 0, ñieåm MidPoint naèm trong ñöôøng troøn. Luùc naøy ñieåm thöïc Q  
gaàn S hôn neân ta choïn S, töùc laø yi1 yi  
.
Ngöôïc laïi, neáu pi 0, ñieåm MidPoint naèm ngoaøi ñöôøng troøn. Luùc naøy  
ñieåm thöïc Q gaàn P hôn neân ta choïn P, töùc laø yi1 yi 1.  
Maët khaùc :  
1
2
1
2
pi1 p F x 1, yi1  
F x 1, y   
i i  
i
i1  
2
2
1
2
1
2
p p   
x
1 2  
y  
R2  
x 1 2  
y   
R2  
i1  
i
i1  
i1  
i
i
2
2
1
2
1
p p   
x 2 2  
y  
R2  
x 1 2  
y   
R2  
i1  
i
i
i1  
i
i
2
pi1 p 2x 3  
Vaäy :  
yi21 yi2
  
yi1 yi  
i
i
pi1 pi 2xi 3, neáu pi 0 do ta choïn yi1 yi  
pi1 pi 2xi 2yi 5, neáu pi 0 do ta choïn yi1 yi 1.  
x0 , y0 0, R  
.
Ta tính giaù trò p0 öùng vôùi ñieåm ban ñaàu  
.
1
2
1
2
5
4
p F x 1, y   
F 1, R   
R  
0
0
0
Löu ñoà thuaät toaùn MidPoint veõ ñöôøng troøn  
Begin  
p=5/4-R;  
x=0;  
y=R;  
Put8Pixel(x, y, c);  
No  
x<y  
Yes  
No  
p<0  
Yes  
p=p+2*x+3;  
p=p+2(x-y)+5;  
y=y-1  
x=x+1;  
Put8Pixel(x,y,c);  
End  
Tải về để xem bản đầy đủ
doc 40 trang Thùy Anh 27/04/2022 9080
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Đồ họa máy tính - Chương 2, Phần 1: Các đối tượng đồ họa cơ sở", để 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:

  • docgiao_trinh_do_hoa_may_tinh_chuong_2_cac_doi_tuong_do_hoa_co.doc
  • htmChuong2.htm