Upload
charles-vargas
View
49
Download
0
Embed Size (px)
DESCRIPTION
Moät soá giaûi thuaät ñoà hoïa cô baûn. Scan conversion. Scan conversion : quaù trình bieåu dieãn moät ñ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. - PowerPoint PPT Presentation
Citation preview
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
1
Moät soá giaûi thuaät ñoà hoïa cô baûn
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
2
Scan conversion
ª Scan conversion: quaù trình bieåu dieãn moät ñ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()
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
3
Frame buffer vaø thieát bò hieån thò
ª Moâ hình chöùc naêng cuûa frame buffer
laøm töôi aûnh
C
R
x
y
B
Maøn hình
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
4
Truy caäp vaøo frame buffer
const {moät ví duï}MaxColumn= 639; {= C - 1}MaxRow = 479; {= R - 1}MaxColor = 255; {= soá caùc maøu - 1}
typecol = 0..MaxColumn;row = 0..MaxRow;color = 0..MaxColor;
procedure SetPixel(c : col, r : row, value : color); {load frame buffer}function GetPixel(c : col, r : row) : color; {read frame buffer}
0 MaxColumn1 2
01
2
ª Moâ hình laäp trình– Moâ hình cho frame buffer– Caùc thao taùc leân frame buffer.
MaxRow
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
5
ª 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:– Ñoä doác: , vôùi
ª 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
Bieåu dieãn ñoaïn thaúng trong frame buffer
y = m(x xa) + ya
x
ym
y = yb ya
x = xb xa
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
6
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*
xi 1 xi
yi 1
Si
Ti
Ñoaïn thaúng lyù töôûng
y*
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
7
Quy taéc choïn pixel xaáp xæ toát ñoaïn thaúng thöïc
ª Quy taéc choïn pixel
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óaei = x(e(Ti) e(Si)) = 2(y)(xi xa) + 2(x)(ya yi 1) x (*)
Choïn Ti neáu vaø chæ neáu e(Ti) e(Si) < 0
Neáu ei < 0 thì choïn yi = yi1 , 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!
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
8
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
xi 1 xi
yi 1
Si
Ti
Ñoaïn thaúng lyù töôûng
e(Ti) = y* yi 1
e(Si) = (yi 1 + 1) y*
y*
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
9
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
xi 1 xi
yi 1
Si
Ti
xi 1 xi
yi 1
Si
Ti
Nhaéc laïi: e(Ti) = y* yi 1
e(Si) = (yi 1 + 1) y*
ñoaïn thaúng lyù töôûngñi qua phía treân Si vaø Ti
ñoaïn thaúng lyù töôûngñi qua phía döôùi Si vaø Ti
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
10
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 + 2y
– neáu khoâng thì choïn yi = yi 1 + 1
ei + 1 = ei + 2y 2x
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
11
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 < ñoä doá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}
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
12
Giaûi thuaät cuûa Bresenham (tieáp)
beginy := 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}
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
13
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
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
14
Bieåu dieãn voøng troøn trong frame buffer
ª 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á
ª Giaûi quyeát– 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).
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
15
Ñ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
moät cung laø 1/8 voøng troøn, ôû ñaây choïn cung AB. (x, y)
(y, x)
(y, x)
(x, y) (x, y)
(y, x)
(y, x)
(x, y)
x
y
AB
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
16
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)ª Ñònh nghóa
Si = (xi 1 + 1, yi 1)
Ti = (xi 1 + 1, yi 1 1)ª Ñònh nghóa sai soá
e(P) = (x2 + y2) R2
ª Ñònh nghóa haøm soá quyeát ñònh di = e(Si) + e(Ti) xi 1 xi
yi 1
Pi 1 Si
Ti
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
17
Qui taéc choïn pixel xaáp xæ toát cung voøng troøn
xi 1 xi
yi 1
Pi 1 Si
Ti
Neáu di < 0 thì choïn Si coøn neáu khoâng thì choïn Ti
Caàn kieåm tra tính ñuùng ñaén cuûa quy taéc treân!
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
18
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) > 0e(Ti) < 0
e(Si) > 0e(Ti) > 0
e(Si) < 0e(Ti) < 0
OK! OK, vì di < 0 Si gaàn ñöôøng troøn hôn
Khoâng theå!
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
19
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) > 0e(Ti) < 0
e(Si) > 0e(Ti) > 0
e(Si) < 0e(Ti) < 0
Khoâng theå! OK!OK, vì di 0 Ti gaàn ñöôøng troøn hôn
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
20
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 1
2) 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
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
21
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;
beginx := 0; y := Rad;d := 3 - 2*Rad;
3.9.2004 Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn
22
Giaûi thuaät cuûa Michener (tieáp)
while x <= y do beginSetPixel(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
endend; {MichCirc}