You are on page 1of 11

Moät soá giaûi thuaät ñoà hoïa cô baûn

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 1


cô baûn

Scan conversion

ª Scan conversion: quaù trình bieåu dieãn ñoái töôïng hình hoïc (ñoaïn thaúng,
voøng troøn,...) trong boä ñeäm aûnh ñôn (frame buffer) cuûa heä thoáng ñoà
hoïa queùt raster.
ª vaän haønh (drive) the frame buffer thoâng qua caùc thuû tuïc
° SetPixel( )

° GetPixel( )

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 2


cô baûn
Boä ñeäm aûnh ñôn vaø thieát bò hieån thò

ª Moâ hình frame buffer

C B

y R

laøm töôi aûnh

x Maøn hình

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 3


cô baûn

Truy caäp vaøo (bieåu dieãn cuûa) frame buffer

ª Moâ hình laäp trình


– Moâ hình cho frame buffer
– Caùc thao taùc leân frame buffer.

const
MaxRow
MaxColumn = 639; {= C - 1}
MaxRow = 479; {= R - 1}
MaxColor = 255; {= soá caùc maøu - 1} 2
type 1
col = 0..MaxColumn; 0
row = 0..MaxRow; 0 1 2 MaxColumn

color = 0..MaxColor;
procedure SetPixel(c : col, r : row, value : color); {load frame buffer}
function GetPixel(c : col, r : row) : color; {read frame buffer}

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 4


cô baûn
Bieåu dieãn ñoaïn thaúng trong boä ñeäm aûnh ñôn

ª Cho ñoaïn thaúng noái hai ñieåm (xa , ya) vaø (xb , yb),
° caùc toïa ñoä ñeàu laø soá nguyeân (toïa ñoä trong frame buffer)

ª Bieåu dieãn töôøng minh cuûa ñöôøng thaúng: y = m(x − xa) + ya


∆y
° Heä soá goùc: m= , vôùi
∆x
∆y = yb − ya
∆x = xb − xa

ª Baøi toaùn: Xaùc ñònh caùc pixel bieåu dieãn ñoaïn thaúng “toát” nhaát
° tuøy thuoäc vaøo caùch ñònh nghóa sai soá

ª Wlog (without loss of generality), xa < xb vaø 0 < m < 1

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 5


cô baûn

Sai soá khi choïn pixel


ª Sinh caùc pixel baèng phöông phaùp taêng daàn
ª Ñònh nghóa sai soá e(Ti) = y* − yi − 1
e(Si) = (yi − 1 + 1) − y*

Ñoaïn thaúng lyù töôûngï

Si

y*
yi − 1
Ti

xi − 1 xi
6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 6
cô baûn
Quy taéc choïn pixel xaáp xæ toát ñoaïn thaúng thöïc
ª Quy taéc choïn pixel

Choïn Ti neáu vaø chæ neáu e(Ti) − e(Si) < 0

Tính e(Ti) − e(Si) = 2m(xi − xa) + 2(ya − yi − 1) − 1

Töø treân, ñeå chæ tính vôùi soá nguyeân, ñònh nghóa
ei = ∆x⋅(e(Ti) − e(Si))
= 2(∆y)(xi − xa) + 2(∆x)(ya − yi − 1) − ∆x (*)

Neáu ei < 0 thì choïn yi = yi − 1 , neáu khoâng thì choïn yi = yi − 1 + 1

Caàn kieåm tra tính ñuùng ñaén cuûa quy taéc treân!

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 7


cô baûn

Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel

ª Tröôøng hôïp ñoaïn thaúng lyù töôûng ñi qua giöõa Si vaø Ti

Ñoaïn thaúng lyù töôûng

Si

y*
yi − 1
Ti

xi − 1 xi
e(Ti) = y* − yi − 1
e(Si) = (yi − 1 + 1) − y*

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 8


cô baûn
Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel (tieáp)

ª Caùc tröôøng hôïp coøn laïi


