INF 1366 – Computação Gráfica Interativa Clipping (Recorte)

Slides:



Advertisements
Apresentações semelhantes
Continuidade: sem interrupções
Advertisements

RECORTE DE FIGURAS Algoritmo proposto para Recorte de Segmentos (atribuído a Ivan Sutherland e Dan Cohen) Para o entendimento do algoritmo a ser proposto,
Árvores CC/EC/Mestrado Teoria dos Grafos ‏ 1.
Distâncias.
Retas.
Planos.
Real Time Rendering.
Computação Gráfica I Conteúdo: Professor:
Estratégias Pipelined
Geometria Computacional Galeria de Arte
29 Outubro 2005Funções: Zeros, Máximos e Mínimos1 Jorge Cruz DI/FCT/UNL Programação para as Ciências Experimentais 1º Semestre 2005/2006.
9 de Março de 2006Trajectória de um Projéctil1 Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2005/2006.
Posições relativas de duas retas
Programando com Alice Tim Margush Department of Computer Science University of Akron © 2006.
Computação Gráfica I Conteúdo: Professor: - Recorte 2D
2002 LCG/UFRJ. All rights reserved. 1 Arranjos Claudio Esperança Paulo Roma.
Claudio Esperança Paulo Roma Cavalcanti
Introdução à Computação Gráfica Recorte
Geometria Computacional Interseção de Segmentos
Interseção de Semiplanos
Geometria Computacional Fecho Convexo
Geometria Computacional Primitivas Geométricas
Claudio Esperança Paulo Roma
Algoritmos de Varrimento Avançados para Desenho de Primitivas 2D
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
Recorte e seleção de linhas e polígonos
Rasterização de linhas e polígonos
INF 1366 – Computação Gráfica Interativa Transformações
INF 1366 – Computação Gráfica Interativa
Alberto B. Raposo INF 1366 – Computação Gráfica Interativa Raytracing (resumo) POVRAY – Persistence of Vision Raytracer Alberto.
Linha de produção de imagens com o OpenGL™ (OpenGL Rendering Pipeline)
Descarte por visibilidade
INF 1366 – Computação Gráfica Interativa Iluminação e Shading
Alberto B. Raposo e Marcelo Gattass
INF 1366 – Computação Gráfica Interativa Eliminação de Superfícies Escondidas; Anti-Aliasing e Imagens Digitais Alberto B. Raposo
INF 1366 – Computação Gráfica Interativa Modelagem Geométrica
1 Professor Rogério B. de Andrade - Aula 001- Dez/2008 Técnicas e Linguagem de Programação.
Computação Gráfica: Rendering e Rasterização
Técnicas para algoritmos de superfície visível eficientes (Techniques for efficient visible-surface algorithms) Fabio Utzig Rodrigo Senger.
Análise do Lugar das Raízes
Introdução à Computação Gráfica Projeções
Operações em uma subdivisão planar 2D
Visão Computacional Shape from Shading
Aula 13 Derivação Implícita, derivadas das funções trigonométricas inversas e derivadas de funções logarítmicas.
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
Projeções Computação Gráfica.
Visualização 3D: Projeções
Estruturas de Dados Aula 14: Recursão 04/06/2014.
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Átila Valgueiro Malta Moreira Juliana Medeiros de Lucena Rafael Alberto.
UNIVERSIDADE CATÓLICA DE PELOTAS CENTRO POLITÉCNICO COMPUTAÇÃO GRÁFICA
Ray Tracing Daniel de Vasconcelos Campos. Tópicos Problema proposto Análise do problema Algumas Técnicas Pesquisadas Algoritmo Implementado.
Computação Gráfica – Transformações Projetivas
Introdução à complexidade de algoritmos Luiz Gonzaga da Silveira Junior.
Transformada de Hough Processamento global para a detecção de linhas retas numa imagem Nenhum conhecimento é necessário a respeito da posição das linhas.
INF 1366 – Computação Gráfica Interativa Rasterização
Prof. Edison Oliveira de Jesus
Computação Gráfica - Recorte
Geometria Computacional Fecho Convexo
Modelo e Câmera e Projeção no OpenGL
Geometria Computacional Prof. Walter Mascarenhas Segundo semestre de 2004 Aula 5.
The Cyclops Project German-Brazilian Cooperation Programme on IT CNPq GMD DLR Departamento de Informática e Estatística - INE/CTC/UFSC Computação Gráfica:
Alberto Raposo – PUC-Rio INF 1366 – Computação Gráfica Interativa Revisando... Alberto B. Raposo
Introdução à Computação Gráfica Visibilidade e Recorte
Computação Gráfica - Recorte Profa. Mercedes Gonzales Márquez.
Prof. Edison Oliveira de Jesus
Computação Gráfica - Amostragem Profa. Mercedes Gonzales Márquez.
Introdução à Computação Gráfica Rasterização
Linha de produção de imagens com o OpenGL™ (OpenGL Rendering Pipeline)
Computação Gráfica Interativa - Gattass
Transcrição da apresentação:

