07 - CG - Preenchimentodereas

Post on 28-Dec-2015

41 views 0 download

Transcript of 07 - CG - Preenchimentodereas

Computação Gráfica

Preenchimento de Áreas

Aula 7

Prof. Esp. Danilo Augusto

daniloaugusto@gmail.com

Preenchimento de Áreas

Há duas abordagens básicas para preenchimento de áreas:

• algoritmos baseados em regiões de preenchimento (Boundary-Fill Algorithm e Flood-Fill Algorithm)

Estes algoritmos são mais utilizados para o preenchimento de regiões irregulares com fronteiras complexas. Muito utilizado em softwares de desenho interativos.

Preenchimento de Áreas

• algoritmos baseados em linhas de varredura (Scan-line Fill Algorithm);

Estes algoritmos são mais utilizados para preenchimento de polígonos, círculos, e outras figuras primitivas. Utiliza a estrutura geométrica para orientar a identificação de pontos interiores.

Preenchimento de Regiões

• Boundary-Fill Algorithm: faz o preenchimento de uma região a partir da escolha de um ponto inicial interno até as fronteiras determinadas por uma cor.

Exemplo:

Cor de Preenchimento: Amarelo

Fronteira: Preto

Preenchimento de Regiões • Flood-Fill Algorithm: faz o preenchimento de uma região a partir da escolha de um ponto inicial interno substituindo uma cor existente por uma nova cor. Pode estar delimitado por diferentes cores.

Exemplo:

Cor de Preenchimento: Amarelo

Cor existente: Branco

Preenchimento de Regiões

Estes algoritmos podem utilizar 4 ou 8 pontos vizinhos para detectar as áreas conectadas a serem preenchidas.

Preenchimento de Regiões

• Cuidado ao identificar os pontos!

Algoritmo Boundary-Fill BoundaryFill4 ( x, y, corPreenc, corLimite)

corAtualobtemCor(x,y);

se corAtualcorLimite E corAtualcorPreenc então

selecione (corPreenc);

ponto (x,y);

BoundaryFill4(x+1,y,corPreenc,corLimite);

BoundaryFill4(x-1,y,corPreenc,corLimite);

BoundaryFill4(x,y+1,corPreenc,corLimite);

BoundaryFill4(x,y-1,corPreenc,corLimite);

fim se;

Fim;

BoundaryFill4

( 10, 20, AMARELO, PRETO)

BoundaryFill4

( 11, 20, AMARELO, PRETO)

BoundaryFill4

( 9, 20, AMARELO, PRETO)

BoundaryFill4

( 10, 21, AMARELO, PRETO)

BoundaryFill4

( 10, 19, AMARELO, PRETO)

Algoritmo Boundary-Fill

O algoritmo Boundary-Fill apresentado utiliza exaustivamente a pilha interna devido a recursividade. A cada ponto novo, o procedimento é chamado recursivamente para os quatro pontos vizinhos (ou oito).

Há métodos alternativos que diminuem a utilização da pilha, fazendo o preenchimento da linha atual e empilhando apenas os pontos limites das linhas superior e inferior que ainda não foram preenchidos.

Exemplo

Preenche a linha, e insere na pilha os pontos conectados da linha de cima e de baixo mais à esquerda (pontos 1 e 2).

Exemplo

Desempilha o ponto 2, preenche a linha, e insere na pilha os pontos conectados da linha de cima e de baixo mais à esquerda (apenas o ponto 3).

Exemplo

Desempilha o ponto 3, preenche a linha, e insere na pilha os pontos conectados da linha de cima e de baixo mais à esquerda (pontos 4, 5 e 6).

Algoritmo Flood-Fill floodFill4 ( x, y, corPreenc, corExistente){

se obtemPonto(x,y)= corExistente então

selecione (corPreenc);

ponto (x,y);

floodFill4(x+1,y,corPreenc,corExistente);

floodFill4(x-1,y,corPreenc, corExistente);

floodFill4(x,y+1,corPreenc, corExistente);

floodFill4(x,y-1,corPreenc, corExistente);

fim se;

Fim;

Algoritmo Flood-Fill

O aperfeiçoamento proposto para o Boundary-fill também pode ser utilizado neste algoritmo.

Preenchimento de Áreas

• algoritmos baseados em linhas de varredura (Scan-line Fill Algorithm);

Estes algoritmos são mais utilizados para preenchimento de polígonos, círculos, e outras figuras primitivas. Utiliza a estrutura geométrica para orientar a identificação de pontos interiores.

Algoritmo baseado em Linha de Varredura (Scan Line)

Este algoritmo passa uma linha paralela ao eixo X verificando as intersecções dessa linha com as linhas dos polígonos.

Scan Line

a

b c d

Algoritmo baseado em Linha de Varredura (Scan Line)

Os pontos de intersecção de cada linha são ordenados e cada par deste conjunto determina um intervalo de preenchimento.

Scan Line

Intervalos determinados pelos pares: (a,b) (c,d)

a

b c d

Algoritmo baseado em Linha de Varredura (Scan Line)

Porém, quando a Scan Line passa por um vértice, é preciso decidir se um ou dois pontos de intersecção serão calculados.

Scan Line y’

Scan Line y

Algoritmo baseado em Linha de Varredura (Scan Line)

Caso as duas linhas que estão ligadas pelo vértice constituem um incremento ou decremento contínuo de y, então apenas um ponto de intersecção é criado.

Scan Line y’ a b

Algoritmo baseado em Linha de Varredura (Scan Line)

Caso contrário, o vértice constitui um ponto de máximo ou mínimo, e dois pontos devem ser criados para determinar os intervalos.

Scan Line y a b b’ c

Algoritmo baseado em Linha de Varredura (Scan Line)

Como a linha possui um coeficiente angular constante. Os algoritmos que usam o conceito de Scan Line procuram utilizar as informações da linha anterior para computar os próximos pontos de intersecção.

Note que os pontos de intersecção acompanham o coeficiente angular da linha. Isto só é quebrado quando uma nova aresta aparece no cálculo.

Algoritmo baseado em Linha de Varredura (Scan Line)

Em geral, os algoritmos com Scan Line, fazem uma primeira varredura criando uma lista que descreve a relação das arestas com a scan line. E depois a utilizam para determinar o preenchimento. Isto acelera o processo de preenchimento e simplifica os cálculos dos pontos de intersecção.

Exercícios – Aula 7 • 1. Explique cada linha do seguinte algoritmo

BoundaryFill4 ( x, y, corPreenc, corLimite) corAtualobtemCor(x,y); se corAtualcorLimite E corAtualcorPreenc então selecione (corPreenc); ponto (x,y); BoundaryFill4(x+1,y,corPreenc,corLimite); BoundaryFill4(x-1,y,corPreenc,corLimite); BoundaryFill4(x,y+1,corPreenc,corLimite); BoundaryFill4(x,y-1,corPreenc,corLimite); fim se;

• 2. Os algoritmos baseados em regiões de preenchimento (Boundary-Fill Algorithm e Flood-Fill Algorithm) são mais utilizados para o preenchimento de regiões irregulares com fronteiras complexas, sendo empregado na maioria dos softwares de desenho interativos. Qual a diferença entre eles?

Exercícios – Aula 7 • 3. Como se pode otimizar o funcionamento do

algoritmo de preenchimento Boundary-Fill?

• 4. Exemplifique o funcionamento do algoritmo baseado em Linha de Varredura (Scan Line), contemple na resposta o método de otimização e o tratamento dos vértices?