Está en la página 1de 53

Cuprins

Notiuni generale

Algoritm scan line de umplere

Filling - Umplerea poligoanelor


Marian Ioan MUNTEANU
Al.I.Cuza University of Iasi, Romania webpage: http://www.math.uaic.ro/munteanu

5 Noiembrie 2009

Cuprins

Notiuni generale

Algoritm scan line de umplere

Cuprins

Notiuni generale

Algoritm scan line de umplere

Cuprins

Notiuni generale

Algoritm scan line de umplere

O caracteristic important a gracii raster fat de graca a a a vectorial este posibilitatea utilizrii elementelor grace pline, adic a a a solide. Procesul se bazeaz pe o carent a sistemului vizual uman i a a s anume: integrarea spatial a ntre obiecte pe care ochiul nu este n stare s le disting din cauza absentei rezolutiei. a a Numrul receptorilor vizuali ind limitat, dac se deseneaz a a a elemente grace distincte dar sucient de aproape (cum ar doi pixeli pe un monitor CRT) - ochiul va putea s le perceap ca pe a a un singur obiect. O multime de pixeli de aceeai culoare, unul lng altul, va s a a aadar vzut, de ctre ochiul uman, ca o singur gur colorat s a a a a a a uniform.

Cuprins

Notiuni generale

Algoritm scan line de umplere

O caracteristic important a gracii raster fat de graca a a a vectorial este posibilitatea utilizrii elementelor grace pline, adic a a a solide. Procesul se bazeaz pe o carent a sistemului vizual uman i a a s anume: integrarea spatial a ntre obiecte pe care ochiul nu este n stare s le disting din cauza absentei rezolutiei. a a Numrul receptorilor vizuali ind limitat, dac se deseneaz a a a elemente grace distincte dar sucient de aproape (cum ar doi pixeli pe un monitor CRT) - ochiul va putea s le perceap ca pe a a un singur obiect. O multime de pixeli de aceeai culoare, unul lng altul, va s a a aadar vzut, de ctre ochiul uman, ca o singur gur colorat s a a a a a a uniform.

Cuprins

Notiuni generale

Algoritm scan line de umplere

O caracteristic important a gracii raster fat de graca a a a vectorial este posibilitatea utilizrii elementelor grace pline, adic a a a solide. Procesul se bazeaz pe o carent a sistemului vizual uman i a a s anume: integrarea spatial a ntre obiecte pe care ochiul nu este n stare s le disting din cauza absentei rezolutiei. a a Numrul receptorilor vizuali ind limitat, dac se deseneaz a a a elemente grace distincte dar sucient de aproape (cum ar doi pixeli pe un monitor CRT) - ochiul va putea s le perceap ca pe a a un singur obiect. O multime de pixeli de aceeai culoare, unul lng altul, va s a a aadar vzut, de ctre ochiul uman, ca o singur gur colorat s a a a a a a uniform.

Cuprins

Notiuni generale

Algoritm scan line de umplere

O caracteristic important a gracii raster fat de graca a a a vectorial este posibilitatea utilizrii elementelor grace pline, adic a a a solide. Procesul se bazeaz pe o carent a sistemului vizual uman i a a s anume: integrarea spatial a ntre obiecte pe care ochiul nu este n stare s le disting din cauza absentei rezolutiei. a a Numrul receptorilor vizuali ind limitat, dac se deseneaz a a a elemente grace distincte dar sucient de aproape (cum ar doi pixeli pe un monitor CRT) - ochiul va putea s le perceap ca pe a a un singur obiect. O multime de pixeli de aceeai culoare, unul lng altul, va s a a aadar vzut, de ctre ochiul uman, ca o singur gur colorat s a a a a a a uniform.

Cuprins

Notiuni generale

Algoritm scan line de umplere

Problem a