INF 1366 – Computação Gráfica Interativa Clipping (Recorte) Alberto B. Raposo e Marcelo Gattass abraposo@tecgraf.puc-rio.br http://www.tecgraf.puc-rio.br/~abraposo/INF1366/index.htm Alberto Raposo – PUC-Rio

Pipeline Gráfico Modeling Transformations Illumination (Shading) Cluter & Durand, MIT Modeling Transformations Illumination (Shading) Viewing Transformation (Perspective / Orthographic) Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display Alberto Raposo – PUC-Rio

Clipping (Recorte) Cluter & Durand, MIT  Modeling Transformations Partes do objeto fora do volume de visualização (view frustum) são removidas Illumination (Shading)  Viewing Transformation (Perspective / Orthographic) Clipping Projection (to Screen Space) Scan Conversion (Rasterization) Visibility / Display Alberto Raposo – PUC-Rio

Por que o recorte? Não perder tempo rasterizando objetos fora da janela de visualização! Classes de algoritmos: Pontos Linhas Polígonos Alberto Raposo – PUC-Rio

Ponto em retângulo xm ym x y xp yp 2.tol Os problemas de ponto são bastante simples. Basta compararmos as coordenadas do ponto (xp,yp) com as coordenadas da mouse (xm,ym) dentro da tolerância estabelcida. Ou seja: int pontInRect(int xm, int ym, float xp, float yp, float tol) { return ( (xp>=xm-tol) && (xp<=xm+tol) ) && ( (yp>=ym-tol) && (yp<=ym+tol) ); } int pontInRect(int xm, int ym, float xp, float yp, float tol) { return ( (xp>=xm-tol) && (xp<=xm+tol) ) && ( (yp>=ym-tol) && (yp<=ym+tol) ); } Alberto Raposo – PUC-Rio

Casos de clipping de linhas (x1, y1) (x2, y2) D A C (x’1, y’1) (x’2, y’2) B Os problemas de recorte e seleção de linhas são mais complicados como ilustra a Figura. Dada uma linha definida de (x1,y1) até (x2,y2) ela pode: (a) estar totalmente fora da janela e não ser desenhada (casos A e B); ou (b) estar totalmente dentro da janela e ser desenhada (caso C); ou (c) estar parcialmente dentro da janela e precisar ser recortada para um sub-segmento que vai de (x’1,y’1) até (x’2,y’2) antes de ser desenhada (casos D e E). Alberto Raposo – PUC-Rio

Casos Triviais Grande otimização: aceitar/rejeitar casos triviais D. Brogan, Univ. of Virginia Grande otimização: aceitar/rejeitar casos triviais Testar extremidades do segmento de reta Alberto Raposo – PUC-Rio

Aceitação Trivial Como saber se uma linha está totalmente dentro de uma janela? R: se ambas as extremidades estão dentro de todas as arestas da janela, a linha está totalmente dentro da janela Essa linha está trivialmente dentro Alberto Raposo – PUC-Rio

Rejeição Trivial Como saber se uma linha está totalmente fora de uma janela? R: se ambas as extremidades estão do mesmo lado (de fora) de uma aresta da janela, a linha pode ser rejeitada Essa linha está fora, mas não cai no caso trivial, pois as extremidades não estão do mesmo “lado“ de uma mesma aresta Essa linha está trivialmente fora Alberto Raposo – PUC-Rio