ñoaïn thaúng lyù töôûng ñoaïn thaúng lyù töôûng
ñi qua phía treân Si vaø Ti ñi qua phía döôùi Si vaø Ti

Si
Si Ti
yi − 1 yi − 1
Ti
xi − 1 xi xi − 1 xi

Nhaéc laïi: e(Ti) = y* − yi − 1


e(Si) = (yi − 1 + 1) − y*

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 9


cô baûn

Tính sai soá moät caùch höõu hieäu

ª Töø (*) coù ei + 1 = 2(∆y)(xi + 1 − xa) + 2(∆x)(ya − yi ) − ∆x


Töø treân, ei + 1 = ei + 2(∆y)(xi + 1 − xi) − 2(∆x)(yi − yi − 1 )
Theo quy taéc choïn pixel,
° neáu ei < 0 thì choïn yi = yi − 1

ei + 1 = ei + 2∆y
° neáu khoâng thì choïn yi = yi − 1 + 1

ei + 1 = ei + 2∆y − 2∆x

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 10


cô baûn
Giaûi thuaät cuûa Bresenham

ª Bieåu dieãn ñoaïn thaúng trong frame buffer


– Giaûi thuaät baét ñaàu nhö theá naøo?
ª x0 = xa, y0 = ya

ª Töø (*) coù e1 = 2(∆y) − ∆x (duøng x1 − xa = 1)

procedure Bresenham(xa, xb : col; ya, yb : row; col_val : color);


{veõ ñoaïn thaúng coù maøu laø col_val töø (xa, ya) ñeán (ya, yb)}
{wlog, xa < xb vaø 0 < heä soá goùc cuûa ñoaïn thaúng < 1}
var
x : col;
y : row;
dx, dy,
e_inc, {thay ñoåi cuûa sai soá khi y taêng}
e_noinc, {thay ñoåi cuûa sai soá khi y khoâng taêng}
e : integer; {sai soá hieän thôøi}
6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 11
cô baûn

Giaûi thuaät cuûa Bresenham (tieáp)

begin
y := ya;
dx := xb - xa;
dy := yb - ya;
e_noinc := dy + dy;
e := e_noinc - dx;
e_inc := e - dx;
for x := xa to xb do {voøng laëp chính}
begin
SetPixel(x, y, col_val);
if e < 0 then e := e + e_noinc;
else begin
y := y + 1;
e := e + e_inc
end;
end;
end; {Bresenham}
6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 12
cô baûn
Caùc tröôøng hôïp khaùc

Giaûi thuaät Bresenham giaû söû xa > xb vaø 0 < m < 1. Giaûi quyeát caùc
tröôøng hôïp coøn laïi:
ª xa > xb
ª m>1
ª Ñoä doác aâm: −1 < m < 0
ª Ñoaïn thaúng ñöùng vaø ñoaïn thaúng naèm ngang

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 13


cô baûn

Bieåu dieãn voøng troøn trong boä ñeäm aûnh ñôn

ª Bieåu dieãn voøng troøn coù taâm taïi (0, 0) vaø baùn kính laø soá nguyeân R
ª Baøi toaùn: Xaùc ñònh caùc pixel bieåu dieãn voøng troøn “toát” nhaát
° tuøy thuoäc vaøo caùch ñònh nghóa sai soá

ª Do ñoái xöùng, chæ caàn khaûo saùt caùch veõ khi 0 ≤ x sao cho y(x) ≥ x töùc
laø cung AB.
ª Sinh caùc pixel baèng phöông phaùp taêng daàn (incremental)

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 14


cô baûn
Ñoái xöùng treân voøng troøn

ª Giaûm phí toån tính toaùn baèng caùch duøng pheùp ñoái xöùng treân voøng troøn
– Chæ caàn xaùc ñònh caùc pixel töông öùng vôùi cung 1/8 voøng troøn AB.
y

(−x, y) (x, y)
A
B
(−y, x) (y, x)

(−y, −x) (y, −x)

(−x, −y) (x, −y)

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 15


cô baûn

Sai soá khi choïn pixel

