Professional Documents
Culture Documents
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( )
C B
y R
x Maøn hình
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}
ª 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)
ª 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á
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
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 (*)
Caàn kieåm tra tính ñuùng ñaén cuûa quy taéc treân!
Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel
Si
y*
yi − 1
Ti
xi − 1 xi
e(Ti) = y* − yi − 1
e(Si) = (yi − 1 + 1) − y*
Si
Si Ti
yi − 1 yi − 1
Ti
xi − 1 xi xi − 1 xi
ei + 1 = ei + 2∆y
° neáu khoâng thì choïn yi = yi − 1 + 1
ei + 1 = ei + 2∆y − 2∆x
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
ª 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)
ª 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)
ª 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
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!
Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel
Si Si Si
Ti
Ti Ti
Si Si Si
Ti
Ti Ti
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