Se consider un poligon dat prin intermediul vrfurilor sale. a a S se deseneze pixelii care apartin acestuia. a Va trebui s individualizm secventele orizontale de pixeli continute a a primitiv, algoritm numit de scan-line. Ideea este de a mica o n a s linie orizontal din pozitia cea mai de jos care intersecteaz a a poligonul ctre pozitia cea mai de sus (cu o unitate la ecare pas) a i de a aplica un algoritm de scan-conversion pe linie, de ecare s dat. a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Problem a

Se consider un poligon dat prin intermediul vrfurilor sale. a a S se deseneze pixelii care apartin acestuia. a Va trebui s individualizm secventele orizontale de pixeli continute a a primitiv, algoritm numit de scan-line. Ideea este de a mica o n a s linie orizontal din pozitia cea mai de jos care intersecteaz a a poligonul ctre pozitia cea mai de sus (cu o unitate la ecare pas) a i de a aplica un algoritm de scan-conversion pe linie, de ecare s dat. a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Exemplu

Pentru a desena un dreptunghi plin, cu laturile paralele cu axele de coordonate, vor trebui iluminati pixelii interiori dreptunghiului for y from ymin to ymax of the rectangle (y scan-line) for x from xmin to xmax (pixel cu pixel span) n putpixel (x, y , color )

Cuprins

Notiuni generale

Algoritm scan line de umplere

Exemplu

Pentru a desena un dreptunghi plin, cu laturile paralele cu axele de coordonate, vor trebui iluminati pixelii interiori dreptunghiului for y from ymin to ymax of the rectangle (y scan-line) for x from xmin to xmax (pixel cu pixel span) n putpixel (x, y , color )

Cuprins

Notiuni generale

Algoritm scan line de umplere

Problema general a
Scopul nostru este de a construi un algoritm generic capabil s a fac lling pentru poligoane de orice tip: concave, convexe, cu a laturi care se intersecteaz: a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Regula par impar

Se a un punct interiorul unui poligon? a n dintr-un punct arbitrar P se deseneaz o semidreapt a a se numr intersectiile cu laturile aa punctul P este interior dac numrul de intersectii este impar. a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Regula par impar

Se a un punct interiorul unui poligon? a n dintr-un punct arbitrar P se deseneaz o semidreapt a a se numr intersectiile cu laturile aa punctul P este interior dac numrul de intersectii este impar. a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Regula par impar

Se a un punct interiorul unui poligon? a n dintr-un punct arbitrar P se deseneaz o semidreapt a a se numr intersectiile cu laturile aa punctul P este interior dac numrul de intersectii este impar. a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Regula par impar

Se a un punct interiorul unui poligon? a n dintr-un punct arbitrar P se deseneaz o semidreapt a a se numr intersectiile cu laturile aa punctul P este interior dac numrul de intersectii este impar. a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Regula par impar


Se a un punct interiorul unui poligon? a n dintr-un punct arbitrar P se deseneaz o semidreapt a a se numr intersectiile cu laturile aa punctul P este interior dac numrul de intersectii este impar. a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Exemplu:

Cuprins

Notiuni generale

Algoritm scan line de umplere

Modalitatea cea mai la ndemn de a calcula intersectiile este s a a a se utilizeze scan-conversion pentru liniile corespunztoare ecrei a a laturi a poligonului. Aceast aproximatie poate s produc rezultate incorecte deoarece a a a algoritmul de rasterizare pentru linii nu are notiunea conceptului de auntru (interior) i afar (exterior) i astfel pot selectionati n s n a s pixeli care se ae afara poligonului. n Aceasta este particular de nedorit cnd avem de convertit n a poligoane de culori diferite cu laturi comune: acest manier vor n a a exista pixeli ai unui poligon care invadeaz alt poligon genernd a a astfel un efect vizual incorect.

Cuprins

Notiuni generale

Algoritm scan line de umplere

