1 / 78

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

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. Pipeline Gráfico. Cluter & Durand, MIT. Modeling Transformations. Illumination (Shading).

avital
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. INF 1366 – Computação Gráfica InterativaClipping (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

  2. Pipeline Gráfico 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  Illumination (Shading) • Partes do objeto fora do volume de visualização(view frustum) são removidas 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. y yp 2.tol 2.tol ym xm xp x Ponto em retângulo 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. E (x2, y2) (x’2, y’2) C (x’1, y’1) B D (x1, y1) Casos de clipping de linhas A Alberto Raposo – PUC-Rio

  7. 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çõese 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. 1001 1000 1010 0001 0000 0010 0101 0100 0110 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; } 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. E D C B A Cohen-Sutherland Line Clipping D. Brogan, Univ. of Virginia • Ache a interseção da linha com a aresta 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 • onde m=(y2-y1)/(x2-x1) D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

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

  21. 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 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. PL P(t) Inside NL Algoritmo de Cyrus-Beck P1 • 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] P0 D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio

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

  30. Algoritimo de Cyrus-Beck 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

  33. Cálculo das interseções PL C PL PE A PL PL PL PE B PE PL PE PE PE Alberto Raposo – PUC-Rio

  34. P1 PL PL PE PE P0 Algoritmo de Cyrus-Beck D. Brogan, Univ. of Virginia • Para cada reta: • Ache o PE com maior t • Ache o PL com menor t • Recorte nesses 2 pontos 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) return nil; else return P(tE) and P(tL) as true clip intersections; } } } 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. Ei NEi PEi t -(x0-xmin) (x1-x0) left: x = xmin (-1, 0) (xmin, y) (x0-xmax) -(x1-x0) right: x = xmax (1, 0) (xmax, y) -(y0-ymin) (y1-y0) bottom: y = ymin (0,-1) (x, ymin) (y0-ymax) -(y1-y0) top: y = ymax (0, 1) (x, ymax) Liang e Barsky y ymax ymin x xmin xmax Alberto Raposo – PUC-Rio

  38. 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 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  5-gon triângulo  triângulo • 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

More Related