You are on page 1of 31

Area Filling T mu

Vng t
Vng c xc nh bi im nh pixel-defined region Vng xc nh bi a gic polygonal region

pixel-defined region

polygonal region

Pixel-defined region
Vng c nh ngha bi mu ca pixel, chia lm 3 phn:
Vng trong interior Vng ngoi exterior Bin (lin tc) - boundary

exterior

interior
boundary

Lin thng 4 v lin thng 8


4-connected : 2 pixel lin thng vi nhau nu chng k nhau theo chiu ngang hay chiu dc 8-connected : 2 pixel lin thng vi nhau nu chng k nhau theo chiu ngang, hay chiu dc, hay ng cho

Cch thc nh ngha pixel-defined region


Interior defined
Tt c cc pixel trong vng c cng mt mu, gi l inside-color Cc pixel trn bin khng c mu ny C th c l trong vng

Boundary defined
Cc pixel thuc bin c cng mu boundary-color Cc pixel trong vng khng c mu ny Nu mt s pixel trong vng c mu boundary-color th vng s cha l

inside color

Interior-defined

Boundary-defined
5

Polygonal Region
nh ngha bng a gic: xc nh cc nh cc nh pi = (xi,yi) Cc loi a gic:
Convex Concave, simple Nonsimple

polygonal region

convex

concave

nonsimple
6

Recursive Flood-Fill Algorithm (interior-defined, 4-connected region)


i mu ca tt c cc interior-pixel thnh mu t fill color. Qu trnh t mu bt u t mt im (seed pixel) thuc pha trong vng t v lan truyn khp vng t => Flood-Fill

seed pixel
inside color fill color

Interior-defined

Recursive Flood-Fill

Recursive Flood-Fill Algorithm (cont)


Thut ton
Nu pixel ti (x,y) thuc vng trong mu ca pixel l inside-color th
i mu ca n thnh fill-color p dng qu trnh trn cho 4 im ln cn n (4-connected).

Ngc li, khng lm g.

(4,2) 6 5 4 3 2 1 0

(3,2)

(2,2) (4,2)

(1,2) (3,2)

(3,3)
S

(2,3) (2,1)

0 12 3 4 56
8

Recursive Flood-Fill Program


void FloodFill(int x, int y, int inside_color, int fill_color) { if (getpixel(x,y) == inside_color) { putpixel(x,y,fill_color); FloodFill(x-1,y, inside_color, fill_color); FloodFill(x+1,y, inside_color, fill_color); FloodFill(x,y+1, inside_color, fill_color); FloodFill(x,y-1, inside_color, fill_color); } }

Recursive Flood-Fill (cont) (boundary-defined, 4-connected region)


Bi tp
M t thut ton Ci t

Boundary-defined

10

Ci tin
Run - ng chy
Dy cc pixel lin tip theo hng ngang nm trong vng t Mi run c t tn bng pixel cc tri (hay phi) ca run

b a

s d e

11

Thut ton ci tin Dng stack


Cho vo stack run cha seed pixel while stack not empty { begin = pop(); T run bt u t begin Cho vo stack cc run bn trn Cho vo stack cc run bn di } Stack:

Stack:

b c d

b c d Stack:

b c

c
e

e
12

Polygonal Region Scanline Algorithm


Scanline
ng thng nm ngang S giao im ca scanline v a gic l s chn (tng qut) Cc pixel nm gia cc cp giao im l-chn nm trong a gic

out

1
in

in

2
in

out

out

out

out

13

Thut ton Scanline tng qut