Modalitatea cea mai la ndemn de a calcula intersectiile este s a a a se utilizeze scan-conversion pentru liniile corespunztoare ecrei a a laturi a poligonului. Aceast aproximatie poate s produc rezultate incorecte deoarece a a a algoritmul de rasterizare pentru linii nu are notiunea conceptului de auntru (interior) i afar (exterior) i astfel pot selectionati n s n a s pixeli care se ae afara poligonului. n Aceasta este particular de nedorit cnd avem de convertit n a poligoane de culori diferite cu laturi comune: acest manier vor n a a exista pixeli ai unui poligon care invadeaz alt poligon genernd a a astfel un efect vizual incorect.

Cuprins

Notiuni generale

Algoritm scan line de umplere

Modalitatea cea mai la ndemn de a calcula intersectiile este s a a a se utilizeze scan-conversion pentru liniile corespunztoare ecrei a a laturi a poligonului. Aceast aproximatie poate s produc rezultate incorecte deoarece a a a algoritmul de rasterizare pentru linii nu are notiunea conceptului de auntru (interior) i afar (exterior) i astfel pot selectionati n s n a s pixeli care se ae afara poligonului. n Aceasta este particular de nedorit cnd avem de convertit n a poligoane de culori diferite cu laturi comune: acest manier vor n a a exista pixeli ai unui poligon care invadeaz alt poligon genernd a a astfel un efect vizual incorect.

Cuprins

Notiuni generale

Algoritm scan line de umplere

Cuprins

Notiuni generale

Algoritm scan line de umplere

Descrierea algoritmului

Operatia de lling pentru o singur scan-line const 3 pai: a a n s 1. Se calculeaz intersectiile dintre scan-line i toate laturile a s poligonului. 2. Se ordoneaz intersectiile dup abscisa x. a a 3. Se aprind pixelii ntre perechi de intersectii care sunt interioare poligonului, utiliznd, pentru a determina care pixel este interior, a aa-numita regul odd-parity care spune: s a a) paritatea initial este par; a a b) ecare intersectie schimb paritatea; a c) se deseneaz pixelii cnd paritatea este impar; a a a d) nu se deseneaz nimic cnd paritatea este par. a a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Descrierea algoritmului

Operatia de lling pentru o singur scan-line const 3 pai: a a n s 1. Se calculeaz intersectiile dintre scan-line i toate laturile a s poligonului. 2. Se ordoneaz intersectiile dup abscisa x. a a 3. Se aprind pixelii ntre perechi de intersectii care sunt interioare poligonului, utiliznd, pentru a determina care pixel este interior, a aa-numita regul odd-parity care spune: s a a) paritatea initial este par; a a b) ecare intersectie schimb paritatea; a c) se deseneaz pixelii cnd paritatea este impar; a a a d) nu se deseneaz nimic cnd paritatea este par. a a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Descrierea algoritmului

Operatia de lling pentru o singur scan-line const 3 pai: a a n s 1. Se calculeaz intersectiile dintre scan-line i toate laturile a s poligonului. 2. Se ordoneaz intersectiile dup abscisa x. a a 3. Se aprind pixelii ntre perechi de intersectii care sunt interioare poligonului, utiliznd, pentru a determina care pixel este interior, a aa-numita regul odd-parity care spune: s a a) paritatea initial este par; a a b) ecare intersectie schimb paritatea; a c) se deseneaz pixelii cnd paritatea este impar; a a a d) nu se deseneaz nimic cnd paritatea este par. a a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Descrierea algoritmului

Operatia de lling pentru o singur scan-line const 3 pai: a a n s 1. Se calculeaz intersectiile dintre scan-line i toate laturile a s poligonului. 2. Se ordoneaz intersectiile dup abscisa x. a a 3. Se aprind pixelii ntre perechi de intersectii care sunt interioare poligonului, utiliznd, pentru a determina care pixel este interior, a aa-numita regul odd-parity care spune: s a a) paritatea initial este par; a a b) ecare intersectie schimb paritatea; a c) se deseneaz pixelii cnd paritatea este impar; a a a d) nu se deseneaz nimic cnd paritatea este par. a a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Descrierea algoritmului