Recorte de Linhas em Relação ao Viewport D. Brogan, Univ. of Virginia Combinando casos triviais Aceitar (desenhar) linhas com ambos os pontos extremos dentro de todas as arestas da janela de visualização Rejeitar linhas com ambos extremos fora de uma mesma aresta da janela de visualização Reduzir outros casos aos casos triviais, encontrando intrerseções e dividindo os segmentos Alberto Raposo – PUC-Rio

Cohen-Sutherland Line Clipping Dividir janela de visualização em regiões definidas pelas arestas da janela Atribuir código (outcode) de 4 bits para cada região: Bit 1 indica que valor y dos pontos está acima de ymax Outros bits indicam relação com outros vértices da janela ymax 1001 1000 1010 xmax 0001 0000 0010 0101 0100 0110 Alberto Raposo – PUC-Rio D. Brogan, Univ. of Virginia

Cálculo do código de um vértice Outcode compOutCode(double x, double y, double xmin, double xmax, double ymin, double ymax) { Outcode code; code.top = 0, code.bottom = 0, code.right = 0, code.left = 0, code.all = 0; if (y > ymax) { code.top = 1; code.all += 8; } else if(y < ymin) { code.bottom = 1; code.all += 4; } if (x > xmax) { code.right = 1; code.all += 2; } else if(x < xmin) { code.left = 1; code.all += 1; return code; 1001 1000 1010 0001 0000 0010 0101 0100 0110 O algoritmo da Figura determina o código de um vértice através da comparação de suas coordenadas (x,y) com as coordenadas da janela de interesse (xmin, xmax, ymin, ymax). Notem que o campo all é determinado com a adição de 1, 2, 4 ou 8 caso o ponto esteja acima, abaixo, a diretia e a esquerda, respectivamente. As constantes decimais 1, 2, 4, e 8 tem representação binária 00000001, 00000010, 00000100 e 00001000 e por isto a adição define corretamente a posição do vértice. Notem tambem que a codificação os valores das bordas são considerados interiores a janela de interesse. Alberto Raposo – PUC-Rio

Cohen-Sutherland Line Clipping Para cada segmento de reta Atribua o outcode para cada extremo Se ambos outcodes = 0, aceitação trivial if (bitwise OR = 0) Caso Contrário bitwise AND para os outcodes dos vértices if result  0, rejeição trivial Alberto Raposo – PUC-Rio

Cohen-Sutherland Line Clipping Se a linha não cai nos casos triviais, subdividi-la de forma que um ou os dois segmentos possam ser descartados Selecione uma aresta da janela de visualização que a linha cruza Ache a interseção da linha com a aresta Descarte a parte do segmento do lado de fora da aresta e atribua novo outcode ao novo vértice Aplique os testes triviais; repetidamente se necessário D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Cohen-Sutherland Line Clipping D. Brogan, Univ. of Virginia Se a linha não cai nos casos triviais, subdividi-la de forma que um ou os dois segmentos possam ser descartados Selecione uma aresta da janela de visualização que a linha cruza Cheque as arestas na mesma ordem sempre Ex: top, bottom, right, left E D C B A Alberto Raposo – PUC-Rio

Cohen-Sutherland Line Clipping D. Brogan, Univ. of Virginia Ache a interseção da linha com a aresta A B D E C Alberto Raposo – PUC-Rio

Cohen-Sutherland Line Clipping D. Brogan, Univ. of Virginia Descarte a parte do segmento do lado de fora da aresta e atribua novo outcode ao novo vértice Aplique os testes triviais; repetidamente se necessário D C B A Alberto Raposo – PUC-Rio

Cohen-Sutherland Line Clipping D. Brogan, Univ. of Virginia Descarte a parte do segmento do lado de fora da aresta e atribua novo outcode ao novo vértice Aplique os testes triviais; repetidamente se necessário C B A Alberto Raposo – PUC-Rio

Interseção com Janela de Visualização (x1, y1), (x2, y2): interseção com aresta vertical direita: xright yintersect = y1 + m(xright – x1) onde m=(y2-y1)/(x2-x1) (x1, y1), (x2, y2): interseção com aresta horizontal de baixo: ybottom xintersect = x1 + (ybottom – y1)/m D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Algoritmo de Cohen-Sutherland void CohenSutherlandLineClipAndDraw(double x0, double y0, double x1, double y1, double xmin, double xmax, double ymin, double ymax, int value) { outcode outcode0, outcode1, outcodeOut, CompOutCode(); double x, y; boolean accept = FALSE, done = FALSE; outcode0 = CompOutCode(x0, y0, xmin, xmax, ymin, ymax); outcode1 = CompOutCode(x1, y1, xmin, xmax, ymin, ymax); do { if (outcode0.all == 0 && outcode1.all == 0) { accept = TRUE; done = TRUE; /* trivial draw and exit */ } else if((outcode0.all & outcode1.all) != 0) { done = TRUE; /* trivial reject and exit */ } else { if (outcode0.all != 0) outcodeOut = outcode0; else outcodeOut = outcode1; if (outcodeOut.top) { x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0); y = ymax; } else if(outcodeOut.bottom) { x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0); y = ymin; } else if(outcodeOut.right) { y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0); x = xmax; } else if(outcodeOut.left) { y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0); x = xmin; } if (outcodeOut.all == outcode0.all) { x0 = x; y0 = y; x1 = x; y1 = y; } /* Subdivide */ } while (!done); if (accept) DrawLineReal(x0, y0, x1, y1, value); O algoritmo de Cohen e Sutherland se baseia em 3 princípios: Se uma reta estiver totalmente acima, abaixo, a direita ou a esquerda a janela ela pode ser descartada. Ou seja, não precisa ser desenhada pois não tem interseção com a janela. Se estiver dentro da janela ela pode ser denhada como ela é. Ou seja, não precisa ser recortada. Se descartamos pedaços do segmento que estão acima, abaixo, a direita ou a esquerda o problema não se altera. Ou seja, podemos trocar uma segmento de reta por um sub-segmento tirando fora partes que estão fora. As tres condições acima podem ser re-escritas como: Se o segmento estiver totalmente acima, abaixo, a direita ou a esquerda os códigos dos dois vétices terão necessariamente o valor 1 (verdadeiro) na fronteira correspondente. Se fizermos um AND lógico nos dois códigos eles produzirão um resultado diferente de zero. Inversamente, se o AND codigo a código também resultar em algum valor igual a 1 isto significa que os dois vértices estão ou acima, ou abaixo, ou a direita ou a esquerda da janela. Para implementar este teste de maneira eficiente codificamos as quatro condições no campo all. Se o segmento estiver totalmente dentro ambos os códigos dos vértices tem valor 0 (falso). Se um segmento tem, por exemplo, um vértice com código 1 na fronteira superior da janela podemos trocar este vértice por outro que fica no segmento e tem como ordenada y=ymax. Ou seja, se trocarmos as coordenadas do vértice para: x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0) y = ymax Estamos descartando a parte de fora do segmento. O mesmo raciocínio se aplica para as outras fronteiras. É importante notarmos que no caso de recorte de linhas o algoritmo precisa ajustar ambos os vértices para produzir o sub-segmento que é interior a janela. Quando o problema é de seleção, e não de recorte, o algoritmo pode ser simplificado para recortar apenas um lado do segmento. Ou seja, só um vértice precisa se mover. Se o segmento de reta tiver interseção com a janela de seleção qualquer um dos vértices vai ficar com todos os códigos 0 (falso) quando forem descartadas as partes externas. O algoritmo de seleção é um caso particular do algoritmo de recorte e é deixado come exercício para o leitor. Alberto Raposo – PUC-Rio

