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

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

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

Apresentações semelhantes


Apresentação em tema: "Alberto Raposo – PUC-Rio INF 1366 – Computação Gráfica Interativa Clipping (Recorte) Alberto B. Raposo e Marcelo Gattass"— Transcrição da apresentação:

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

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

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

4 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

5 Alberto Raposo – PUC-Rio Ponto em retângulo xmxm ymym x y xpxp ypyp 2.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) ); }

6 Alberto Raposo – PUC-Rio Casos de clipping de linhas A B C E (x 1, y 1 ) (x 2, y 2 ) D (x 1, y 1 ) (x 2, y 2 )

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

8 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

9 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

10 Alberto Raposo – PUC-Rio Recorte de Linhas em Relação ao Viewport 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 D. Brogan, Univ. of Virginia

11 Alberto Raposo – PUC-Rio Cohen-Sutherland Line Clipping y max x max –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 y max Outros bits indicam relação com outros vértices da janela D. Brogan, Univ. of Virginia

12 Alberto Raposo – PUC-Rio 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; }

13 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

14 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

15 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 –Cheque as arestas na mesma ordem sempre Ex: top, bottom, right, left A B D E C D. Brogan, Univ. of Virginia

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

17 Alberto Raposo – PUC-Rio 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 Cohen-Sutherland Line Clipping A B D C D. Brogan, Univ. of Virginia

18 Alberto Raposo – PUC-Rio 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 Cohen-Sutherland Line Clipping A B C D. Brogan, Univ. of Virginia

19 Alberto Raposo – PUC-Rio Interseção com Janela de Visualização –(x 1, y 1 ), (x 2, y 2 ): interseção com aresta vertical direita: x right y intersect = y 1 + m(x right – x1) –onde m=(y 2 -y 1 )/(x 2 -x 1 ) –(x 1, y 1 ), (x 2, y 2 ): interseção com aresta horizontal de baixo: y bottom x intersect = x 1 + (y bottom – y1)/m –onde m=(y 2 -y 1 )/(x 2 -x 1 ) D. Brogan, Univ. of Virginia

20 Alberto Raposo – PUC-Rio 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; outcode0 = CompOutCode(x0, y0, xmin, xmax, ymin, ymax); } else { x1 = x; y1 = y; outcode1 = CompOutCode(x1, y1, xmin, xmax, ymin, ymax); } } /* Subdivide */ } while (!done); if (accept) DrawLineReal(x0, y0, x1, y1, value); } Algoritmo de Cohen-Sutherland

21 Alberto Raposo – PUC-Rio Cohen-Sutherland –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

22 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, P 0 e P 1 P(t) = P 0 + (P 1 - P 0 ) t, onde P é vetor [x, y] T x(t) = x 0 + (x 1 - x 0 ) t y(t) = y 0 + (y 1 - y 0 ) t

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

24 Alberto Raposo – PUC-Rio Linhas Paramétricas e Clipping Definir cada linha na forma paramétrica: –P 0 (t)…P n-1 (t) Definir cada aresta da janela de visualização na forma paramétrica: –P L (t), P R (t), P T (t), P B (t) Realiza testes de interseção de Cohen- Sutherland usando linhas e arestas apropriadas

25 Alberto Raposo – PUC-Rio Equações: Line / Edge Clipping Equações paramétricas permitem recortes mais eficientes Linha 0: –x 0 = x (x x 0 0 ) t 0 –y 0 = y (y y 0 0 ) t 0 x (x x 0 0 ) t 0 = x L 0 + (x L 1 - x L 0 ) t L y (y y 0 0 ) t 0 = y L 0 + (y L 1 - y L 0 ) t L –Resolver para t 0 e/ou t L View Window Edge L: –x L = x L 0 + (x L 1 - x L 0 ) t L –y L = y L 0 + (y L 1 - y L 0 ) t L D. Brogan, Univ. of Virginia

26 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

27 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) = P 0 + (P 1 - P 0 ) t –E um ponto e a normal de cada aresta da janela P L, N L

28 Alberto Raposo – PUC-Rio Algoritmo de Cyrus-Beck Encontre t tal que: N L [P(t) - P L ] = 0 Substitua P(t) pela equação da linha: –N L [ P 0 + (P 1 - P 0 ) t - P L ] = 0 Encontre t –t = N L [P L – P 0 ] / -N L [P 1 - P 0 ] PLPL NLNL P(t) Inside P0P0 P1P1 D. Brogan, Univ. of Virginia