Operatia de lling pentru o singur scan-line const 3 pai: a a n s 1. Se calculeaz intersectiile dintre scan-line i toate laturile a s poligonului. 2. Se ordoneaz intersectiile dup abscisa x. a a 3. Se aprind pixelii ntre perechi de intersectii care sunt interioare poligonului, utiliznd, pentru a determina care pixel este interior, a aa-numita regul odd-parity care spune: s a a) paritatea initial este par; a a b) ecare intersectie schimb paritatea; a c) se deseneaz pixelii cnd paritatea este impar; a a a d) nu se deseneaz nimic cnd paritatea este par. a a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Descrierea algoritmului

Operatia de lling pentru o singur scan-line const 3 pai: a a n s 1. Se calculeaz intersectiile dintre scan-line i toate laturile a s poligonului. 2. Se ordoneaz intersectiile dup abscisa x. a a 3. Se aprind pixelii ntre perechi de intersectii care sunt interioare poligonului, utiliznd, pentru a determina care pixel este interior, a aa-numita regul odd-parity care spune: s a a) paritatea initial este par; a a b) ecare intersectie schimb paritatea; a c) se deseneaz pixelii cnd paritatea este impar; a a a d) nu se deseneaz nimic cnd paritatea este par. a a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Descrierea algoritmului

Operatia de lling pentru o singur scan-line const 3 pai: a a n s 1. Se calculeaz intersectiile dintre scan-line i toate laturile a s poligonului. 2. Se ordoneaz intersectiile dup abscisa x. a a 3. Se aprind pixelii ntre perechi de intersectii care sunt interioare poligonului, utiliznd, pentru a determina care pixel este interior, a aa-numita regul odd-parity care spune: s a a) paritatea initial este par; a a b) ecare intersectie schimb paritatea; a c) se deseneaz pixelii cnd paritatea este impar; a a a d) nu se deseneaz nimic cnd paritatea este par. a a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Descrierea algoritmului

Operatia de lling pentru o singur scan-line const 3 pai: a a n s 1. Se calculeaz intersectiile dintre scan-line i toate laturile a s poligonului. 2. Se ordoneaz intersectiile dup abscisa x. a a 3. Se aprind pixelii ntre perechi de intersectii care sunt interioare poligonului, utiliznd, pentru a determina care pixel este interior, a aa-numita regul odd-parity care spune: s a a) paritatea initial este par; a a b) ecare intersectie schimb paritatea; a c) se deseneaz pixelii cnd paritatea este impar; a a a d) nu se deseneaz nimic cnd paritatea este par. a a a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Probleme care apar


Inainte de a analiza problemele de intersectie i sorting, s vedem s a cum se denete, diferite situatii, dac un pixel este interior sau s n a nu poligonului. Va trebui s rspundem la cteva a a a ntrebri: a A. Dac o intersectie cu o valoare generic a lui x este a a rational, cum determinm care dintre cei doi pixeli de pe a a orizontal (care a ncadreaz punctul ideal) este cel cutat? a a dac alnim o intersectie cnd venim din interiorul a nt a poligonului (paritatea - parity bit - este impar) rotunjim la a ntregul mai mic pentru a rmne tot auntru; a a n dac venim din afara (exteriorul) poligonului (paritatea este a par), rotunjim la a ntregul urmtor pentru a intra auntru. a n

Cuprins

Notiuni generale

Algoritm scan line de umplere

Probleme care apar


Inainte de a analiza problemele de intersectie i sorting, s vedem s a cum se denete, diferite situatii, dac un pixel este interior sau s n a nu poligonului. Va trebui s rspundem la cteva a a a ntrebri: a A. Dac o intersectie cu o valoare generic a lui x este a a rational, cum determinm care dintre cei doi pixeli de pe a a orizontal (care a ncadreaz punctul ideal) este cel cutat? a a dac alnim o intersectie cnd venim din interiorul a nt a poligonului (paritatea - parity bit - este impar) rotunjim la a ntregul mai mic pentru a rmne tot auntru; a a n dac venim din afara (exteriorul) poligonului (paritatea este a par), rotunjim la a ntregul urmtor pentru a intra auntru. a n

