A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Prof. Edison Oliveira de Jesus

Apresentações semelhantes


Apresentação em tema: "Prof. Edison Oliveira de Jesus"— Transcrição da apresentação:

1 Prof. Edison Oliveira de Jesus
COMPUTAÇÃO GRÁFICA Aula 03 Prof. Edison Oliveira de Jesus

2 Assuntos abordados nesta aula
Preenchimento de Polígonos

3 Representaçã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 vn P

4 Construção de um polígono
v2 v1 draw draw draw v5 draw v3 draw v4

5 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;

6 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 a´´ unidades a´ unidades A´´´ unidades a´´´´ unidades v4 v3

7 Outra representação Vetorial com estrutura da linguagem:
Estrutura PONTO x, y PONTO coordenadas[10]

8 Métodos de preenchimento do polí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 ).

9 Problemas 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;

10 Algoritmo FLOOD algoritmo 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-se Fim-algoritmo

11 Métodos de preenchimento do polí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;

12 Bounding Box É o retângulo que circunda o polígono.

13 Preenchimento Scan line 1 Borda direita Borda esquerda Borda direita

14 Algoritmo Algoritmo 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 xs ← x enquanto ( não aceso ( x, y ) ) faça fim_enquanto // achou margem direita linha ( xs, y, x, y ) // scan line fim_se até x ≥ xmax fim_para fim_algoritmo

15 Preenchimento convexo
Convexo horizontal Não convexo

16 Preenchimento 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.

17 Problemas do método Traçar scan lines erradas.

18 Preenchimento de polígonos em geral
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;

19 Calculando os pontos de interseção
A interseção de uma scan line com uma borda do polígono é dada da seguinte forma: borda Y P2 ( x2 , y2 ) Pnovor( Xnovor Yscan line anterior + 1) Scan line nova Scan line anterior Panterior( Xanterior Yscan line anterior ) P1 ( x1 , y1 ) X

20 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

21 Como x1 e x2 são conhecidos, o ponto p ( xnovo, yscan line )
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 )

22 m = 1 / ( xnovo – x1 ) xnovo = x1 + 1 / m da equação 1, tem-se:
E logo: xnovo = x1 + 1 / m e: Yscan line corresponde à y da linha scan line em estudo;

23 Como o processo é repetido para cada scan line, pode-se escrever:
Xnovo = Xanterior / m equação ( 2 )

24 Y Nova scan line Scan line anterior X xanterior xnovo

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

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

27 Exemplo de Preenchimento
1 5 10 15 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21 Figura 01

28 Vetor com os apontadores das scan lines
00 01 02 03 04 05 06 07 08 09 10 11 12 λ b1 b2 b3 b13 b4 b10 b5 b7 λ λ λ λ b21 b14 b12 b11 b6 b8 b20 b15 b9 Figura 02 b19 b18 Isto significa que da scan line 01 têm inicio as bordas 1, 21, 20, 19, 18, 17 e 16 b17 b16

29 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;

30 Estrutura 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

31 Lista 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

32 Exemplo de Preenchimento
1 5 10 15 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21 Figura 01

33 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 ]

34 Observe alguns casos especiais: 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 ]

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

36 1 5 10 15 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21

37 Vetor de Scan Lines com as bordas
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 ]

38 Vetor de Scan Lines com as bordas

39 Transformaçã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 ) Não entra na lista Não entra na lista Entra na lista Não entra na lista Entra na lista Figura 04

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

41 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 V V Y X = Xanterior + 1 / m . (a) (b)

42 ynovo = yanterior + 1 xnovo = xanterior + 1 / m
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

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

44 Transformando 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 :

45 Rearranjo 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 ]

46 scan line 6 : [ 9 | 1 1/2 | 1/2 ] → [ 6 | 14 | 0 ]

47 Cá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 ]

48 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 ]

49 Obtendo linhas de preenchimento
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 ;

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

51 Exemplo de Preenchimento
1 5 10 15 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 b18 b19 b20 b21 Figura 01

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

53 scan line 3 : ( 1 , 3 ) ( 4 2/3 , 3 ) ( 5 1/3 , 3 ) ( 6 2/3 , 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 )

54 ( 2 , 7 ) ( 5 , 7 ) scan line 6 : scan line 7 : ( 5 , 7 ) ( 16 , 7 )
( 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 )

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

56 Otimizaçã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.

57 Lista final ( 1 , 3 ) ( 4 2/3 , 3 ) 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 )

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

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

60 Polígono Preenchido b8 10 b7 b9 b6 b5 b4 b10 b11 5 b12 b13 b3 b15 b20

61 Fim da apresentação


Carregar ppt "Prof. Edison Oliveira de Jesus"

Apresentações semelhantes


Anúncios Google