Cohen-Sutherland Existem algoritmos mais eficientes Outcodes facilitam descoberta de casos triviais Melhor algoritmo quando casos triviais são comuns Os casos não triviais, por outro lado: Têm custo elevado Geram às vezes recortes redundantes Existem algoritmos mais eficientes Alberto Raposo – PUC-Rio

Equações Paramétricas Equações de reta Explícita: y = mx + b Implícita: Ax + By + C = 0 Paramétrica: linha definida por 2 pontos, P0 e P1 P(t) = P0 + (P1 - P0) t, onde P é vetor [x, y]T x(t) = x0 + (x1 - x0) t y(t) = y0 + (y1 - y0) t Alberto Raposo – PUC-Rio

Equação Paramétrica da Reta Descreve segmento (linha finita) 0 <=t <= 1 Define linha entre P0 e P1 t < 0 Define linha antes de P0 t > 1 Define linha depois de P1 Alberto Raposo – PUC-Rio

Linhas Paramétricas e Clipping Definir cada linha na forma paramétrica: P0(t)…Pn-1(t) Definir cada aresta da janela de visualização na forma paramétrica: PL(t), PR(t), PT(t), PB(t) Realiza testes de interseção de Cohen-Sutherland usando linhas e arestas apropriadas Alberto Raposo – PUC-Rio