Cuprins

Notiuni generale

Algoritm scan line de umplere

Probleme care apar


Inainte de a analiza problemele de intersectie i sorting, s vedem s a cum se denete, diferite situatii, dac un pixel este interior sau s n a nu poligonului. Va trebui s rspundem la cteva a a a ntrebri: a A. Dac o intersectie cu o valoare generic a lui x este a a rational, cum determinm care dintre cei doi pixeli de pe a a orizontal (care a ncadreaz punctul ideal) este cel cutat? a a dac alnim o intersectie cnd venim din interiorul a nt a poligonului (paritatea - parity bit - este impar) rotunjim la a ntregul mai mic pentru a rmne tot auntru; a a n dac venim din afara (exteriorul) poligonului (paritatea este a par), rotunjim la a ntregul urmtor pentru a intra auntru. a n

Cuprins

Notiuni generale

Algoritm scan line de umplere

Probleme care apar


Inainte de a analiza problemele de intersectie i sorting, s vedem s a cum se denete, diferite situatii, dac un pixel este interior sau s n a nu poligonului. Va trebui s rspundem la cteva a a a ntrebri: a A. Dac o intersectie cu o valoare generic a lui x este a a rational, cum determinm care dintre cei doi pixeli de pe a a orizontal (care a ncadreaz punctul ideal) este cel cutat? a a dac alnim o intersectie cnd venim din interiorul a nt a poligonului (paritatea - parity bit - este impar) rotunjim la a ntregul mai mic pentru a rmne tot auntru; a a n dac venim din afara (exteriorul) poligonului (paritatea este a par), rotunjim la a ntregul urmtor pentru a intra auntru. a n

Cuprins

Notiuni generale

Algoritm scan line de umplere

Probleme care apar


B. Cum se trateaz cazul special al unei intersectii cu a coordonate ntregi? Pentru a evita conicte de atributie pentru laturi adiacente se denete c o intersectie cu coordonate s a ntregi la limita din stnga pentru span de pixeli este intern poligonului, a a iar la limita din dreapta este extern. a C. Si dac intersectia cu coordonate a ntregi se refer la un a calculul paritii se va considera doar vrful ymin nu i vrf? In a at a s ymax al unei laturi. D. Cum se trateaz cazul special al vrfurilor care denesc a a laturi orizontale? Este de ajuns s considerm c vrfurile unei a a a a linii orizontale nu inuenteaz calculul paritii i se obtine a at s automat c laturile orizontale de jos vor desenate, cele de sus nu. a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Probleme care apar


B. Cum se trateaz cazul special al unei intersectii cu a coordonate ntregi? Pentru a evita conicte de atributie pentru laturi adiacente se denete c o intersectie cu coordonate s a ntregi la limita din stnga pentru span de pixeli este intern poligonului, a a iar la limita din dreapta este extern. a C. Si dac intersectia cu coordonate a ntregi se refer la un a calculul paritii se va considera doar vrful ymin nu i vrf? In a at a s ymax al unei laturi. D. Cum se trateaz cazul special al vrfurilor care denesc a a laturi orizontale? Este de ajuns s considerm c vrfurile unei a a a a linii orizontale nu inuenteaz calculul paritii i se obtine a at s automat c laturile orizontale de jos vor desenate, cele de sus nu. a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Probleme care apar


