1 Introdução ao Processamento e Síntese de imagens Recorte 2D Fontes: Rogers, D. F. Procedural Elements for Computer Graphics Traina, A. J. M. & Oliveira, M. C. F. (2004) 2016
2 Recorte - (Clipping) Numa cena tridimensional, normalmente não é possível ver todas as superfícies de todos os objetos. Assim, essa técnica se preocupa em eliminar objetos ou partes deles não visíveis. Existem várias abordagens de recorte: Recorte da primitiva antes da conversão matricial - cálculo analítico das suas intersecções com o retângulo de recorte/visualização. Esses pontos de intersecção são os novos vértices da primitiva recortada. (Espaço Objeto) Conversão do polígono para o modo raster, mas traçar apenas os pixels visíveis no retângulo de visualização. Verificar cada pixel contra o retângulo de visualização. (Espaço Imagem)
3 Espaço do Objeto x Espaço da Imagem Métodos que trabalham no espaço do objeto Entrada e saída são dados geométricos Independente da resolução da imagem Menos vulnerabilidade a aliasing Rasterização ocorre depois Exemplos: Maioria dos algoritmos de recorte e culling Recorte de segmentos de retas Recorte de polígonos
4 Espaço do Objeto x Espaço da Imagem Métodos que trabalham no espaço da imagem Entrada é vetorial e saída é matricial Dependente da resolução da imagem Visibilidade determinada apenas em pontos (pixels) Podem aproveitar aceleração por hardware Exemplos: Z-buffer Algoritmo de Warnock Mapas de sombra
Recorte bidimensional 5 - definir quais pontos, linhas ou partes das linhas estão dentro da janela de recorte. Teste para ponto xl x xr e yb y yt YT os pontos nas bordas da janela pertencem a janela de visualização. XL YB XR
Teste para Linhas Linha ab: extremos dentro da janela linha toda dentro Linha gh: extremos fora da janela parte da linha na janela Linhas ij: os extremos estão totalmente a esquerda, a direita, acima ou abaixo da janela linhas invisiveis Reta análise dos extremos Posição na janela de Estado da reta Extremo 1 Extremo 2 recorte Dentro Dentro Reta interna Visível Dentro Fora Tem intersecção Parcialmente Visível Fora Fora 2 extremos à direita 2 extremos à esquerda 2 extremos acima Invisível 2 extremos abaixo Qualquer posição indefinida Os testes acima não eliminam as linhas: gh que são parcialmente visíveis e kl são totalmente invisiveis. 6
7 Dan Cohen e Ivan Sutherland desenvolveram um teste, usando uma codificação com 4 dígitos (bit), indicando qual das nove regiões contém o extremo da linha. Convenção: Quadro de visibilidade Não Não Não Não Sim Não Não Não Não - o bit + a direita é o 1 o bit - os bits recebem o valor zero ou um: 4 o 3 o 2 o 1 o - 1 o bit = 1, se o extremo da linha está à esquerda da janela, senão zero; - 2 o bit = 1, se o extremo da linha está à direita da janela, senão zero; - 3 o bit = 1, se o extremo da linha está abaixo da janela, senão zero; - 4 o bit = 1, se o extremo da linha está acima da janela, senão zero; - T 1001 1000 1010 0001 0000 0010 B 0101 0100 0110 L R
8 Desta forma o código da linha pode ser utilizado para eliminar linhas totalmente invisíveis, segundo o seguinte critério: TRUE = T, FALSE = F T e F = F 1 e 0 = 0 F e T = F F = 0 0 e 1 = 0 F e F = F T = 1 0 e 0 = 0 T e T = T 1 e 1 = 1 Assim, quando a interseção bit a bit (lógico) dos extremos não é zero linha é totalmente invisível, podendo se recortada. Quando a interseção lógica é zero a linha pode ser totalmente visível, parcialmente visível ou totalmente invisível.
9 Assim, para eliminar a dúvida devem-se analisar os códigos dos extremos das linhas isoladamente. i 3 e i g j 2 f i j a 4 h b j k c l d i j Fazer
Preencher com códigos dos extremos. 10 Linh a ab ij ij ij ij cd ef gh kl Código Inicio Fim Interseção Lógica Comentários
11 Linha Código Interseção inicio Fim Lógica Comentários ab 0000 0000 0000 Totalmente visível ij 0010 0110 0010 Totalmente invisível ij 1001 1000 1000 Totalmente invisível ij 0101 0001 0001 Totalmente invisível ij 0100 0100 0100 Totalmente invisível cd 0000 0010 0000 Parcialmente invisível ef 0001 0000 0000 Parcialmente invisível gh 0001 1000 0000 Parcialmente invisível kl 1000 0010 0000 Totalmente invisível
12 Para obter eficiência no processo de recorte deve-se realizar o procedimento por etapas: - 1 o : utilizando o algoritmo de código que eliminam as linhas totalmente visíveis, e as realmente invisíveis. - 2 o : combinando com um segundo procedimento, das quais alguns serão vistos.
13 Processo de interseção de linhas. Assim, as linhas que não podem ser identificadas passam por um novo processo. - uma reta pode ser definida por dois pontos P1(x1, y1) e P2(x2, y2) - cuja equação pode ser definida por: - y = m (x x1) + y1 ou y = m (x x2) + y2 onde: - m = (y2 y1)/(x2 x1)
Para encontrar a intersecção da reta com a janela de recorte. 14 Y t Y= m(x X 1 ) + Y 1 X l X r Y b a interseção com a aresta da janela é dada por: - esquerda xl, y = m (xl x1) + y1 - direita xr, y = m (xr x1) + y1 - Topo yt, x = (1/m) (yt y1) + x1 - Baixo yb, x = (1/m) (yb y1) + x1
15 Algoritmo sem otimizações força bruta: Verificar se os extremos estão dentro da janela de recorte sim: pintar a linha (Retas totalmente visível) verificar se os dois extremos da reta estão totalmente fora da janela de recorte os 2 à esquerda, ou os 2 à direita, ou os 2 acima ou os 2 baixo da arestas da janela não pintar a linha (Retas totalmente invisível) caso não atenda nenhum dos dois caso anteriores: o para cada aresta da janela calcular a interseção com cada reta, verificando se é válida (a interseção deve pertencer aos dois segmentos - aresta e reta) ; e
16 classificar as retas, conforme o número de interseções: 0, 1 ou 2. P1 P3 I2 I1 X l P2 P5 X r I3 Y t Y b P4 P6 0 (P5P6) reta não é visível não pintar 1 (P1P2) um ponto interno e outro externo: do ponto fora até a interseção não pintar; da interseção até o ponto interno (0000) pintar. o 2 (P3P4) dois pontos externos, gerar 3 retas; pintar o segmento entre as interseções não pintar dos extremos a interseção.
17 Recorte de linha para contornos convexos generalizados Pode ser aplicada em janelas de recorte giradas em relação ao sistema de coordenadas. Reta P1P2 pode ser escrita de forma paramétrica, que é independente do sistema de coordenadas. P(t) = P1 + (P2 - P1) t 0 t 1 (define um seg. de reta) x(t) = x1 + (x2 - x1) t 0 t 1 y(t) = y1 + (y2 - y1) t 0 t 1 Recorte utilizando uma janela retangular 1 das coordenadas de interseção é conhecida, só resta calcular a outra. t = (P(t) P1)/(P2 P1)
18 Y T x(t) = x1 + (x2 - x1) t y(t) = y1 + (y2 - y1) t X L X R Y B Para a janela: Aresta esq. tl = (xl x1)/(x2 x1) 0 t 1 Aresta dir. tr = (xr x1)/(x2 x1) 0 t 1 Aresta sup. tt = (yt y1)/(y2 y1) 0 t 1 Aresta inf. tb = (yb y1)/(y2 y1) 0 t 1
19 Reta com valor de t fora do campo (0 1) é descartada, ele representa ponto fora da janela de visualização. Exercício: Calcular os valores de tl, tr, tt e tb para as 2 retas.
Exemplo: linha P 1 (-3/2, -3/4) a P 2 (3/2, ½), janela de recorte (x L = -1, x R = 1, x B = -1, x T = 1) Valores de t = (t L = 1/6, t R = 5/6, t B = -1/5, t T = 7/5) Os valores 1/5 e 7/5 estão fora do intervalo, são rejeitados. Assim: 1/6 t 5/6 - substituindo estes extremos na equação da reta têm-se: t = 1/6 x = -1 e y = -13/24 t = 5/6 x = 1 e y = 7/24 Linha Parcialmente Visível P3(-5/2, -1) e P4(3/2, 2): t L = 3/8, t R = 7/8, t B = 0, t T = 2/3) ordenar crescente: 0, 3/8, 2/3, 7/8 Pegar máximo dos mínimos e mínimo dos máximos. 20
21 Problemas: quando as linhas são totalmente visíveis e totalmente invisíveis, pois, nos dois casos, todos os valores de t estão fora do intervalo. P 1 (-½, ½), P 2 (½, -½) P 3 (3/2, -½), P 4 (2, ½) 1 P4 - p/ P 1 P 2 : t (t L = -1/2, t R = 3/2, t B = 3/2, t T = -1/2) - p/ P 3 P 4 : t (t L = -5, t R = -1, t B = -1/2, t T = 3/2) -1 P1 1-1 P2 P3
22 Algoritmo sem otimizações 4 bits Subdivisão de Sutherland-Cohen para recorte de linha aplica-se o teste dos 4 bits (como programar isso?) Janela de recorte código dos bits YT V[i] = 0 p/ i=0;3 XL YB XR if(xi XL)v[3] = 1 if(xi < XL)v[3] = 1 if(xi XR)v[2] = 1 if(xi > XR)v[2] = 1 if(yi YB)v[1] = 1 ou if(yi < YB)v[1] = 1 if(yi YT)v[0] = 1 if(yi > YT)v[0] = 1
Divisão da reta em duas partes iguais ( 2) Divisão em bits: n o 6 0110, deslocado um bit para a direita = 0011 - n o 3 Tabela 1 Representação dos números nas bases binária e decimal. Base 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 binária Base 0 1 2 3 4 5 6 7 8 9 10 decimal Conversão base binária para decimal - b0*2 n + b1*2 n-1 + b2*2 n-2 +...+ bn-1*2 1 + bn*2 0 Onde: n é o número de dígitos menos 1; b0 é o dígito mais significativo; e bn é o bit menos significativo. Ex: 1 0 1 1 0 1 [n = 6-1 = 5]; val = 1*2 5 + 0*2 4 +1*2 3 +1*2 2 +0*2 1 + 1*2 0 = 45 Calcular o valor o número binário:1 1 0 1 1 1 59 23
Conversão base decimal para binária 1º início {a) nu = INT(nd/2); b) bit = nd nu*2;} nd base decimal 2º e demais operações fazer {a) e b)- com nd = nu } até o valor (nd=1) 3º o valor binário será definido pela concatenação dos bits: nd+bit (de cada divisão da última até a 1ª. Ex: 45 : nd = 45; nd 45 2= 22 2= 11 2= 5 2= 2 2= 1 bit 1 0 1 1 0 Resto de cada operação Número binário = 1 0 1 1 0 1 (contrário) Calcular o valor do número decimal: 67 1000011 24
Subdivisão do ponto médio Algoritmo muito eficiente para implementação em hardware, pois as operações de divisão e adição por 2 em hardware são muito rápidas. O algoritmo utiliza o código de linhas associada à técnica de dividir a linha em duas partes iguais. 25 Procedimento: um teste inicial é aplicado para detectar linhas visíveis, invisíveis ou parcialmente visíveis ou invisíveis; linhas para as quais o teste inicial falha, são divididas em duas partes iguais: - x m = (x 1 +x 2 )/2 y m = (y 1 +y 2 )/2
Reta f subdivisões produzem duas retas, um que é realmente invisível (que é excluído), e a outra com a mesma característica da original, o procedimento continua até que todos os segmentos sejam realmente invisíveis ou até atingir a precisão especificada. Reta c 1 a subdivisão produz dois segmentos com características semelhantes, parcialmente visíveis. O procedimento deve-se concentrar em um dos extremos, por vez, realizando novas subdivisões até que uns dos extremos dos segmentos de retas coincidam com uma das arestas da janela, dentro do critério de precisão. Este ponto é declarado o ponto visível mais distante do outro extremo. 26
Identificação de polígonos convexos Produto Vetorial: A identificação pode ser realizada pelo produto vetorial das arestas adjacentes. Analisando o sinal a partir do produto: - todos zero polígono colinear (linhas paralelas). - positivo e negativo polígono côncavo. - positivos ou zeros polígono convexo, ponto à direita da linha. - negativos ou zeros polígono convexo, ponto à esquerda da linha. (10,10) (10,10) (10,10) 27 (10,5) (9,5) (11,5) (10,0) (10,0) (10,0)
28 O produto vetorial de dois vetores planares, definido por três pontos (vértice central - V2) resulta em: n 1 - (x 1, y 1 ) 2 - (x 2, y 2 ) 3 - (x 3, y 3 ) n = [(x 1 - x 2 ) (y 2 - y 3 ) - (x 2 - x 3 ) (y 1 - y 2 )] k
Translação e rotação Algoritmo: - Para cada vértice do polígono, transladar o polígono de tal forma que i-ésimo vértice esteja na origem. - Rotacione o polígono de tal forma que o (i + 1)-ésimo vértice fique sobre o eixo x (positivo). - Examine o sinal do (i+2) ésimo vértice. - Se todas as coord. Y do (i+2) ésimo vértice tem o mesmo sinal o polígono é convexo; senão é côncavo. - Se todas as coord. Y do (i+2) ésimo vértice são nulos é um polígono degenerado (linha). - Em cada aresta do polígono, a normal interna tem componente y com o mesmo sinal do (i+2) ésimo vértice, e os outros iguais a zero. - Determinando a direção da normal original, somente a rotação inversa deve ser aplicada. 29
30
31