Você está na página 1de 19

Preenchimento de Polgonos

Captulo 4

Polgonos
Operao fundamental em computao grfica Polgono dado por uma lista de vrtices
ltimo vrtice = primeiro vrtice

Retngulos
Para preencher um retngulo com uma nica cor, pinta-se cada pixel dentro de uma linha de varredura da esquerda para a direita com o mesmo valor de pixel, isto , pode-se preencher cada bloco de xmin a xmax. Algoritmo
Para y = ymin at ymax do retngulo { Por linha de varredura } Para x = xmin at xmax { Cada pixel dentro do bloco} escreva_pixel(x,y,valor)

Polgonos de Forma Arbitrria


Esta figura ilustra o processo de linha de varredura para um polgono arbitrrio. As interseces da linha de varredura 8 com os lados FA e CD possuem coordenadas inteiras, enquanto as interseces com os lados EF e DE possuem coordenadas reais.

Polgonos de Forma Arbitrria


Cuidados devem ser tomados para evitar pintar um mesmo pixel mais de uma vez
Dois polgonos adjacentes Vrtices (pertencem a 2 arestas)

Polgonos de Forma Arbitrria


O processo de preencher os polgonos pode ser dividido em trs passos: 1. Obter a interseco da linha de varredura com todos os lados do polgono. 2. Ordenar os pontos de interseco (em x crescente). 3. Preencher os pixels entre pares de pontos de interseco do polgono que so internos a ele.
Para determinar quais os pares que so internos ao polgono, podemos usar a regra de Paridade: A paridade inicialmente par, e a cada interseco encontrada o bit de paridade invertido, o pixel pintado quando a paridade impar, e no pintado quando par.

Questes
Na Figura Anterior, a lista ordenada de coordenadas x (2, 4.5, 8.5, 13) para a linha de varredura 8. H 4 pontos a serem discutidos sobre este passo: I Se a interseco um valor fracionrio, como determinar qual o pixel que dever ser tomado para que fique interior ao polgono? O valor dever ser arredondado de forma a que o ponto fique dentro do polgono.
Se estamos dentro do polgono (paridade mpar) e atingimos uma interseco fracionria pela direita, arredondamos a coordenada x da interseco para baixo; se estamos fora do polgono arredondamos para cima.

Isso garante que sempre teremos um ponto dentro do polgono.

Questes
II Como tratar o caso de interseco com coordenadas inteiras? Pode-se utilizar o critrio visto anteriormente, para evitar conflitos entre lados compartilhados em retngulos.
Se a coordenada x de um pixel mais a esquerda de um bloco (span) inteira ele definido como interno; se a coordenada x do pixel mais a direita de um bloco inteira, ele definido como externo ao polgono.

Questes
III Como tratar o caso II para vrtices que so compartilhados por mais de uma aresta do polgono? Usamos a tcnica de paridade. Ou seja, contamos o vrtice de ymin de um lado para alterar a paridade, mas no contamos o vrtice de ymax, dessa forma o vrtice de ymax desenhado somente se ele o vrtice de ymin do lado adjacente. Por exemplo, na Figura, o vrtice A contado uma vez na clculo de paridade porque o vrtice de ymin para o lado FA, mas tambm o vrtice de ymax para o lado AB. Assim ambos os lados e blocos so tratados como intervalos que so fechados em seu valor minimo e abertos em seu valor mximo.

Questes
IV Como tratar o caso especial de II em que os vrtices definem uma linha horizontal? Assim como no caso dos retngulos, arestas horizontais inferiores so traadas, e arestas horizontais superiores no so. Isso acontece automaticamente se no contarmos os vrtices dessas arestas no clculo da paridade, o que natural, j que eles no correspondem a vrtices ymin ou ymax.

Arestas Horizontais
Tratamento dos lados horizontais de um polgono.

Arestas Horizontais
OBSERVAES:
O algoritmo anterior contempla polgonos que possuem auto-interseco. Mas no desenha os pixels das arestas superiores nem os das arestas direita No desenha os pixels sobre o topo interno de um polgono cncavo em formato de U. No desenha os pixels que so pontos mximos locais. Neste algoritmo, em vez de escrever pixels em lugares errados, pixels no so escritos (mesmo em seus lugares certos!).

Preenchimento de Polgonos
Algoritmo clssico usa tcnica de varredura
Arestas so ordenadas
Chave primria: y mnimo Chave secundria: x mn. Exemplo: (e,d,a,b,c)
y ymax a b c d e ymin x

Linha de varredura perpendicular ao eixo y percorre o polgono (desde ymin at ymax) Intervalos horizontais entre pares de arestas so preenchidos

Rasterizao de Polgonos
Intervalos de preenchimento
Definidos sobre a linha de varredura Cada intervalo comea e termina sobre um pixel interceptado por uma aresta
Primeiro pixel pintado, ltimo no

Arestas horizontais no so consideradas Um vrtice de uma aresta no horizontal considerado apenas se for o vrtice com menor y

Pixel resultante da interseo entre arestas e linhas de varredura Pixel pintado

Preenchimento de Polgonos Estruturas de Dados incremento x Aresta


y inicial (y mnimo) y final x corrente (inicialmente, x inicial) dx (incremento x)
y y final 1 y inicial

Lista de Arestas arestas do polgono Lista de Arestas Ativas arestas do polgono que interceptam linha de varredura corrente

Ordenadas por y inicial / x inicial


x inicial x

Ordenadas por coordenada x de interseo

Preenchimento de Polgonos Pseudo Cdigo


Inicializao
Criar e ordenar LA (lista de arestas) Computar ymin e ymax LAA nulo

Para y desde ymin at ymax fazer


Inserir em LAA todas as arestas com yinicial = y Retirar da LAA todas as arestas com yfinal = y Para cada par de arestas A1/A2 da LAA fazer
Desenhar todos os pixels com x entre A1.xcorrente e A2.xcorrente (exclusive)

Para cada aresta A da LAA fazer


A.xcorrente A.xcorrente + A.dx

Reordenar a LAA (arestas cruzadas)

16

Preenchimento de Regies
No propriamente rasterizao uma vez que operao se d no espao da imagem Regies so definidas por critrios de vizinhana a um pixel dado (semente)
4-conexa (borda 8-conexa) 8-conexa (borda 4-conexa)

Exemplo:
Pixels com cor semelhante semente
Borda tem cor diferente

Pixels com cor diferente de uma cor dada


Borda tem cor igual cor dada

17

Algoritmo de Preenchimento
Conhecido como Flood Fill Algoritmo recursivo
Preenche vizinhos da semente que atendem ao critrio Aplica o algoritmo recursivamente tomando esses vizinhos como sementes Termina quando nenhum vizinho atende o critrio

18

Algoritmo de Preenchimento
Pseudo-cdigo:
Procedure FloodFill (x, y, cor, novaCor) Se pixel (x, y) = cor ento pixel (x, y) novaCor FloodFill (x + 1, y, cor , novaCor) FloodFill (x, y + 1, cor , novaCor) FloodFill (x - 1, y, cor , novaCor) FloodFill (x, y - 1, cor , novaCor)

Uso abusivo de recurso pode ser contornado preenchendo intervalos horizontais iterativamente Pode ser necessrio usar um bitmap auxiliar para marcar os pixels visitados. Por exemplo
Critrio pixel (x, y) cor Se cor novaCor, no h meio de distinguir um pixel visitado de um no visitado 19

Você também pode gostar