B. Cum se trateaz cazul special al unei intersectii cu a coordonate ntregi? Pentru a evita conicte de atributie pentru laturi adiacente se denete c o intersectie cu coordonate s a ntregi la limita din stnga pentru span de pixeli este intern poligonului, a a iar la limita din dreapta este extern. a C. Si dac intersectia cu coordonate a ntregi se refer la un a calculul paritii se va considera doar vrful ymin nu i vrf? In a at a s ymax al unei laturi. D. Cum se trateaz cazul special al vrfurilor care denesc a a laturi orizontale? Este de ajuns s considerm c vrfurile unei a a a a linii orizontale nu inuenteaz calculul paritii i se obtine a at s automat c laturile orizontale de jos vor desenate, cele de sus nu. a

Cuprins

Notiuni generale

Algoritm scan line de umplere

gura considerat, la scan-line 6 avem urmtoarea situatie: In a a Initial paritatea este par. Cnd ajungem punctul (2, 6) avem a a n intersectie la limita din stnga, deci paritatea se schimb i devine a as n impar. Se a ncepe aprinderea pixelilor. Ajungem F care este ymin pentru (FG ) i (EF ) deci paritatea se schimb de dou ori i s a a s astfel rmne impar. Se continu aprinderea pixelilor. Ajungem a a a a C care este maxim pentru (BC ) (nu inuenteaz paritatea), iar n a latura (CD) ind orizontal, din nou nu schimb paritatea. a Continum desenarea pixelilor. a Ajung D care este minim pentru n (DE ), astfel paritatea devine par. a Se nceteaz desenarea pixelilor. a (Aadar, pe segmentul orizontal s (CD) paritatea este impar i prin as urmare, segmentul se traseaz.) a

Cuprins

Notiuni generale

Algoritm scan line de umplere

gura considerat, la scan-line 6 avem urmtoarea situatie: In a a Initial paritatea este par. Cnd ajungem punctul (2, 6) avem a a n intersectie la limita din stnga, deci paritatea se schimb i devine a as n impar. Se a ncepe aprinderea pixelilor. Ajungem F care este ymin pentru (FG ) i (EF ) deci paritatea se schimb de dou ori i s a a s astfel rmne impar. Se continu aprinderea pixelilor. Ajungem a a a a C care este maxim pentru (BC ) (nu inuenteaz paritatea), iar n a latura (CD) ind orizontal, din nou nu schimb paritatea. a Continum desenarea pixelilor. a Ajung D care este minim pentru n (DE ), astfel paritatea devine par. a Se nceteaz desenarea pixelilor. a (Aadar, pe segmentul orizontal s (CD) paritatea este impar i prin as urmare, segmentul se traseaz.) a

Cuprins

Notiuni generale

Algoritm scan line de umplere

gura considerat, la scan-line 6 avem urmtoarea situatie: In a a a n Initial paritatea este par. Cnd ajungem punctul (2, 6) avem a intersectie la limita din stnga, deci paritatea se schimb i devine a as n impar. Se a ncepe aprinderea pixelilor. Ajungem F care este ymin pentru (FG ) i (EF ) deci paritatea se schimb de dou ori i s a a s astfel rmne impar. Se continu aprinderea pixelilor. Ajungem a a a a C care este maxim pentru (BC ) (nu inuenteaz paritatea), iar n a latura (CD) ind orizontal, din nou nu schimb paritatea. a Continum desenarea pixelilor. a Ajung D care este minim pentru n (DE ), astfel paritatea devine par. a Se nceteaz desenarea pixelilor. a (Aadar, pe segmentul orizontal s (CD) paritatea este impar i prin as urmare, segmentul se traseaz.) a

Cuprins

Notiuni generale

Algoritm scan line de umplere