Equações: Line / Edge Clipping Equações paramétricas permitem recortes mais eficientes Linha 0: x0 = x00 + (x01 - x00) t0 y0 = y00 + (y01 - y00) t0 x00 + (x01 - x00) t0 = xL0 + (xL1 - xL0) tL y00 + (y01 - y00) t0 = yL0 + (yL1 - yL0) tL Resolver para t0 e/ou tL View Window Edge L: xL = xL0 + (xL1 - xL0) tL yL = yL0 + (yL1 - yL0) tL D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Limitações de Cohen-Sutherland Só funciona para janelas de visualização retangulares Algoritmo para recorte em janelas convexas arbitrárias: Cyrus-Beck Alberto Raposo – PUC-Rio

Algoritmo de Cyrus-Beck Queremos otimizar o cálculo das interseções linha/linha Começa com equação paramétrica da linha: P(t) = P0 + (P1 - P0) t E um ponto e a normal de cada aresta da janela PL, NL Alberto Raposo – PUC-Rio

Algoritmo de Cyrus-Beck Encontre t tal que: NL [P(t) - PL] = 0 Substitua P(t) pela equação da linha: NL [P0 + (P1 - P0) t - PL] = 0 Encontre t t = NL [PL – P0] / -NL [P1 - P0] P1 PL NL P(t) Inside P0 D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Algoritimo de Cyrus-Beck Uma outra estratégia para recorte de segmentos de reta contra uma janela de interesse foi apresentada por Cyrus e Beck. Esta estratégia se baseia na análise dos pontos de interseção da reta suporte do segmento com as retas da janela de interesse. Um ponto importante deste algoritmo é que a janela pode ser qualquer polígono convexo. A determinação do ponto de inteseção, P(t), da reta suporte do segmento P0P1 com a reta suporte de uma aresta que passa pelo ponto PEi e tem como normal o vetor NEi pode ser determinada através de: a condição do P(t) pertencer a reta suporte de P0P1: P(t) =P0 + (P1-P0) t a condição do vetor PEiP(t) ser ortogonal a NEi: NEi(P(t)-PEi)=0 Produto escalar de 2 vetores Alberto Raposo – PUC-Rio

Algoritimo de Cyrus-Beck Estas duas condições resultam na expressão de t dada na Figura. Quando os pontos P(t) da reta suporte do segmento que estão no lado positivo da normal temos: NEi(P(t)-PEi)>0 Quando est Alberto Raposo – PUC-Rio

Algoritmo de Cyrus-Beck Compute t para a interseção da linha com todos as arestas da janela Descarte todos (t < 0) e (t > 1) Classifique as interseções restantes em Potentially Entering (PE) Potentially Leaving (PL) NL [P1 - P0] > 0 implica PL NL [P1 - P0] < 0 implica PE Alberto Raposo – PUC-Rio

