07 - CG - Preenchimentodereas

25
Computação Gráfica Preenchimento de Áreas Aula 7 Prof. Esp. Danilo Augusto [email protected]

Transcript of 07 - CG - Preenchimentodereas

Page 1: 07 - CG - Preenchimentodereas

Computação Gráfica

Preenchimento de Áreas

Aula 7

Prof. Esp. Danilo Augusto

[email protected]

Page 2: 07 - CG - Preenchimentodereas

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.

Page 3: 07 - CG - Preenchimentodereas

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.

Page 4: 07 - CG - Preenchimentodereas

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

Page 5: 07 - CG - Preenchimentodereas

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

Page 6: 07 - CG - Preenchimentodereas

Preenchimento de Regiões

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

Page 7: 07 - CG - Preenchimentodereas

Preenchimento de Regiões

• Cuidado ao identificar os pontos!

Page 8: 07 - CG - Preenchimentodereas

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;

Page 9: 07 - CG - Preenchimentodereas

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)

Page 10: 07 - CG - Preenchimentodereas

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.

Page 11: 07 - CG - Preenchimentodereas

Exemplo

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

Page 12: 07 - CG - Preenchimentodereas

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).

Page 13: 07 - CG - Preenchimentodereas

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).

Page 14: 07 - CG - Preenchimentodereas

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;

Page 15: 07 - CG - Preenchimentodereas

Algoritmo Flood-Fill

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

Page 16: 07 - CG - Preenchimentodereas

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.

Page 17: 07 - CG - Preenchimentodereas

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

Page 18: 07 - CG - Preenchimentodereas

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

Page 19: 07 - CG - Preenchimentodereas

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

Page 20: 07 - CG - Preenchimentodereas

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

Page 21: 07 - CG - Preenchimentodereas

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

Page 22: 07 - CG - Preenchimentodereas

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.

Page 23: 07 - CG - Preenchimentodereas

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.

Page 24: 07 - CG - Preenchimentodereas

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?

Page 25: 07 - CG - Preenchimentodereas

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?