gura considerat, la scan-line 6 avem urmtoarea situatie: In a a Initial paritatea este par. Cnd ajungem punctul (2, 6) avem a a n intersectie la limita din stnga, deci paritatea se schimb i devine a as n impar. Se a ncepe aprinderea pixelilor. Ajungem F care este ymin pentru (FG ) i (EF ) deci paritatea se schimb de dou ori i s a a s astfel rmne impar. Se continu aprinderea pixelilor. Ajungem a a a a C care este maxim pentru (BC ) (nu inuenteaz paritatea), iar n a latura (CD) ind orizontal, din nou nu schimb paritatea. a Continum desenarea pixelilor. a Ajung D care este minim pentru n (DE ), astfel paritatea devine par. a Se nceteaz desenarea pixelilor. a (Aadar, pe segmentul orizontal s (CD) paritatea este impar i prin as urmare, segmentul se traseaz.) a

Cuprins

Notiuni generale

Algoritm scan line de umplere

gura considerat, la scan-line 6 avem urmtoarea situatie: In a a Initial paritatea este par. Cnd ajungem punctul (2, 6) avem a a n intersectie la limita din stnga, deci paritatea se schimb i devine a as n impar. Se a ncepe aprinderea pixelilor. Ajungem F care este ymin pentru (FG ) i (EF ) deci paritatea se schimb de dou ori i s a a s astfel rmne impar. Se continu aprinderea pixelilor. Ajungem a a a a C care este maxim pentru (BC ) (nu inuenteaz paritatea), iar n a latura (CD) ind orizontal, din nou nu schimb paritatea. a Continum desenarea pixelilor. a Ajung D care este minim pentru n (DE ), astfel paritatea devine par. a Se nceteaz desenarea pixelilor. a (Aadar, pe segmentul orizontal s (CD) paritatea este impar i prin as urmare, segmentul se traseaz.) a

Cuprins

Notiuni generale

Algoritm scan line de umplere

gura considerat, la scan-line 6 avem urmtoarea situatie: In a a Initial paritatea este par. Cnd ajungem punctul (2, 6) avem a a n intersectie la limita din stnga, deci paritatea se schimb i devine a as n impar. Se a ncepe aprinderea pixelilor. Ajungem F care este ymin pentru (FG ) i (EF ) deci paritatea se schimb de dou ori i s a a s astfel rmne impar. Se continu aprinderea pixelilor. Ajungem a a a a C care este maxim pentru (BC ) (nu inuenteaz paritatea), iar n a latura (CD) ind orizontal, din nou nu schimb paritatea. a Continum desenarea pixelilor. a Ajung D care este minim pentru n (DE ), astfel paritatea devine par. a Se nceteaz desenarea pixelilor. a (Aadar, pe segmentul orizontal s (CD) paritatea este impar i prin as urmare, segmentul se traseaz.) a

Cuprins

Notiuni generale

Algoritm scan line de umplere

gura considerat, la scan-line 6 avem urmtoarea situatie: In a a Initial paritatea este par. Cnd ajungem punctul (2, 6) avem a a n intersectie la limita din stnga, deci paritatea se schimb i devine a as n impar. Se a ncepe aprinderea pixelilor. Ajungem F care este ymin pentru (FG ) i (EF ) deci paritatea se schimb de dou ori i s a a s astfel rmne impar. Se continu aprinderea pixelilor. Ajungem a a a a C care este maxim pentru (BC ) (nu inuenteaz paritatea), iar n a latura (CD) ind orizontal, din nou nu schimb paritatea. a Continum desenarea pixelilor. a Ajung D care este minim pentru n (DE ), astfel paritatea devine par. a Se nceteaz desenarea pixelilor. a (Aadar, pe segmentul orizontal s (CD) paritatea este impar i prin as urmare, segmentul se traseaz.) a

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul

