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

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

Upload: charles-vargas

Post on 01-Jan-2016

51 views

Category:

Documents


0 download

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

TRANSCRIPT

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}