29 Alberto Raposo – PUC-Rio Algoritimo de Cyrus-Beck Produto escalar de 2 vetores

30 Alberto Raposo – PUC-Rio Algoritimo de Cyrus-Beck

31 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 1) Classifique as interseções restantes em –Potentially Entering (PE) –Potentially Leaving (PL) N L [P 1 - P 0 ] > 0 implica PL N L [P 1 - P 0 ] < 0 implica PE

32 Alberto Raposo – PUC-Rio Entrando ou Saindo ?

33 Alberto Raposo – PUC-Rio Cálculo das interseções PLPL PEPE PLPL PEPE PEPE PEPE PLPL PLPL C B A PEPE PEPE PLPL PLPL

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

35 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) return nil; else return P(tE) and P(tL) as true clip intersections; }

36 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: -(x 0 - x left ) / (x 1 - x 0 ) (x 0 - x right ) / -(x 1 - x 0 ) -(y 0 - y bottom ) / (y 1 - y 0 ) (y 0 - y top ) / -(y 1 - y 0 )

37 Alberto Raposo – PUC-Rio Liang e Barsky Ei N Ei P Ei t left: x = x min (-1, 0)(x min, y) -(x 0 -x min ) (x 1 -x 0 ) right: x = x max (1, 0)(x max, y) (x 0 -x max ) -(x 1 -x 0 ) bottom: y = y min (0,-1)(x, y min ) -(y 0 -y min ) (y 1 -y 0 ) top: y = y max (0, 1)(x, y max ) (y 0 -y max ) -(y 1 -y 0 ) x min x max y min y max x y

38 Alberto Raposo – PUC-Rio Comparação Cohen-Sutherland –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

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

40 Alberto Raposo – PUC-Rio 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…

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

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

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

44 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

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

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

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

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

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

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

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

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

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

54 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 D. Brogan, Univ. of Virginia

55 Alberto Raposo – PUC-Rio Sutherland - Hodgman Clip contra uma aresta (plano) de cada vez

56 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

57 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) insideoutside s p p output insideoutside s p no output insideoutside s p i output insideoutside s p i output p output D. Brogan, Univ. of Virginia

58 Alberto Raposo – PUC-Rio 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 S P guarde P S P SP guarde I I S P guarde I, P I internosaindoexternoentrando (a)(b)(c)(d)

59 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 Ache ponto de interseção i guarde i, e também p D. Brogan, Univ. of Virginia

60 Alberto Raposo – PUC-Rio Clipping de polígonos (Exemplo 1) A B SPAção 12x 23store A,3 34store 4 45store 5 56store B 61x

61 Alberto Raposo – PUC-Rio Clipping de polígonos (Exemplo 2) 1 SP Ação 12store A 23x 34store B,4 45store 5 56store C 61store D, AB C D xxxx B C D A

62 Alberto Raposo – PUC-Rio Clipping de polígonos (Exemplo 2) 1 SPAção 1Astore 1, A ABstore B B4store E 45store F,5 5Cstore C CDstore D 4 5 AB C D xxxx E F x x D1x B, E, F, 5, C, D, 1, A

63 Alberto Raposo – PUC-Rio Teste Point-to-Plane 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 ( ) = ângulo entre p e n P n p q P n p q P n p q D. Brogan, Univ. of Virginia

64 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 (L 0 + (L 1 - L 0 ) t - q) n = 0 t = [(q - L 0 ) n] / [(L 1 - L 0 ) n] –O ponto de interseção i = L(t) para o valor de t encontrado acima D. Brogan, Univ. of Virginia

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

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

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

68 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

69 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: –Grave o ponto de interseção –Caminhe pela aresta da janela (ccw) Cluter & Durand, MIT

70 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: –Grave o ponto de interseção –Caminhe pela aresta da janela (ccw)

71 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: –Grave o ponto de interseção –Caminhe pela aresta da janela (ccw) Cluter & Durand, MIT

72 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: –Grave o ponto de interseção –Caminhe pela aresta da janela (ccw)

73 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

74 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

75 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

76 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

77 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

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


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

Apresentações semelhantes


Anúncios Google