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

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

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

Apresentações semelhantes


Apresentação em tema: "INF 1366 – Computação Gráfica Interativa Clipping (Recorte)"— Transcrição da apresentação:

1 INF 1366 – Computação Gráfica Interativa Clipping (Recorte)
Alberto B. Raposo e Marcelo Gattass Alberto Raposo – PUC-Rio

2 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

3 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

4 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

5 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

6 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

7 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

8 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

9 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

10 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

11 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

12 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 , , e 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

13 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

14 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

15 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

16 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

17 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

18 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

19 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

20 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

21 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

22 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

23 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

24 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

25 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

26 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

27 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

28 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

29 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

30 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

31 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

32 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

33 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

34 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

35 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

36 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

37 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

38 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

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

40 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

41 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

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

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

44 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

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

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

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

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

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

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

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

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

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

54 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

55 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

56 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

57 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

58 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

59 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

60 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

61 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

62 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

63 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

64 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

65 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

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

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

68 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

69 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

70 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

71 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

72 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

73 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

74 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

75 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

76 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

77 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

78 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. Alberto Raposo – PUC-Rio


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

Apresentações semelhantes


Anúncios Google