for each scanline {
Tm giao im ca scanline vi cc cnh ca a gic Sp xp cc giao im theo th t tng dn theo x T cc pixel nm gia cc cp giao im lin tip nhau

9 8 7 6 5 4 3 2 1 0

Ti dng scanline y = 3:
Cc honh giao im sau khi lm trn l 1, 2, 7, 9 Do , 2 run [1,2] v [7,9] c t

14

0 12 3 4 56 7 89

Demo

15

Cc trng hp c bit
Cc cnh nm ngang khng xt n v chng s c t khi xt 2 cnh k vi n Khi scanline i qua nh ca a gic, n s giao vi 2 cnh. Trong trng hp nh khng l cc tr, s giao im ca scanline vi a gic l s l.

out

2 giao im in in

in

2 giao im => sai

16

Cc trng hp c bit (cont)


y-extrema vertices:
minimum maximum

y-monotonic:
minimum vi 1 cnh maximum vi cnh cn li

Cnh nm ngang
17

X l
Trc qu trnh t mu, kim tra cc nh.
Nu nh khng phi l cc tr, xt cnh pha di.
Gim tung trn y_upper xung mt n v

Danh sch nh a gic trc khi ci tin:

9 8 7 6 5 4 3 2 1 0
0 12 3 4 56 7 89

(6,8), (9,5), (9,1), (5,5), (1,2), (2,7), (4,8)

Sau khi ci tin, danh sch cc cnh ca a gic nh sau mt cnh b xa v 2 cnh c rt gn:
e1 = (6,8) to (9,5) e2 = (9,4) to (9,1) e3 = (9,1) to (5,5) e4 = (5,5) to 1,2) e5 = (1,2) to (2,6) e6 = (2,7) to (4,8)
18

Hn ch ca thut ton
xc nh giao im ca ng scanline v cnh ca a gic, chng ta phi duyt tt c cc cnh ca a gic. Khi s cnh ca a gic kh ln, chng ta phi mt rt nhiu thi gian duyt ht cc cnh, trong khi s cnh m ng scanline ct th rt t.

S giao im l 2, trong khi s cnh l 12

19

Ci tin tc thut ton


Nhn xt:
Khi dng qut tng mt n v theo y th honh giao im thay i theo 1/m
-> Cng thc tnh giao im n gin

Gi s rng 1 cnh ca a gic c tung b chn bi [y_lower, y_upper] th khi tung ca dng qut khng thuc on ny, chng khng ct cnh
-> Gim s lng tnh ton, khng nht thit phi tnh giao im vi tt c cc cnh

1/m
y_upper

y_lower

20

Active Edge List (AEL)


gia tng tc tnh ton, chng ta xy dng v duy tr mt danh sch xc nh ta giao im ca a gic v ng scanline mi bc (AEL). Danh sch ny cho php tnh ton giao im mt cch nhanh chng bng cch lu cc thng tin cc cnh m ng scanline ct. thun li tnh ton, mt cnh c cc thng tin sau:
Tung cao nht y_upper ca cnh (sau khi rt gn). Honh giao im x_intersection vi ng scanline hin hnh. Nghch o h s gc 1/m : reciprocal_slope. Ch , 1/m c tnh trc khi cnh c rt gn, do bo m tnh chnh xc ca giao im.

y_upper

x_int

recip_slope

21

V d v AEL
9 8 7 6 5 4 3 2 1 0

e5 e4 e3 e2

0 12 3 4 56 7 89
Ti dng scanline y = 3:

AEL
y_upper

6/5

1/5

7/3

4/3

-1

0
22

x_int

1/m

S dng AEL t mu ti mt dng scanline


Ti dng scanline hin hnh y, AEL lu tr giao im ca scanline v cnh a gic. t mu, chng ta sp xp cc cnh theo chiu tng dn ca honh giao im x_int. Mi cp gi tr ca x_int xc nh mt run, m chng ta c th t mu d dng tmp = AEL; while (tmp != NULL) { x1 = tmp.x_int; tmp = tmp->next; x2 = tmp.x_int; tmp = tmp->next; for(x = x1; x <= x2; x++) putpixel(x,y,color); }

9 8 7 6 5 4 3 2 1 0

e5
e4 e3 e2

0 12 3 4 56 7 89

23

Cp nht AEL khi dng scanline di chuyn