ª Giaû söû coù pixel toát nhaát taïi böôùc thöù i − 1 laø Pi − 1 = (xi − 1, yi − 1)
Si = (xi − 1 + 1, yi − 1)
Ti = (xi − 1 + 1, yi − 1 − 1)
ª Ñònh nghóa sai soá
e(P) = (x2 + y2) − R2 Pi − 1 Si
yi − 1
ª Ñònh nghóa haøm soá quyeát ñònh
Ti
di = e(Si) + e(Ti)

xi − 1 xi

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 16


cô baûn
Qui taéc choïn pixel xaáp xæ toát cung voøng troøn

Neáu di < 0 thì choïn Si coøn neáu khoâng thì choïn Ti

Pi − 1 Si
yi − 1
Ti

xi − 1 xi

Caàn kieåm tra tính ñuùng ñaén cuûa quy taéc treân!

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 17


cô baûn

Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel

ª Nhaéc laïi: di = e(Si) + e(Ti)


ª Tröôøng hôïp: di < 0

Si Si Si

Ti
Ti Ti

e(Si) < 0 e(Si) > 0 e(Si) > 0


e(Ti) < 0 e(Ti) < 0 e(Ti) > 0
OK! OK, vì di < 0 Khoâng theå!
⇒ Si gaàn ñöôøng troøn hôn

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 18


cô baûn
Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel (tieáp)

ª Nhaéc laïi: di = e(Si) + e(Ti)


ª Tröôøng hôïp: di ≥ 0

Si Si Si
Ti
Ti Ti

e(Si) < 0 e(Si) > 0 e(Si) > 0


e(Ti) < 0 e(Ti) < 0 e(Ti) > 0
Khoâng theå! OK, vì di ≥ 0 OK!
⇒ Ti gaàn ñöôøng troøn hôn

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 19


cô baûn

Tính haøm soá quyeát ñònh moät caùch höõu hieäu

ª Nhaéc laïi: e(P) = (x2 + y2) − R2


ª Coù theå chöùng minh ñöôïc (baøi taäp):
di + 1 = di + 4 xi − 1 + 6 + 2(yi2 − yi − 12) − 2(yi − yi − 1)
Theo quy taéc choïn pixel
° neáu di < 0 thì ta coù yi = yi − 1 , do ñoù

di + 1 = di + 4 xi − 1 + 6
° neáu khoâng thì yi = yi − 1 − 1, do ñoù

di + 1 = di + 4(xi − 1 − yi − 1) + 10
ª Giaûi thuaät baét ñaàu nhö theá naøo?
x0 = 0, y0 = R
do ñoù S1 = (1, R) vaø T1 = (1, R − 1), vaäy d1 = 3 − 2R

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 20


cô baûn
Giaûi thuaät cuûa Michener

ª Bieåu dieãn voøng troøn trong frame buffer

procedure MichCirc(xc : col; yc : row; Rad : integer; value : color);


{Veõ voøng troøn coù taâm (xc, yc), baùn kính Rad, vaø maøu value}
var
x : col;
y : row;
d : integer;
begin
x := 0; y := Rad;
d := 3 - 2*Rad;

6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 21


cô baûn

Giaûi thuaät cuûa Michener (tieáp)


while x <= y do begin
SetPixel(xc + x, yc + y, value); {draw 8 points }
SetPixel(xc - x, yc + y, value); {based on (x, y)}
SetPixel(xc + x, yc - y, value);
SetPixel(xc - x, yc - y, value);
SetPixel(xc + y, yc + x, value);
SetPixel(xc - y, yc + x, value);
SetPixel(xc + y, yc - x, value);
SetPixel(xc - y, yc - x, value);
if d < 0 then d := d + 4*x + 6 {update error term}
else begin
d := d + 4*(x - y) + 10;
y := y - 1
end;
x := x + 1
end
end; {MichCirc}
6.9.2003 Chöông 2: Moät soá giaûi thuaät ñoà hoïa 22
cô baûn

You might also like