Upload
anasofia-alto
View
213
Download
0
Embed Size (px)
Citation preview
COMPUTAÇÃO GRÁFICACOMPUTAÇÃO GRÁFICA
Aula 03
Prof. Edison Oliveira de Jesus
Assuntos abordados nesta Assuntos abordados nesta aulaaula
Preenchimento de Polígonos
Representação de um polígonoRepresentação de um polígono Um polígono pode ser representado da seguinte
forma:
onde: vk = vértice de coordenadas ( x , y )
v1 v2 v3 vnP λ
Construção de um polígonoConstrução de um polígono
v1
v4
v3
v2
v5
draw
draw
draw
draw
draw
Usa-se n – 1 vértices
Último vértice é igual ao primeiro
Problema nesta representação:
Transformações geométricas são aplicadas a ca-da vértice;
Solução para este problema:
Representar o polígono pelas suas coordenadas relativas de todos os vértices exceto e primeiro, que terão coordenadas absolutas.
V1 ( x, y ) v2
v3
v4
a´´ unidades
a´ unidades
a´´´´ unidades
A´´´ unidades
Outra representaçãoOutra representação Vetorial com estrutura da linguagem:
Estrutura PONTO x, y
PONTO coordenadas[10]
Métodos de preenchimento do Métodos de preenchimento do polígonopolígono
FLOOD
um pixel aleatório interno ao polígono é enviado à rotina FLOOD;
Neste caso, este pixel está apagado e portanto, ele é aceso.
Todos os pixels vizinhos a este pixel também são enviados à rotina; ( recursão pode ser utilizada aqui ).
Problemas com este métodoProblemas com este método
Se a quantidade de pontos for muito grande, a solução pode causar um estouro ( overflow ) da pilha de armazenamento.
Uma solução seria a utilização de variáveis globais;
Algoritmo FLOODAlgoritmo FLOODalgoritmo flood ( x, y ) se ( não aceso ( x, y ) ) então plota pixel ( x, y ) flood ( x + 1, y ) flood ( x – 1 , y ) flood ( x, y + 1 ) flood ( x, y – 1 ) fim-seFim-algoritmo
Métodos de preenchimento do Métodos de preenchimento do polígonopolígono
SCAN LINE
Desenha-se o polígono usando seus vértices;
Traça-se uma linha horizontal ( scan line ), passan-do-a em cada um dos vértices do polígono;
A scan line é traçada da esquerda para a direita e deve ficar dentro do bounding box do polígono;
Encontrar a margem esquerda do polígono e come-çar a traçar a scan line até encontrar a margem direita do polígono;
Bounding BoxBounding Box É o retângulo que circunda o polígono.
PreenchimentoPreenchimento
Scan line
Borda esquerda
Borda direita
Borda esquerda
Borda direita
1
AlgoritmoAlgoritmoAlgoritmo scan-line ( ) para y = 0 até ymax faça x ← 0 repita enquanto ( não aceso ( x, y ) e x < xmax ) faça x ← x + 1 fim_enquanto // achou margem esquerda se x < xmax então x ← x + 1 xs ← x enquanto ( não aceso ( x, y ) ) faça x ← x + 1 fim_enquanto // achou margem direita linha ( xs, y, x, y ) // scan line x ← x + 1 fim_se até x ≥ xmax fim_parafim_algoritmo
Preenchimento convexoPreenchimento convexo
convexo
Convexo horizontal Não
convexo
Preenchimento ConvexoPreenchimento Convexo Para polígonos convexos, o algoritmo scan line
mostrado anteriormente, funciona sem problemas;
O problema neste tipo de preenchimento é quando se trata com polígonos não convexos.
Problemas do métodoProblemas do método Traçar scan lines erradas.
Preenchimento de polígonos em Preenchimento de polígonos em geralgeral
Calcular as coordenadas dos pontos de interseção de cada scan line com as bordas do polígono;
Ordenar estas coordenadas tomando com chave o valor de x;
Agrupar as coordenadas em pares;
Preencher o polígono usando como extremos das scan lines, os pares obtidos no item anterior;
Calculando os pontos de Calculando os pontos de interseçãointerseção
A interseção de uma scan line com uma borda do polígono é dada da seguinte forma:
borda
Scan line nova
Scan line anterior
P1 ( x1 , y1 )
P2 ( x2 , y2 )
Panterior( Xanterior Yscan line anterior )
Pnovor( Xnovor Yscan line anterior + 1)
X
Y
Se y1 < y2
então ypasso ← 1
senão swapping ( P1 e P2 )
Logo: y2 – y1 = 1 pois passo na direção y é igual a 1
Portanto: m = ( y2 – y1 ) / ( x2 – x1 )
m = 1 / ( x2 – x1 ) Como x1 e x2 são conhecidos, o ponto p ( xnovo, yscan line )
terá suas coordenadas calculadas da seguinte for-ma:
equação ( 1 )
da equação 1, tem-se:
m = 1 / ( xnovo – x1 )
E logo:
xnovo = x1 + 1 / m
e: Yscan line corresponde à y da linha scan line em estudo;
Como o processo é repetido para cada scan line, pode-se escrever:
Xnovo = Xanterior + 1 / m equação ( 2 )
Nova scan line
Scan line anterior
xanterior xnovoX
Y
Portanto, se a primeira scan line for conhecida ( aquela mais próxima ao eixo X ), pode-se através da equação 2, calcular todas as outras scan lines.
A idéia é traçar uma scan line por vez, começando por baixo até chegar ao topo do polígono, ou seja, ao valor mais alto de Y.
Quais bordas a scan line intercepta? Não se deve testar cada scan line com todas as bordas
do polígono e sim, criar uma tabela com to-das as scan lines que cortam o polígono;
A estrutura de dados para esta tabela pode ser um vetor de apontadores, contendo um apontador para cada scan line;
Cada apontador contem aquelas bordas cujo menor valor de y inicia na scan line representada por aquele apontador;
Na verdade cada apontador aponta para uma lista de bordas.
Exemplo de PreenchimentoExemplo de Preenchimento
1 5 10 151
5
10
b1b2
b3
b4
b5 b6b7
b8b9
b10
b11b12
b13
b14 b15
b16b17
b18b19
b20b21
Figura 01
Vetor com os apontadores das Vetor com os apontadores das scan linesscan lines
00 01 02 03 04 05 06 07 08 09 10 11 12
λ λ λ λb1
b21
b20
b19
b18
b17
b16
b2 b3
b14
b15
b12
b13
b11
b4 b10
b6
b9
b5
b8
b7 λ
scan lines→
Isto significa que da scan line 01 têm inicio as bordas 1, 21, 20, 19, 18, 17 e 16
Figura 02
Esta tabela é usada para determinar quais bordas, cada scan line intercepta e qual é o valor de X em cada intercessão;
o valor Y de um ponto de intercessão é o número da scan line atual;
Estrutura de cada bordaEstrutura de cada borda Cada borda do vetor de scan lines tem a seguinte
estrutura:
YTOPO
Y da mais alta scan line que a borda interceptou
Xmin
X da mais baixa scan line daquela borda
1 / m
Valor inverso da inclinação da borda
Figura 03
Lista de bordasLista de bordas Cada scan line deve ter as bordas de sua lista
( conforme mostra a figura 2 ) substituídas pelos seus respectivos valores, como determina a estru-tura de bordas mostrada na figura 3.
Assim, por exemplo, na scan line 01, tem-se a se-guinte lista de bordas:
b1 → b21 → b20 → b19 → b18 → b17 → b16
Exemplo de PreenchimentoExemplo de Preenchimento
1 5 10 151
5
10
b1b2
b3
b4
b5 b6b7
b8b9
b10
b11b12
b13
b14 b15
b16b17
b18b19
b20b21
Figura 01
A borda b1 por exemplo, vai do ponto ( 2, 2 ) ao ponto ( 4, 1 )
Portanto, para esta borda, a estrutura de bordas da figura 2, seria constituída dos seguintes valores:
maior y = 2 X do menor y = 4 m = -1/2 logo: 1/m = -2
Logo, esta borda é representada pelos valores: [ 2 | 4 | -2 ]
Observe alguns casos especiais:
1. Borda b11 da scan line 5 Vai do ponto ( 14, 5 ) ao ponto ( 14, 6 ) maior y = 6 X do menor y = 14 1 / m = 0
Logo, esta borda é representada pelos valores: [ 6 | 14 | 0 ]
2. Borda b17 da scan line 1 Como esta borda é horizontal ela já se confunde
com a scan line e portanto, ela não faz parte da lista de bordas da scan line.
1 5 10 151
5
10
b1b2
b3
b4
b5 b6b7
b8b9
b10
b11b12
b13
b14 b15
b16b17
b18b19
b20b21
Vetor de Scan Lines com as Vetor de Scan Lines com as bordasbordas
A seguir são mostradas as bordas que cada scan line intercepta e os seus valores, conforme a estru-tura apresentada na figura 3:
scan line 1 : [ 2 | 4 | -2 ] → [ 4 | 4 | 1/3 ] → [ 4 | 6 | -1/3 ] → [ 4 | 6 | 1/3 ] → [ 4 | 9 | -2/3 ] → [ 3 | 13 | 3/2 ]
scan line 2 : [ 3 | 2 | -1 ]
scan line 3 : [ 5 | 1 | 0 ] → [ 4 | 13 | -3 ]
scan line 4 : [ 5 | 12 | 2 ]
scan line 5 : [ 9 | 1 | 1/2 ] → [ 6 | 14 | 0 ]
Vetor de Scan Lines com as Vetor de Scan Lines com as bordasbordas
scan line 6 : [ 7 | 14 | 2 ]
scan line 7 : [ 9 | 5 | -1 ] → [ 10 | 5 | 4/3 ] → [ 11 | 16 | -3/4 ] scan line 8 : [ 10 | 11 | -1 ] → [ 11 | 11 | 2/3 ]
scan line 9 :
scan line 10 :
scan line 11 :
scan line 12 :
Transformação de vérticesTransformação de vértices Na construção da lista de bordas, são utilizadas as
scan lines que passam pelos vértices do polígono;
Foram mostradas anteriormente as situações onde os vértices são incorporados a esta lista;
Ou seja: ( as linhas tracejadas indicam as scan lines )
Entra na lista
Não entra na lista
Não entra na lista
Entra na lista
Não entra na lista
Figura 04
No primeiro caso, o vértice corresponde às bordas que estão sobre a scan line;
No segundo caso, o vértice corresponde às bordas que estão sob a scan line;
No terceiro caso, a borda está sobre a scan line;
No quarto caso, a scan line cruza a borda fora de seus vértices;
No último caso, o vértice corresponde às bordas que cruzam a scan line.
No último caso, é necessário fazer uma transformação do vértice;
Esta transformação é necessária, senão o vértice é contabilizado duas vezes, uma para a scan line anterior e outra para a scan line atual;
Y + 1
Y X = Xanterior + 1 / m
.(a) (b)
V V
V´
a) Corresponde a situação original;
b) O vértice V foi deslocado para a scan line seguinte, e desta forma sua abscissa deve ser atualizada, conforme as equações:
ynovo = yanterior + 1
xnovo = xanterior + 1 / m
Com a transformação dos vértices, a borda trans-formada é retirada da lista atual de scan lines e é colocada na scan line seguinte já com os seus valores atualizados.
Transformando vérticesTransformando vértices Após analisar o polígono, verifica-se que as bordas mar-
cadas a seguir, devem ser transformadas (seu inicio deve passar para a próxima scan line ):
scan line 1 : b1 → b21 → b20 → b19 → b18 → b16
scan line 2 : b2
scan line 3 : b3 → b14
scan line 4 : b12
scan line 5 : b4 → b11
scan line 6 : b10
scan line 7 : b5 → b6 → b9
scan line 8 : b7 → b8
scan line 9 : scan line 10 :scan line 11 :scan line 12 :
Rearranjo das scan linesRearranjo das scan lines Após rearranjadas, as scan lines têm a seguinte compo-
sição: ( as bordas devem estar ordenadas pelo valor de X )
scan line 1 : [ 2 | 4 | -2 ] → [ 4 | 4 | 1/3 ] → [ 4 | 6 | -1/3 ] → [ 4 | 6 | 1/3 ]
scan line 2 : [ 4 | 8 1/3 | -2/3 ] → [ 3 | 14 1/2 | 3/2 ]
scan line 3 : [ 3 | 1 | -1 ]
scan line 4 : [ 5 | 1 | 0 ] → [ 4 | 10 | -3 ]
scan line 5 : [ 5 | 14 | 2 ]
scan line 6 : [ 9 | 1 1/2 | 1/2 ] → [ 6 | 14 | 0 ]
scan line 7 : [ 9 | 5 | -1 ] → [ 10 | 5 | 4/3 ] → [ 7 | 16 | 2 ]
scan line 8 : [ 10 | 11 | -1 ] → [ 11 | 11 | 2/3 ] → [ 11 | 15 1/4 | -3/4 ]
scan line 9 :
scan line 10 :
scan line 11 :
scan line 12 :
Cálculo das scan linesCálculo das scan lines Calcular agora as scan lines, utilizando a equação 1, até que seus respectivos
valores de Y sejam atingidos. A partir deste ponto elas não são mais calculadas, pois a borda terminou.( Estas estarão marcadas em lilás )
( as bordas devem continuar ordenadas pelo valor de X )
scan line 1 : [ 2 | 4 | -2 ] → [ 4 | 4 | 1/3 ] → [ 4 | 6 | -1/3 ] → [ 4 | 6 | 1/3 ]
scan line 2 : [ 2 | 2 | -2 ] → [ 4 | 4 1/3 | 1/3 ] → [ 4 | 5 2/3 | -1/3 ] → [ 4 | 6 1/3 | 1/3 ] → [ 4 | 8 1/3 | -2/3 ] → [ 3 | 14 1/2 | 3/2 ]
scan line 3 : [ 3 | 1 | -1 ] → [ 4 | 4 2/3 | 1/3 ] → [ 4 | 5 1/3 | -1/3 ] → [ 4 | 6 2/3 | 1/3 ] → [ 4 | 7 2/3 | -2/3 ] → [ 3 | 16 | 3/2 ]
scan line 4 : [ 5 | 1 | 0 ] → [ 4 | 5 | 1/3 ] → [ 4 | 5 | -1/3 ] → [ 4 | 7 | 1/3 ] → [ 4 | 7 | -2/3 ] → [ 4 | 10 | -3 ]
scan line 5 : [ 5 | 1 | 0 ] → [ 5 | 14 | 2 ]
scan line 6 : [ 9 | 1 1/2 | 1/2 ] → [ 6 | 14 | 0 ]
scan line 7 : [ 9 | 2 | 1/2 ] → [ 9 | 5 | -1 ] → [ 10 | 5 | 4/3 ] → [ 7 | 16 | 2 ]
scan line 8 : [ 9 | 2 1/2 | 1/2 ] → [ 9 | 4 | -1 ] → [ 10 | 6 1/3 | 4/3 ] → [ 10 | 11 | -1 ] → [ 11 | 11 | 2/3 ] → [ 11 | 15 1/4 | -3/4 ]
scan line 9 : [ 9 | 3 | 1/2 ] → [ 9 | 3 | -1 ] → [ 10 | 7 2/3 | 4/3 ] → [ 10 | 10 | -1 ] → [ 11 | 11 2/3 | 2/3 ] → [ 11 | 14 1/2 | -3/4 ]
scan line 10 : [ 10 | 9 | 4/3 ] → [ 10 | 9 | -1 ] → [ 11 | 12 1/3 | 2/3 ] → [ 11 | 13 3/4 | -3/4 ]
scan line 11 : [ 11 | 13 | 2/3 ] → [ 11 | 13 | -3/4 ]
Obtendo linhas de Obtendo linhas de preenchimentopreenchimento
O próximo e último passo é a obtenção das linhas de preenchimento ( scan line ) do polígono;
Para cada uma das scan lines obtidas no passo anterior, um segmento de reta que corresponde ao preenchimento do polígono é obtido tomando-se: o X da primeira borda da lista de bordas da scan
line para formar o X1 ;
o X da segunda borda da lista de bordas da scan line para formar o X2 ;
Desta forma o primeiro segmento de reta de preenchimento é formado pelos pontos P1 de coordenadas ( x1 , y ) e P2 de coordenadas ( x2 , y ), onde x1 e x2 são obtidos como mostrado no passo anterior, e y corresponde ao número da scan line.
Isto significa que um par de bordas na lista de scan line, forma um segmento de reta corres-pondente ao preenchimento daquela scan line.
Exemplo de PreenchimentoExemplo de Preenchimento
1 5 10 151
5
10
b1b2
b3
b4
b5 b6b7
b8b9
b10
b11b12
b13
b14 b15
b16b17
b18b19
b20b21
Figura 01
Desta forma, os segmentos de reta obtidos para o preenchimento do polígono, são os seguintes:
scan line 1 : ( 4 , 1 ) ( 4 , 1 )
( 6 , 1 ) ( 6 , 1 )
scan line 2 :( 2 , 2 ) ( 4 1/3 , 2 )
( 5 2/3 , 2 ) ( 6 1/3 , 2 ) ( 8 1/3 , 2 ) ( 14 1/2 , 2 )
scan line 3 :( 1 , 3 ) ( 4 2/3 , 3 )
( 5 1/3 , 3 ) ( 6 2/3 , 3 ) ( 7 2/3 , 3 ) ( 16 , 3 )
scan line 4 :( 1 , 4 ) ( 5 , 4 )( 5 , 4 ) ( 7 , 4 )( 7 , 4 ) ( 10 , 4 )
scan line 5 :( 1 , 5 ) ( 14 , 5 )
scan line 6 :( 1 1/2 , 6 ) ( 14 , 6 )
scan line 7 : ( 2 , 7 ) ( 5 , 7 )( 5 , 7 ) ( 16 , 7 )
scan line 8 :( 2 1/2 , 8 ) ( 4 , 8 )
( 6 1/3 , 8 ) ( 11 , 8 )( 11 , 8 ) ( 15 1/4 , 8 )
scan line 9 :( 3 , 9 ) ( 3 , 9 )( 7 2/3 , 9 ) ( 10 , 9 )( 11 2/3 , 9 ) ( 14 1/2 , 9 )
scan line 10 :( 9 , 10 ) ( 9 , 10 )( 12 1/3 , 10 ) ( 13 3/4 , 10 )
scan line 11 :( 13 , 11 ) ( 13 , 11 )
Otimização do métodoOtimização do método Pode-se otimizar o método:
Eliminando-se pontos da lista de scan lines; Exemplo na scan line 1;
Fundindo scan lines sequenciais. Exemplo na scan line 4.
Lista finalLista final scan line 2 :
( 2 , 2 ) ( 4 1/3 , 2 ) ( 5 2/3 , 2 ) ( 6 1/3 , 2 ) ( 8 1/3 , 2 ) ( 14 1/2 , 2 )
scan line 3 :( 1 , 3 ) ( 4 2/3 , 3 )
( 5 1/3 , 3 ) ( 6 2/3 , 3 ) ( 7 2/3 , 3 ) ( 16 , 3 )
scan line 4 :( 1 , 4 ) ( 10 , 4 )
scan line 5 :( 1 , 5 ) ( 14 , 5 )
scan line 6 :( 1 1/2 , 6 ) ( 14 , 6 )
scan line 7 : ( 2 , 7 ) ( 16 , 7 )
scan line 8 :( 2 1/2 , 8 ) ( 4 , 8 )
( 6 1/3 , 8 ) ( 15 1/4 , 8 )
scan line 9 :( 7 2/3 , 9 ) ( 10 , 9 )( 11 2/3 , 9 ) ( 14 1/2 , 9 )
scan line 10 :( 12 1/3 , 10 ) ( 13 3/4 , 10 )
Polígono PreenchidoPolígono Preenchido
1 5 10 151
5
10
b1b2
b3
b4
b5 b6b7
b8b9
b10
b11b12
b13
b14 b15
b16b17
b18b19
b20b21