1 / 22

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

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.

Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Moät soá giaûi thuaät ñoà hoïa cô baûn 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() 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 B C y R laøm töôi aûnh x Maøn hình Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn

  4. Truy caäp vaøo 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 {moät ví duï} MaxColumn = 639; {= C - 1} MaxRow = 479; {= R - 1} MaxColor = 255;{= soá caùc maøu - 1} type col = 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} MaxRow 2 1 0 0 1 2 MaxColumn Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn

  5. Bieåu dieãn ñoaïn thaúng trong 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) • 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 y = m(x-xa) + ya Dy = yb-ya Dx = xb-xa 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* Ñoaïn thaúng lyù töôûng Si y* yi- 1 Ti xi- 1 xi 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 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 = Dx(e(Ti) - e(Si)) = 2(Dy)(xi-xa) + 2(Dx)(ya-yi - 1) -Dx (*) 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! 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 Ñ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* 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 ñ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 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* 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(Dy)(xi + 1-xa) + 2(Dx)(ya-yi ) -Dx • Töø treân, ei + 1 = ei + 2(Dy)(xi + 1-xi) - 2(Dx)(yi-yi- 1) • Theo quy taéc choïn pixel, • neáu ei < 0 thì choïn yi =yi- 1 • ei + 1 = ei + 2Dy • neáu khoâng thì choïn yi =yi- 1 + 1 • ei + 1 = ei + 2Dy- 2Dx 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(Dy) -Dx (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} 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) 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; elsebegin y := y + 1; e := e + e_inc end; end; end; {Bresenham} 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 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). 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. y (-x, y) (x, y) A B (y, x) (-y, x) x (-y, -x) (y, -x) (-x, -y) (x, -y) 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) Pi- 1 Si yi- 1 Ti xi- 1 xi 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 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! 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) > 0 e(Ti) > 0 e(Si) > 0 e(Ti) < 0 e(Si) < 0 e(Ti) < 0 Khoâng theå! OK, vì di < 0  Si gaàn ñöôøng troøn hôn OK! 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) > 0 e(Ti) < 0 e(Si) > 0 e(Ti) > 0 e(Si) < 0 e(Ti) < 0 OK, vì di0  Ti gaàn ñöôøng troøn hôn Khoâng theå! OK! 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- 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 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; begin x := 0; y := Rad; d := 3 - 2*Rad; 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 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} elsebegin d := d + 4*(x - y) + 10; y := y - 1 end; x := x + 1 end end; {MichCirc} Chöông 2: Moät soá giaûi thuaät ñoà hoïa cô baûn

More Related