Entrando ou Saindo ? Alberto Raposo – PUC-Rio Uma questão importante para o algoritmo é a determinação se o segment P0P1 está possivelmente entrando ou saindo da região. Se a normal das arestas apontar para fora, como mostra as figuras, ele estará entrando quando P0P1 tiver o sentido cotrário. Ou seja, NEi(P1 - P0)<0 Contrariamente ele estará saindo se NEi(P1 - P0)>0 Como a interseção é de retas suporte e não do segmento e da aresta em si, não podemos garantir que este ponto seja realmente um ponto de entrada ou saida da região. Na próxima Figura vemos casos onde a interseção se dá fora do segmento e/ou da areasta. Por isto a palavra “possivelmente”. Alberto Raposo – PUC-Rio

Cálculo das interseções PL C PL PE A PL PL PL PE PE B PL PE PE Esta Figura ilustra tres sitações que uma areta pode estar com uma janela: (A) a aresta A tem 2 pontos de possivel entrada e dois pontos de saída e o segmento interno vai do último ponto de entrada ao primeiro de saída; (B) a aresta B mostra a mesma coisa eo resultado é o mesmo, a diferença está em que o primeiro ponto de entrada e o último ponto de saída estão fora do segmento; (C) a aresta C está fora da janela de interesse, uma maneira de caracterizar esta situação consiste em observar que o primeiro ponto de saída ocorre antes do último ponto de entrada. PE Alberto Raposo – PUC-Rio

Algoritmo de Cyrus-Beck Para cada reta: Ache o PE com maior t Ache o PL com menor t Recorte nesses 2 pontos D. Brogan, Univ. of Virginia PE PL P1 P0 Alberto Raposo – PUC-Rio

