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