Sau khi t mu ti dng scanline hin hnh y, AEL phi c cp nht ti scanline y+1: 1. Bng cch so snh y v y_upper ca cc cnh trong AEL, ta xc nh dng scanline mi nm pha trn cnh no trong AEL : xa cnh c y vt qu y_upper. 2. Gi tr ca honh giao im thay i theo dng scanline. Khi dng scanline tng ln 1 th x_int thay i l 1/m : cp nht tt c cc cnh vi x_int = x_int + recip_slope

9 8 7 6 5 4 3 2 1 0

e1

y+1 y

e5
e4 e3 e2

0 12 3 4 56 7 89
Ti y : ael = {e5, e4, e3, e1} Ti y+1 : ael = {e5, e1}

24

Cp nht AEL khi dng scanline di chuyn (cont)


Sau khi t mu ti dng scanline hin hnh y, AEL phi c cp nht ti scanline y+1: 3. Khi y+1 bng vi y_lower ca mt cnh th n phi c chn vo AEL (gi tr ca cnh ny s trnh by sau trong Edge Table). 4. Th t ca honh giao im c th o ngc khi 2 cnh giao nhau (a gic t ct) : AEL phi c sp xp li.

9 8 7 6 5 4 3 2 1 0

e1

e5
e4 e3 e2

y+1 y

0 12 3 4 56 7 89
Ti y : ael = {e5, e4, e3, e2} Ti y+1 : ael = {e5, e4, e3, e1}
25

EdgeTable
xc nh cnh no c chn vo AEL, chng ta phi xt tng nh ca a gic. Tuy nhin, cu trc EdgeTable c to ra lu tr thng tin cc cnh trc khi qu trnh t mu xy ra, bo m yu cu cp nht nhanh chng AEL: Mi cnh c xc nh y_upper, recip_slope thng qua nh a gic, v x_int l honh nh di ca cnh. EdgeTable l mt mng cc danh sch cc cnh (nh danh sch AEL). EdgeTable[y] cha danh sch cc cnh c y_lower = y

26

Building EdgeTable

A D C
yA xB xE 1/mBA 1/mED yC xB 1/mBC

yD

J
G

yA

xJ

1/mJA

yJ-1

xI xF

1/mIJ 1/mFG

yG yE-1

xH xF

1/mHG 1/mFE

yG

27

V d EdgeTable
11 10 9 8 7 6 5 4 3 2 1 0

9 8 7 6 5 4 3 2 1 0

e6

e7

e1 e5 e4 e3 e2

e6 e1 e4

-1

e5
6 5 1 9 1/5 -1 5 4

1 9

4/3 0

e3

e2

0 12 3 4 56 7 89
28

Dng EdgeTable cp nht AEL


Sau khi to EdgeTable, AEL d dng c cp nht thng qua cc cnh c sn trong EdgeTable ti dng scanline y: Chn cc cnh ti EdgeTable[y] vo AEL : ngha l dng scanline bt u ct cc cnh c y_lower = y Gi tr ban u ca x_int l honh ca nh di nn chnh l honh giao im ban u.

29

V d
9 8 7 6 5 4 3 2 1 0
AEL

e6

e7 e1

e5
e4 e3 e2

11 10 9 8 7 6 5 4 3 2 1 0
4/3 -1 0 5 8 7 6 5

8 8

2 9

2 -1

e6 e1 e4

e5
6 5 1 9 1/5 -1 5 4

1 9

4/3 0

e3

e2

0 12 3 4 56 7 89
5 6 6/5 7/5 8/5 9/5 9 1 1/5 -1 4 5 8
11/3 7/3 9 1 5 8

-1

4 8

-1 0

30

Thut ton ci tin


Xy dng EdgeTable; AEL = NULL; for( y = y_min; y <= y_max; y++) { Chn tt c cc cnh trong EdgeTable[y] vo AEL; if (AEL != NULL) { Sp xp AEL theo chiu tng dn ca x_int; T mu cc run trong AEL; Xa cc cnh trong AEL c y_upper = y; Cp nht gi tr x_int trong cc cnh ca AEL; } }

31

You might also like