Cyrus-Beck - caso geral { Calcule Ni e escolha um PEi para cada aresta tE = 0; tL = 1; for(cada aresta ){ if (Ni.(P1-P0)!=0 ){ /* aresta não é paralela ao segmento */ calcule t; use sign of Ni.(P1-P0) para categorizar como PE ou PL; if( PE ) tE = max(tE, t); if( PL ) tL = min(tL, t); } else { /* aresta paralela ao segmento */ if (Ni.(P0-PEi) > 0) /* está fora */ return nil; } if(tE > tL) else return P(tE) and P(tL) as true clip intersections; A Figura mostra um pseudo-código do algoritmo de Cyrus-Beck. Alberto Raposo – PUC-Rio

Caso particular: Liang e Barsky Janela retangular: linhas de recorte horizontais e verticais: Normais: (-1, 0), (1, 0), (0, -1), (0, 1) Soluções para t: -(x0 - xleft) / (x1 - x0) (x0 - xright) / -(x1 - x0) -(y0 - ybottom) / (y1 - y0) (y0 - ytop) / -(y1 - y0) Alberto Raposo – PUC-Rio

Liang e Barsky Ei NEi PEi t y x ymax ymin xmin xmax left: x = xmin (-1, 0) (xmin, y) -(x0-xmin) (x1-x0) right: x = xmax (1, 0) (xmax, y) (x0-xmax) -(x1-x0) bottom: y = ymin (0,-1) (x, ymin) -(y0-ymin) (y1-y0) top: y = ymax (0, 1) (x, ymax) (y0-ymax) -(y1-y0) Liang e Barky propuseram um mesmo algoritmo restrito para janelas retangulares e alinhadas com os eixos cartesianos. Nesta situação o cálculo do parametro t fica bem mais simplificado como ilustra a Figura. Alberto Raposo – PUC-Rio

Comparação Cohen-Sutherland Cyrus-Beck Clipping repetitivo é caro Melhor utilizado quando a maioria das linhas se encaixam nos casos de aceitação e rejeição triviais Cyrus-Beck Cálculo de t para as interseções é barato Computação dos pontos (x,y) de corte é feita apenas uma vez Algoritmo não considera os casos triviais Melhor usado quando a maioria das linhas precisa ser recortada D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Recorte de Polígonos Mais complicado Ainda mais quando polígono é côncavo Alberto Raposo – PUC-Rio Cluter & Durand, MIT

Recorte de Polígonos Mais complexo que corte de linhas Input: polígono Output: polígono original, novo(s) polígono(s), ou nada A melhor otimização são os casos de aceitação ou rejeição trivial… Alberto Raposo – PUC-Rio

Tarefa complicada!!! O que pode acontecer com um triângulo? Possibilidades: triângulo  quad triângulo  triângulo triângulo  5-gon Quantos lados pode ter um triângulo recortado? D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Quantos lados? Sete… D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Tarefa complicada!!! Polígono côncavo  múltiplos polígonos D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Algoritmo de Sutherland-Hodgman Idéia básica: Considerar cada aresta da janela de visualização individualmente Recortar o poligono pela equação de cada aresta D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping Idéia básica: Considerar cada aresta da janela de visualização individualmente Recortar o poligono pela equação de cada aresta Depois de fazer isso para todas as arestas, o polígono está completamente recortado Alberto Raposo – PUC-Rio D. Brogan, Univ. of Virginia

Sutherland - Hodgman Clip contra uma aresta (plano) de cada vez    O recorte de polígonos não pode ser implementado como uma sequencia de recortes de suas arestas. A ordem dos vértices na definição do polígono é importante e precisa ser preservada. Por outro lado, o recorte de uma polígono em uma sequencia de areastas da janela também é complicada. O algoritmo de Hodgman e Suterland divide o problema de recorte de um polígonos contra uma janela convexa de n arestas em n problemas de recorte de um polígono contra cada uma das retas suporte da arestas, como ilustra a Figura. Alberto Raposo – PUC-Rio 

Sutherland-Hodgman Clipping Input/output do algoritmo Input: lista ordenada dos vértices do polígono Output: lista dos vértices recortados, com alguns vértices originais (possivelmente) e outros novos (possivelmente) D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping Aresta de s a p se enquadra em um dos 4 casos: (Linha azul pode ser reta ou plano) inside outside s p p output inside outside s p i output inside outside s p no output inside outside s p i output p output Alberto Raposo – PUC-Rio D. Brogan, Univ. of Virginia

Clipping de polígonos (Hodgman & Suterland) Para cada aresta (plano) teste um segmento de cada vez Existem quatro casos possiveis para um vértice e seu antessessor interno saindo externo entrando    S P guarde I, P I  S P guarde P S P guarde I I S P O recorte de um polígono com relação a uma reta suporte é bastante simples. Considere na Figura as quatro situações que um vértice e seu antessessor. O algoritmo inicia criando uma lista vazia para os vértices do polígono recortado e determina se o primeiro vértice e estabelece se ele é interior (casos a ou b) ou exterior (casos c ou d). A partir dai o algoritmo analiza a posição do próximo vértice e em função da sua posição define se está no caso a, b, c ou d. P Se os vértices S e P estiverem na posição (a) ele deve ser colocado na lista de vértices do polígono recortado. Se estiverem nas situação (b) o vértice I de interseção da aresta SP com a aresta de recorte deve ser armazenado. Se estiverem na posição (c) o vértice é simplesmente ignorado, ou seja o algoritmo não faz nada neste passo. Finalmente, se estiverem na posição (d) a posição da interseção é computada e ambos ou vértice I e P são colocados na lista do polígono recortado. O algoritmo prossegue para a próxima aresta do polígono, ou seja, o vértice P se torna S e o próximo vértice se torna P. Após todos os vértices do polígono original terem sido visitados o algoritmo termina fazendo o primeiro vértice como o vértice P. (a) (b) (c) (d) Alberto Raposo – PUC-Rio

Sutherland-Hodgman Clipping 4 casos: s e p dentro do plano Coloque p para output (guarde p) Nota: s já estaria no output pela aresta anterior s dentro do plano e p fora Ache ponto de interseção i guarde i s e p fora do plano Não coloque nada no output s fora do plano e p dentro guarde i, e também p D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

Clipping de polígonos (Exemplo 1)  S P Ação 2 1 2 x A 3 2 3 store A,3 1 4 3 4 store 4 4 5 store 5 6 B 5 5 6 store B 6 1 x A Figura mostr um exemplo do algoritmo aplicado ao polígono 1,2,...6. O resultado é o polígono definido pelos vértices A,3,4,5,B. Alberto Raposo – PUC-Rio

Clipping de polígonos (Exemplo 2) 3 A 6 B S P  Ação x x x x D C 1 2 store A 3 x 4 store B,4 5 store 5 6 store C store D,1 1 5 4 A Figura ilusta um caso em que o recorte de um polígono gera duas áreas conectadas por arestas infinitesimais. A D C B 1 5 4 Alberto Raposo – PUC-Rio

Clipping de polígonos (Exemplo 2)  A B S P Ação x x x x E D C A B store B x B 4 store E 1 x 4 5 F 4 5 store F,5 5 C store C C D store D D 1 x 1 A store 1, A A Figura ilustra o recorte do polígona da Figura anterior submetido a uma nova fronteira. B, E, F, 5, C, D, 1, A Alberto Raposo – PUC-Rio

Teste Point-to-Plane D. Brogan, Univ. of Virginia Teste geral para verificar se ponto p está “dentro” de um plano P, definido por q e n: (p - q) • n < 0: p “dentro” de P (p - q) • n = 0: p exatamente em P (p - q) • n > 0: p “fora” de P Lembrar que: p • n = |p| |n| cos (q) q = ângulo entre p e n P n p q Alberto Raposo – PUC-Rio

Interseção Linha-Plano Aresta intercepta plano P onde L(t) está em P q é ponto em P n é a normal ao plano P (L(t) - q) • n = 0 (L0 + (L1 - L0) t - q) • n = 0 t = [(q - L0) • n] / [(L1 - L0) • n] O ponto de interseção i = L(t) para o valor de t encontrado acima Alberto Raposo – PUC-Rio D. Brogan, Univ. of Virginia

Weiler-Atherton Clipping Estratégia: “caminhar” pelas bordas do polígono e da janela Polígonos são orientados no sentido anti-horário (CCW) Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Weiler-Atherton Clipping Encontre pontos de interseção Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Weiler-Atherton Clipping Marque os pontos onde o polígono entra na janela de recorte Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Weiler-Atherton Clipping Enquanto houver interseção de entrada não processada: “caminhar” pelas bordas do polígono ou da janela Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Regras da “caminhada” Par In-to-out: Grave o ponto de interseção Caminhe pela aresta do polígono (ccw) Par Out-to-in: Caminhe pela aresta da janela (ccw) Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Regras da “caminhada” Par In-to-out: Grave o ponto de interseção Caminhe pela aresta do polígono (ccw) Par Out-to-in: Caminhe pela aresta da janela (ccw) Alberto Raposo – PUC-Rio

Regras da “caminhada” Par In-to-out: Grave o ponto de interseção Caminhe pela aresta do polígono (ccw) Par Out-to-in: Caminhe pela aresta da janela (ccw) Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Regras da “caminhada” Par In-to-out: Grave o ponto de interseção Caminhe pela aresta do polígono (ccw) Par Out-to-in: Caminhe pela aresta da janela (ccw) Alberto Raposo – PUC-Rio

Weiler-Atherton Clipping Enquanto houver interseção de entrada não processada: “caminhar” pelas bordas do polígono ou da janela Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Weiler-Atherton Clipping Enquanto houver interseção de entrada não processada: “caminhar” pelas bordas do polígono ou da janela Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Weiler-Atherton Clipping Enquanto houver interseção de entrada não processada: “caminhar” pelas bordas do polígono ou da janela Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Weiler-Atherton Clipping Enquanto houver interseção de entrada não processada: “caminhar” pelas bordas do polígono ou da janela Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Dificuldades E se um vértice do polígono está na borda da janela? E se estiver “quase” na borda? Problema de precisão Welcome to the real world of geometry! Cluter & Durand, MIT Alberto Raposo – PUC-Rio

Informações Adicionais Peter Shirley. Fundamentals of Computer Graphics, A K Peters, Ltd., Natick, MA, USA, 2002. Foley, J. D., Van Dam, A., Feiner, S. K., e Huhes, J. F., Phlips, L. R., Introduction to Computer Graphics,  Addison-Wesley, 1995. D. F. Rogers, Procedural Elements for Computer Graphics, McGraw-Hill, 1988. Marcelo Gattass: notas de aula. http://www.tecgraf.puc-rio.br/~mgattass/cg.html Alberto Raposo – PUC-Rio