Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
SET & AET
Marian Ioan MUNTEANU
Al.I.Cuza University of Iasi, Romaniawebpage: http://www.math.uaic.ro/∼munteanu
15 Noiembrie 2011
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 1 / 18
Cuprins
1 SET (sorted edges table) & AET (active edges table)Exemplu.
2 Alti algoritmi de umplere - algoritmi recursivi
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 2 / 18
Constructia celor doua liste.
• Se creeaza o lista de laturi, fiecare latura cu coordonatele capetelor siinversa pantei (laturile orizontale se exclud).
Ecuatia unei laturi este y = mx + n. Intrucat avem un algoritm descan-line vom avea yi+1 = yi + 1. Prin urmare, la calculul x-uluicorespunzator avem xi+1 = xi + 1/m.• Se sorteaza lista dupa coordonata y a punctelor inferioare (i.e. yminim
corespunzator unei laturi).• Pornind cu ymin, o latura devine ”ACTIVA” daca scan-line ointersecteaza. (Ea ramane activa pana cand scan-line ajunge ın punctulsuperior laturii, punct care este exclus.)• Pixelii de pe scan-line se vor aprinde dupa regula par - impar (grupandlaturile ın perechi si considerand punctele dintre capetele perechilor).• Se mareste y cu 1 si se repeta ultimii doi pasi pana cand scan-line numai intersecteaza nici o latura.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 3 / 18
Constructia celor doua liste.
• Se creeaza o lista de laturi, fiecare latura cu coordonatele capetelor siinversa pantei (laturile orizontale se exclud).
Ecuatia unei laturi este y = mx + n. Intrucat avem un algoritm descan-line vom avea yi+1 = yi + 1. Prin urmare, la calculul x-uluicorespunzator avem xi+1 = xi + 1/m.• Se sorteaza lista dupa coordonata y a punctelor inferioare (i.e. yminim
corespunzator unei laturi).• Pornind cu ymin, o latura devine ”ACTIVA” daca scan-line ointersecteaza. (Ea ramane activa pana cand scan-line ajunge ın punctulsuperior laturii, punct care este exclus.)• Pixelii de pe scan-line se vor aprinde dupa regula par - impar (grupandlaturile ın perechi si considerand punctele dintre capetele perechilor).• Se mareste y cu 1 si se repeta ultimii doi pasi pana cand scan-line numai intersecteaza nici o latura.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 3 / 18
Constructia celor doua liste.
• Se creeaza o lista de laturi, fiecare latura cu coordonatele capetelor siinversa pantei (laturile orizontale se exclud).
Ecuatia unei laturi este y = mx + n. Intrucat avem un algoritm descan-line vom avea yi+1 = yi + 1. Prin urmare, la calculul x-uluicorespunzator avem xi+1 = xi + 1/m.• Se sorteaza lista dupa coordonata y a punctelor inferioare (i.e. yminim
corespunzator unei laturi).• Pornind cu ymin, o latura devine ”ACTIVA” daca scan-line ointersecteaza. (Ea ramane activa pana cand scan-line ajunge ın punctulsuperior laturii, punct care este exclus.)• Pixelii de pe scan-line se vor aprinde dupa regula par - impar (grupandlaturile ın perechi si considerand punctele dintre capetele perechilor).• Se mareste y cu 1 si se repeta ultimii doi pasi pana cand scan-line numai intersecteaza nici o latura.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 3 / 18
Constructia celor doua liste.
• Se creeaza o lista de laturi, fiecare latura cu coordonatele capetelor siinversa pantei (laturile orizontale se exclud).
Ecuatia unei laturi este y = mx + n. Intrucat avem un algoritm descan-line vom avea yi+1 = yi + 1. Prin urmare, la calculul x-uluicorespunzator avem xi+1 = xi + 1/m.• Se sorteaza lista dupa coordonata y a punctelor inferioare (i.e. yminim
corespunzator unei laturi).• Pornind cu ymin, o latura devine ”ACTIVA” daca scan-line ointersecteaza. (Ea ramane activa pana cand scan-line ajunge ın punctulsuperior laturii, punct care este exclus.)• Pixelii de pe scan-line se vor aprinde dupa regula par - impar (grupandlaturile ın perechi si considerand punctele dintre capetele perechilor).• Se mareste y cu 1 si se repeta ultimii doi pasi pana cand scan-line numai intersecteaza nici o latura.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 3 / 18
Constructia celor doua liste.
• Se creeaza o lista de laturi, fiecare latura cu coordonatele capetelor siinversa pantei (laturile orizontale se exclud).
Ecuatia unei laturi este y = mx + n. Intrucat avem un algoritm descan-line vom avea yi+1 = yi + 1. Prin urmare, la calculul x-uluicorespunzator avem xi+1 = xi + 1/m.• Se sorteaza lista dupa coordonata y a punctelor inferioare (i.e. yminim
corespunzator unei laturi).• Pornind cu ymin, o latura devine ”ACTIVA” daca scan-line ointersecteaza. (Ea ramane activa pana cand scan-line ajunge ın punctulsuperior laturii, punct care este exclus.)• Pixelii de pe scan-line se vor aprinde dupa regula par - impar (grupandlaturile ın perechi si considerand punctele dintre capetele perechilor).• Se mareste y cu 1 si se repeta ultimii doi pasi pana cand scan-line numai intersecteaza nici o latura.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 3 / 18
Constructia celor doua liste.
• Se creeaza o lista de laturi, fiecare latura cu coordonatele capetelor siinversa pantei (laturile orizontale se exclud).
Ecuatia unei laturi este y = mx + n. Intrucat avem un algoritm descan-line vom avea yi+1 = yi + 1. Prin urmare, la calculul x-uluicorespunzator avem xi+1 = xi + 1/m.• Se sorteaza lista dupa coordonata y a punctelor inferioare (i.e. yminim
corespunzator unei laturi).• Pornind cu ymin, o latura devine ”ACTIVA” daca scan-line ointersecteaza. (Ea ramane activa pana cand scan-line ajunge ın punctulsuperior laturii, punct care este exclus.)• Pixelii de pe scan-line se vor aprinde dupa regula par - impar (grupandlaturile ın perechi si considerand punctele dintre capetele perechilor).• Se mareste y cu 1 si se repeta ultimii doi pasi pana cand scan-line numai intersecteaza nici o latura.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 3 / 18
ET, SET, AET
ET este un array de pointeri catre o lista ınlantuita asa cum se va vedea ınexemplul descris. Are o singura linie pentru fiecare scan-line si fiecareelement al sirului pointeaza catre lista de laturi cu coordonata y minimaapartinand acelei laturi.
AET este o structura de date care consta ın toate punctele de intersectieale laturilor cu scan-line curenta. Aceste intersectii sunt sortate dupacoordonata x crescator. Aceasta permite punctelor de intersectie sa fiegrupate ın perechi pentru a fi usor folosite ın a face fill pe scan-line. Candse trece la scan-line urmatoare, AET va fi actualizata.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 4 / 18
ET, SET, AET
ET este un array de pointeri catre o lista ınlantuita asa cum se va vedea ınexemplul descris. Are o singura linie pentru fiecare scan-line si fiecareelement al sirului pointeaza catre lista de laturi cu coordonata y minimaapartinand acelei laturi.
AET este o structura de date care consta ın toate punctele de intersectieale laturilor cu scan-line curenta. Aceste intersectii sunt sortate dupacoordonata x crescator. Aceasta permite punctelor de intersectie sa fiegrupate ın perechi pentru a fi usor folosite ın a face fill pe scan-line. Candse trece la scan-line urmatoare, AET va fi actualizata.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 4 / 18
ET, SET, AET
Mai precis, algoritmul consta ın urmatorii pasi:
1. Se grupeaza laturile ıntr-o lista de laturi (ET) si se sorteaza aceastadupa yminim al fiecarei laturi (obtinandu-se SET - sorted edges table).2. Se initializeaza y cu ymin (prima scan-line nevida) si AET cucontinutul din SET pentru ymin. Se goleste SET pentru ymin.3. Se repeta:
√se umplu cu pixeli perechile de x din AET
√se elimina laturile ın plus (care nu mai corespund)ymax = ycurent√y++ si se recalculeaza x de intersectie
√se adauga laturi noi si se face resortare
√se goleste SET pentru ycurent
pana cand AET si SET sunt ambele vide.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 5 / 18
ET, SET, AET
Mai precis, algoritmul consta ın urmatorii pasi:
1. Se grupeaza laturile ıntr-o lista de laturi (ET) si se sorteaza aceastadupa yminim al fiecarei laturi (obtinandu-se SET - sorted edges table).2. Se initializeaza y cu ymin (prima scan-line nevida) si AET cucontinutul din SET pentru ymin. Se goleste SET pentru ymin.3. Se repeta:
√se umplu cu pixeli perechile de x din AET
√se elimina laturile ın plus (care nu mai corespund)ymax = ycurent√y++ si se recalculeaza x de intersectie
√se adauga laturi noi si se face resortare
√se goleste SET pentru ycurent
pana cand AET si SET sunt ambele vide.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 5 / 18
ET, SET, AET
Mai precis, algoritmul consta ın urmatorii pasi:
1. Se grupeaza laturile ıntr-o lista de laturi (ET) si se sorteaza aceastadupa yminim al fiecarei laturi (obtinandu-se SET - sorted edges table).2. Se initializeaza y cu ymin (prima scan-line nevida) si AET cucontinutul din SET pentru ymin. Se goleste SET pentru ymin.3. Se repeta:
√se umplu cu pixeli perechile de x din AET
√se elimina laturile ın plus (care nu mai corespund)ymax = ycurent√y++ si se recalculeaza x de intersectie
√se adauga laturi noi si se face resortare
√se goleste SET pentru ycurent
pana cand AET si SET sunt ambele vide.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 5 / 18
ET, SET, AET
Mai precis, algoritmul consta ın urmatorii pasi:
1. Se grupeaza laturile ıntr-o lista de laturi (ET) si se sorteaza aceastadupa yminim al fiecarei laturi (obtinandu-se SET - sorted edges table).2. Se initializeaza y cu ymin (prima scan-line nevida) si AET cucontinutul din SET pentru ymin. Se goleste SET pentru ymin.3. Se repeta:
√se umplu cu pixeli perechile de x din AET
√se elimina laturile ın plus (care nu mai corespund)ymax = ycurent√y++ si se recalculeaza x de intersectie
√se adauga laturi noi si se face resortare
√se goleste SET pentru ycurent
pana cand AET si SET sunt ambele vide.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 5 / 18
ET, SET, AET
Mai precis, algoritmul consta ın urmatorii pasi:
1. Se grupeaza laturile ıntr-o lista de laturi (ET) si se sorteaza aceastadupa yminim al fiecarei laturi (obtinandu-se SET - sorted edges table).2. Se initializeaza y cu ymin (prima scan-line nevida) si AET cucontinutul din SET pentru ymin. Se goleste SET pentru ymin.3. Se repeta:
√se umplu cu pixeli perechile de x din AET
√se elimina laturile ın plus (care nu mai corespund)ymax = ycurent√y++ si se recalculeaza x de intersectie
√se adauga laturi noi si se face resortare
√se goleste SET pentru ycurent
pana cand AET si SET sunt ambele vide.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 5 / 18
ET, SET, AET
Mai precis, algoritmul consta ın urmatorii pasi:
1. Se grupeaza laturile ıntr-o lista de laturi (ET) si se sorteaza aceastadupa yminim al fiecarei laturi (obtinandu-se SET - sorted edges table).2. Se initializeaza y cu ymin (prima scan-line nevida) si AET cucontinutul din SET pentru ymin. Se goleste SET pentru ymin.3. Se repeta:
√se umplu cu pixeli perechile de x din AET
√se elimina laturile ın plus (care nu mai corespund)ymax = ycurent√y++ si se recalculeaza x de intersectie
√se adauga laturi noi si se face resortare
√se goleste SET pentru ycurent
pana cand AET si SET sunt ambele vide.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 5 / 18
ET, SET, AET
Mai precis, algoritmul consta ın urmatorii pasi:
1. Se grupeaza laturile ıntr-o lista de laturi (ET) si se sorteaza aceastadupa yminim al fiecarei laturi (obtinandu-se SET - sorted edges table).2. Se initializeaza y cu ymin (prima scan-line nevida) si AET cucontinutul din SET pentru ymin. Se goleste SET pentru ymin.3. Se repeta:
√se umplu cu pixeli perechile de x din AET
√se elimina laturile ın plus (care nu mai corespund)ymax = ycurent√y++ si se recalculeaza x de intersectie
√se adauga laturi noi si se face resortare
√se goleste SET pentru ycurent
pana cand AET si SET sunt ambele vide.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 5 / 18
ET, SET, AET
Mai precis, algoritmul consta ın urmatorii pasi:
1. Se grupeaza laturile ıntr-o lista de laturi (ET) si se sorteaza aceastadupa yminim al fiecarei laturi (obtinandu-se SET - sorted edges table).2. Se initializeaza y cu ymin (prima scan-line nevida) si AET cucontinutul din SET pentru ymin. Se goleste SET pentru ymin.3. Se repeta:
√se umplu cu pixeli perechile de x din AET
√se elimina laturile ın plus (care nu mai corespund)ymax = ycurent√y++ si se recalculeaza x de intersectie
√se adauga laturi noi si se face resortare
√se goleste SET pentru ycurent
pana cand AET si SET sunt ambele vide.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 5 / 18
Prezentam ın detaliu urmatorul exemplu:
Consideram poligonul ABCDEFG dat prin A(5, 2), B(10, 2), C (10, 7),D(13, 4), E (17, 13), F (7, 13) si G (2, 4).
Figura: Poligonul ABCDEFG
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 6 / 18
Vom scrie ın continuare laturile pentru a putea crea SET:
x1 y1 x2 y2 1/m Observatii
AB: 5 2 10 2 5 / 0 latura orizontala, nu se ia ın calcul
BC: 10 2 10 7 0 / 5
CD: 10 7 13 4 3 / -3
DE: 13 4 17 13 4 / 9
EF: 17 13 7 13 -10 / 0 latura orizontala, nu se ia ın calcul
FG: 7 13 2 4 -5 / -9
GA: 2 4 5 2 3 / -2
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 7 / 18
Avem
[ymin = min(yA, . . . , yG ) = 2ymax = max(yA, . . . , yG ) = 13.
Prin urmare, ın ET avem laturi doar pentru y = 2 si y = 4, si anume:
y = 2 :
ymax xinit 1 / m
BC: 7 10 0 / 5GA: 4 5 3 / -2
y = 4 :
ymax xinit 1 / m
CD: 7 13 3 / -3DE: 13 13 4 / 9FG: 13 2 -5 / -9 .
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 8 / 18
Acum putem construi SET:
13
12
11
10
9
8
7
6
5
4 •— —- 13 2 5/9 •– —- 7 13 3/-3 •– — 13 13 4/9 x
3
2 •— —- 4 5 3/-2 •– —- 7 10 0/-5 x
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 9 / 18
Vom scrie ın continuare AET pentru fiecare scan-line de la y = 2 lay = 13 si pixelii care se aprind.
y=2 4 5 3/-2 •– —- 7 10 0/-5 x
Pixelii care se aprind: 5, 6, 7, 8, 9.
y=3 4 312 3/-2 •– —- 7 10 0/-5 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9.
y=4 Inserez cele doua laturi de mai sus ın lista corespunzatoare din SETsi elimin latura GA pentru ca are prima componenta 4 (am ajuns ınpunctul G ). Obtin:
13 2 5/9 •- – 7 10 0/-5 •- – 7 13 3/-3 •- – 13 13 4/9 x
Pixelii aprinsi: 2, 3, 4, 5, 6, 7, 8, 9, si 13.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 10 / 18
Vom scrie ın continuare AET pentru fiecare scan-line de la y = 2 lay = 13 si pixelii care se aprind.
y=2 4 5 3/-2 •– —- 7 10 0/-5 x
Pixelii care se aprind: 5, 6, 7, 8, 9.
y=3 4 312 3/-2 •– —- 7 10 0/-5 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9.
y=4 Inserez cele doua laturi de mai sus ın lista corespunzatoare din SETsi elimin latura GA pentru ca are prima componenta 4 (am ajuns ınpunctul G ). Obtin:
13 2 5/9 •- – 7 10 0/-5 •- – 7 13 3/-3 •- – 13 13 4/9 x
Pixelii aprinsi: 2, 3, 4, 5, 6, 7, 8, 9, si 13.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 10 / 18
Vom scrie ın continuare AET pentru fiecare scan-line de la y = 2 lay = 13 si pixelii care se aprind.
y=2 4 5 3/-2 •– —- 7 10 0/-5 x
Pixelii care se aprind: 5, 6, 7, 8, 9.
y=3 4 312 3/-2 •– —- 7 10 0/-5 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9.
y=4 Inserez cele doua laturi de mai sus ın lista corespunzatoare din SETsi elimin latura GA pentru ca are prima componenta 4 (am ajuns ınpunctul G ). Obtin:
13 2 5/9 •- – 7 10 0/-5 •- – 7 13 3/-3 •- – 13 13 4/9 x
Pixelii aprinsi: 2, 3, 4, 5, 6, 7, 8, 9, si 13.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 10 / 18
Vom scrie ın continuare AET pentru fiecare scan-line de la y = 2 lay = 13 si pixelii care se aprind.
y=2 4 5 3/-2 •– —- 7 10 0/-5 x
Pixelii care se aprind: 5, 6, 7, 8, 9.
y=3 4 312 3/-2 •– —- 7 10 0/-5 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9.
y=4 Inserez cele doua laturi de mai sus ın lista corespunzatoare din SETsi elimin latura GA pentru ca are prima componenta 4 (am ajuns ınpunctul G ). Obtin:
13 2 5/9 •- – 7 10 0/-5 •- – 7 13 3/-3 •- – 13 13 4/9 x
Pixelii aprinsi: 2, 3, 4, 5, 6, 7, 8, 9, si 13.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 10 / 18
y=5
13 2 59
5/9 •- - 7 10 0/-5 •- - 7 12 3/-3 •- - 13 13 49
4/9 x
Pixelii care se aprind: 3, 4, 5, 6, 7, 8, 9, 12, 13.
y=6
13 3 19
5/9 •- – 7 10 0/-5 •- – 7 11 3/-3 •- – 13 13 89
4/9 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9, 11, 12, 13.
y=7 Am ajuns ın C , care este maxim pentru doua laturi, BC si CD,(deci nu apartine acestora) si prin urmare elimin laturile.
AET: 13 369 5/9 •- —- 13 143
9 4/9 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14. (Saobservam ca punctul (10, 7) este varf superior pentru un poligon adiacentpoligonului dat care are BC si CD drept laturi, deci nu apartine acestuia,prin urmare apartine poligonului dat.)
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 11 / 18
y=5
13 2 59
5/9 •- - 7 10 0/-5 •- - 7 12 3/-3 •- - 13 13 49
4/9 x
Pixelii care se aprind: 3, 4, 5, 6, 7, 8, 9, 12, 13.
y=6
13 3 19
5/9 •- – 7 10 0/-5 •- – 7 11 3/-3 •- – 13 13 89
4/9 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9, 11, 12, 13.
y=7 Am ajuns ın C , care este maxim pentru doua laturi, BC si CD,(deci nu apartine acestora) si prin urmare elimin laturile.
AET: 13 369 5/9 •- —- 13 143
9 4/9 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14. (Saobservam ca punctul (10, 7) este varf superior pentru un poligon adiacentpoligonului dat care are BC si CD drept laturi, deci nu apartine acestuia,prin urmare apartine poligonului dat.)
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 11 / 18
y=5
13 2 59
5/9 •- - 7 10 0/-5 •- - 7 12 3/-3 •- - 13 13 49
4/9 x
Pixelii care se aprind: 3, 4, 5, 6, 7, 8, 9, 12, 13.
y=6
13 3 19
5/9 •- – 7 10 0/-5 •- – 7 11 3/-3 •- – 13 13 89
4/9 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9, 11, 12, 13.
y=7 Am ajuns ın C , care este maxim pentru doua laturi, BC si CD,(deci nu apartine acestora) si prin urmare elimin laturile.
AET: 13 369 5/9 •- —- 13 143
9 4/9 x
Pixelii care se aprind: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14. (Saobservam ca punctul (10, 7) este varf superior pentru un poligon adiacentpoligonului dat care are BC si CD drept laturi, deci nu apartine acestuia,prin urmare apartine poligonului dat.)
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 11 / 18
y=8 13 4 29 5/9 •- —- 13 14 7
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.
y=9 13 4 79 5/9 •- —- 13 15 2
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=10 13 5 39 5/9 •- —- 13 15 6
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=11 13 5 89 5/9 •- —- 13 16 1
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=12 13 6 49 5/9 •- —- 13 16 5
9 4/9 x
Pixelii care se aprind: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=13 13 7 5/9 •- —- 13 17 4/9 x
Nu se aprinde nici un pixel (latura orizontala superioara). Se elimina cele doualaturi (prima componenta pentru fiecare este 13).
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 12 / 18
y=8 13 4 29 5/9 •- —- 13 14 7
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.
y=9 13 4 79 5/9 •- —- 13 15 2
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=10 13 5 39 5/9 •- —- 13 15 6
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=11 13 5 89 5/9 •- —- 13 16 1
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=12 13 6 49 5/9 •- —- 13 16 5
9 4/9 x
Pixelii care se aprind: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=13 13 7 5/9 •- —- 13 17 4/9 x
Nu se aprinde nici un pixel (latura orizontala superioara). Se elimina cele doualaturi (prima componenta pentru fiecare este 13).
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 12 / 18
y=8 13 4 29 5/9 •- —- 13 14 7
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.
y=9 13 4 79 5/9 •- —- 13 15 2
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=10 13 5 39 5/9 •- —- 13 15 6
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=11 13 5 89 5/9 •- —- 13 16 1
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=12 13 6 49 5/9 •- —- 13 16 5
9 4/9 x
Pixelii care se aprind: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=13 13 7 5/9 •- —- 13 17 4/9 x
Nu se aprinde nici un pixel (latura orizontala superioara). Se elimina cele doualaturi (prima componenta pentru fiecare este 13).
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 12 / 18
y=8 13 4 29 5/9 •- —- 13 14 7
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.
y=9 13 4 79 5/9 •- —- 13 15 2
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=10 13 5 39 5/9 •- —- 13 15 6
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=11 13 5 89 5/9 •- —- 13 16 1
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=12 13 6 49 5/9 •- —- 13 16 5
9 4/9 x
Pixelii care se aprind: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=13 13 7 5/9 •- —- 13 17 4/9 x
Nu se aprinde nici un pixel (latura orizontala superioara). Se elimina cele doualaturi (prima componenta pentru fiecare este 13).
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 12 / 18
y=8 13 4 29 5/9 •- —- 13 14 7
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.
y=9 13 4 79 5/9 •- —- 13 15 2
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=10 13 5 39 5/9 •- —- 13 15 6
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=11 13 5 89 5/9 •- —- 13 16 1
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=12 13 6 49 5/9 •- —- 13 16 5
9 4/9 x
Pixelii care se aprind: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=13 13 7 5/9 •- —- 13 17 4/9 x
Nu se aprinde nici un pixel (latura orizontala superioara). Se elimina cele doualaturi (prima componenta pentru fiecare este 13).
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 12 / 18
y=8 13 4 29 5/9 •- —- 13 14 7
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.
y=9 13 4 79 5/9 •- —- 13 15 2
9 4/9 x
Pixelii care se aprind: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=10 13 5 39 5/9 •- —- 13 15 6
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
y=11 13 5 89 5/9 •- —- 13 16 1
9 4/9 x
Pixelii care se aprind: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=12 13 6 49 5/9 •- —- 13 16 5
9 4/9 x
Pixelii care se aprind: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.
y=13 13 7 5/9 •- —- 13 17 4/9 x
Nu se aprinde nici un pixel (latura orizontala superioara). Se elimina cele doualaturi (prima componenta pentru fiecare este 13).
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 12 / 18
Prin urmare, rezultatul va fi urmatorul:
Figura: Filling utilizand scan-line
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 13 / 18
Algoritmi recursivi
In cazul ın care poligonul este deja trasat se pot utiliza tehnici recursive deumplere. Se presupune ca se cunoaste un punct din interiorulpoligonului. Daca este aprins atunci este pe o latura a poligonului. Seaplica tehnica odd parity pentru depistarea unui punct din interior care nueste pe nici o latura a poligonului. Astfel vom gasi un punct neaprins ıninteriorul poligonului. Se aprinde si se continua algoritmul cu cei patru(sau opt) pixeli vecini. Cand pixelul curent este aprins se renunta la apelulrecursiv. Anumiti pixeli vor fi vizitati ınsa de mai multe ori.
Algoritmii care ”umplu” regiunile definite relativ la interior sunt numitialgoritmi flood-fill, iar cei pentru regiunile definite prin frontiera se numescalgoritmi boundary-fill.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 14 / 18
Algoritmi recursivi
ALGORITM FLOOD FILL
void flood fill 4( /*cu patru pixeli vecini*/int x, int y, /*punctul de start*/int valold, int valnew);
/*valorile culorii pentru interior si pentru inlocuire*/{
if (getpixel(x,y)==valold){
putpixel(x, y, valnew);flood fill 4(x, y-1, valold, valnew);flood fill 4(x, y+1, valold, valnew);flood fill 4(x+1, y, valold, valnew);flood fill 4(x-1, y, valold, valnew);
}}
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 15 / 18
Algoritmi recursivi
ALGORITM BOUNDARY FILL CU 4 PIXELI
void boundary fill 4(int x, int y, int c int,int c bound){
int culoare;culoare = getpixel(x, y);if ((culoare != c bound) && (culoare != c int)){
putpixel(x, y, c int);boundary fill 4 (x+1, y, c int, c bound);boundary fill 4 (x-1, y, c int, c bound);boundary fill 4 (x, y+1, c int, c bound);boundary fill 4 (x, y-1, c int, c bound);} // end if
} // end functie
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 16 / 18
Algoritmi recursivi
ALGORITM BOUNDARY FILL CU 8 PIXELI
void boundary fill 8(int x, int y, int c int,int c bound){ int culoare;
culoare = getpixel(x, y);if ((culoare != c bound) && (culoare != c int)){ putpixel(x, y, c int);
boundary fill 8 (x+1, y+1, c int, c bound);boundary fill 8 (x+1, y, c int, c bound);boundary fill 8 (x+1, y-1, c int, c bound);boundary fill 8 (x, y+1, c int, c bound);boundary fill 8 (x, y-1, c int, c bound);boundary fill 8 (x-1, y+1, c int, c bound);boundary fill 8 (x-1, y, c int, c bound);boundary fill 8 (x-1, y-1, c int, c bound);} // end if } // end functie
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 17 / 18
Observatie. Datorita discretizarii, frontiera nu este ”continua” si potaparea probleme la executie (ın sensul ca ın anumite situatii pot fi alesipixeli exteriori poligonului).
Observatie. Pentru suprafete mari pot interveni probleme de memorie,numarul mare de proceduri neterminate poate necesita o stiva dedimensiuni foarte mare.
Marian Ioan MUNTEANU (UAIC) Filling 15 Noiembrie 2011 18 / 18