Fie x[k], y [k] coordonatele vrfului Pk al poligonului i n numrul a s a de laturi. Fie nr int numrul de intersectii pe o anumit scan line. a a Fie de asemenea x int[k] abscisa intersectiei k cu scan line. int x[100], y[100]; // coordonatele varfurilor oat x int[100]; // coordonata x a intersectiilor int u, k, n, nr int, ymin, ymax;

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul
/* functie de calcul a marginii din stanga */ int stg(oat z) { /* daca z este intreg, il returneaza daca z este rational, il rotunjeste la intregul urmator */ if (z == int (z)) return z; else return int (z) + 1; } /* functie de calcul a marginii din dreapta */ int dr(oat z) { /* daca z este intreg, returneaza z-1 daca z este rational, il rotunjeste la intregul precedent */ if (z == int (z)) return z-1; else return int (z); }

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul
/* functie de sortare */ oat *qsort (oat *a, int L, int R) { int h, j; oat temp; for(h=L; h<=R-1; h++) for(j=h+1; j<=R; j++) if (a[h]>a[j]) { temp=a[h]; a[h]=a[j]; a[j]=temp; } return a; }

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul
/* algoritmul de ll pe scan line */ void scanline(int y0) { int i; nr int= 0; for (i=1; i <=n; i++) { if ((y [i + 1] y 0) (y 0 y [i]) > 0) /* linia scan taie interiorul segmentului */ { nr int++; x int[nr int]=(y0y[i])oat((x[i+1]x[i]))/oat((y[i+1]y[i]))+x[i]; }

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul
else if (y[i]==y0) /* linia scan trece printr-un varf al poligonului */ if ((y[i-1]>y0) && (y[i+1]>y0)) { /* avem situatia \/ pentru varfuri */ nr int+=2; /* consider varful Pi de doua ori */ x int[nr int-1]=x[i]; x int[nr int]=x[i]; } else if ((y[i-1]y0)(y[i+1]y0)< 0) /* avem situatia laturilor una in continuarea celeilalte */ { nr int ++; x int[nr int]=x[i]; }

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul
else if (y[i+1]==y0) /* avem latura orizontala */ if ((y[i+2]>y0) && (y[i-1]>y0)) { /* avem situatia \ / */ nr int +=2; x int[nr int-1]=x[i]; x int[nr int]=x[i+1]; } else if ((y[i+2]<y0)&&(y[i-1]>y0)) { /* avem cazul y[i]=y[i+1] intre y[i-1] > y[i+2] */ nr int++; x int[nr int]=x[i]; } else

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul

if ((y[i+2]>y0)&&(y[i-1]<y0)) { /* avem cazul y[i]=y[i+1] intre y[i-1] < y[i+2] */ nr int++; x int[nr int]=x[i+1]; } }
/*

//end for
reamintim ca liniile orizontale se deseneaza daca sunt inferioare si nu se deseneaza daca sunt linii orizontale superioare */

qsort(x int, 1, nr int); // se sorteaza crescator abscisele intersectiilor

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul

k=1; while (k < nr int) { delay(10); line(stg(x int[k]), y0, dr(x int[k+1]), y0); k +=2; } } // end functie scanline

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul
void main ( ) { clrscr( ); cout<<Introduceti numarul de laturi:<<endl; cout<<n=; cin>>n; cout<<Introduceti coordonatele varfurilor:<<endl; for(k=1; k<=n; k++) { cout<<x[<<k<<]=; cin>>x[k]; cout<<y[<<k<<]=; cin>>y[k]; cout<<endl; } x[0]=x[n]; y[0]=y[n]; x[n+1]=x[1]; y[n+1]=y[1]; x[n+2]=x[2]; y[n+2]=y[2];

Cuprins

Notiuni generale

Algoritm scan line de umplere

Algoritmul
for(k=1; k<=n; k++) line(x[k], y[k], x[k+1], y[k+1]); /* aarea minimului si maximului pentru scan line */ ymin=x[1]; ymax=y[1]; for (k=1; k<=n; k++) if (y[k] > ymax) ymax=y[k]; for (k=1; k<=n; k++) if (y[k] < ymin) ymin=y[k]; /* ll pe scan line de la ymin la ymax */ for (u=ymin; u <= ymax; u++) { setcolor(u%5+1); // umplerea se face cu 5 culori scanline(u); }

También podría gustarte