22
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

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

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

Page 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

1

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

Page 2: 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()

Page 3: 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

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

Page 4: 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

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

Page 5: 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

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

Page 6: 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

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*

Page 7: 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

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!

Page 8: 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

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*

Page 9: 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

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

Page 10: 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

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

Page 11: 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

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}

Page 12: 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

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}

Page 13: 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

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

Page 14: 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

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).

Page 15: 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

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

Page 16: 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

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

Page 17: 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

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!

Page 18: 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

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å!

Page 19: 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

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

Page 20: 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

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

Page 21: 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

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;

Page 22: 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

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}