INF 1366 Computao Grfica Interativa Clipping Recorte Alberto
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/INF 1366/index. htm Alberto Raposo – PUC-Rio
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
Clipping (Recorte) 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 • Partes do objeto fora do volume de visualização (view frustum) são removidas
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 y yp 2. tol ym xm int xp x pont. In. Rect(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 E (x 2, y 2) A C (x’ 2, y’ 2) (x’ 1, y’ 1) D (x 1, y 1) B
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á trivialmente fora Alberto Raposo – PUC-Rio 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
Recorte de Linhas em Relação ao Viewport • Combinando casos triviais D. Brogan, Univ. of Virginia – 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 0001 0000 0010 0101 0100 0110 Alberto Raposo – PUC-Rio xmax D. Brogan, Univ. of Virginia
Cálculo do código de um vértice Outcode comp. Out. Code(double x, double y, double xmin, double xmax, double ymin, double ymax) { Outcode; 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) { 1001 1000 1010 code. right = 1; code. all += 2; } else if(x < xmin) { 0001 0000 0010 code. left = 1; code. all += 1; } 0101 0100 0110 return code; }
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 C B A Alberto Raposo – PUC-Rio D E
Cohen-Sutherland Line Clipping D. Brogan, Univ. of Virginia • Ache a interseção da linha com a aresta C B A Alberto Raposo – PUC-Rio D E
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 D
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 – (x 1, y 1), (x 2, y 2): interseção com aresta vertical direita: xright • yintersect = y 1 + m(xright – x 1) – 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: ybottom • xintersect = x 1 + (ybottom – y 1)/m – onde m=(y 2 -y 1)/(x 2 -x 1) D. Brogan, Univ. of Virginia Alberto Raposo – PUC-Rio
Algoritmo de Cohen-Sutherland void Cohen. Sutherland. Line. Clip. And. Draw(double x 0, double y 0, double x 1, double y 1, double xmin, double xmax, double ymin, double ymax, int value) { outcode 0, outcode 1, outcode. Out, Comp. Out. Code(); double x, y; boolean accept = FALSE, done = FALSE; outcode 0 = Comp. Out. Code(x 0, y 0, xmin, xmax, ymin, ymax); outcode 1 = Comp. Out. Code(x 1, y 1, xmin, xmax, ymin, ymax); do { if (outcode 0. all == 0 && outcode 1. all == 0) { accept = TRUE; done = TRUE; /* trivial draw and exit */ } else if((outcode 0. all & outcode 1. all) != 0) { done = TRUE; /* trivial reject and exit */ } else { if (outcode 0. all != 0) outcode. Out = outcode 0; else outcode. Out = outcode 1; if (outcode. Out. top) { x = x 0 + (x 1 - x 0) * (ymax } else if(outcode. Out. bottom) { x = x 0 + (x 1 - x 0) * (ymin } else if(outcode. Out. right) { y = y 0 + (y 1 - y 0) * (xmax } else if(outcode. Out. left) { y = y 0 + (y 1 - y 0) * (xmin } y 0) / (y 1 - y 0); y = ymax; y 0) / (y 1 - y 0); y = ymin; x 0) / (x 1 - x 0); x = xmax; x 0) / (x 1 - x 0); x = xmin; if (outcode. Out. all == outcode 0. all) { x 0 = x; y 0 = y; outcode 0 = Comp. Out. Code(x 0, y 0, xmin, xmax, ymin, ymax); } else { x 1 = x; y 1 = y; outcode 1 = Comp. Out. Code(x 1, y 1, xmin, xmax, ymin, ymax); } } /* Subdivide */ } while (!done); if (accept) Draw. Line. Real(x 0, y 0, x 1, y 1, value); }
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
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 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 Alberto Raposo – PUC-Rio
Linhas Paramétricas e Clipping • Definir cada linha na forma paramétrica: – P 0(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: – x 0 = x 00 + (x 01 - x 00) t 0 – y 0 = y 00 + (y 01 - y 00) t 0 • 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 • x 00 + (x 01 - x 00) t 0 = x. L 0 + (x. L 1 - x. L 0) t. L • y 00 + (y 01 - y 00) t 0 = y. L 0 + (y. L 1 - y. L 0) t. L – Resolver para t 0 e/ou t. L Alberto Raposo – PUC-Rio D. Brogan, Univ. of Virginia
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) = P 0 + (P 1 - P 0) 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 P 1 PL P(t) P 0 Inside NL • Substitua P(t) pela equação da linha: – NL [P 0 + (P 1 - P 0) t - PL] = 0 • Encontre t – t = NL [PL – P 0] / -NL [P 1 - P 0] Alberto Raposo – PUC-Rio D. Brogan, Univ. of Virginia
Algoritimo de Cyrus-Beck Produto escalar de 2 vetores
Algoritimo de Cyrus-Beck
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 [P 1 - P 0] > 0 implica PL • NL [P 1 - P 0] < 0 implica PE Alberto Raposo – PUC-Rio
Entrando ou Saindo ?
Cálculo das interseções PL PL C PE PE PE PL PL PE PE PL B PE PL A
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 PL PE Alberto Raposo – PUC-Rio P 0 PE PL P 1
Cyrus-Beck - caso geral { Calcule Ni e escolha um PEi para cada aresta t. E = 0; t. L = 1; for(cada aresta ){ if (Ni. (P 1 -P 0)!=0 ){ /* aresta não é paralela ao segmento */ calcule t; use sign of Ni. (P 1 -P 0) para categorizar como PE ou PL; if( PE ) t. E = max(t. E, t); if( PL ) t. L = min(t. L, t); } else { /* aresta paralela ao segmento */ if (Ni. (P 0 -PEi) > 0) /* está fora */ return nil; } if(t. E > t. L) return nil; else return P(t. E) and P(t. L) as true clip intersections; } } }
Caso particular: Liang e Barsky • Janela retangular: linhas de recorte horizontais e verticais: – Normais: (-1, 0), (0, -1), (0, 1) • Soluções para t: § § -(x 0 - xleft) / (x 1 - x 0) (x 0 - xright) / -(x 1 - x 0) -(y 0 - ybottom) / (y 1 - y 0) (y 0 - ytop) / -(y 1 - y 0) Alberto Raposo – PUC-Rio
Liang e Barsky y ymax ymin x xmax Ei NEi PEi t left: x = xmin (-1, 0) (xmin, y) -(x 0 -xmin) (x 1 -x 0) right: x = xmax (1, 0) (xmax, y) (x 0 -xmax) -(x 1 -x 0) bottom: y = ymin (0, -1) (x, ymin) -(y 0 -ymin) (y 1 -y 0) top: y = ymax (0, 1) (x, ymax) (y 0 -ymax) -(y 1 -y 0)
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
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 5 -gon • Quantos lados pode ter um triângulo D. Brogan, Univ. of Virginia recortado? 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
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 inside s p output i output p outside p inside p outside s s no output 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 (a) P I S I P S guarde I (b) guarde P S P entrando guarde I, P (c) (d)
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 Alberto Raposo – PUC-Rio D. Brogan, Univ. of Virginia
Clipping de polígonos (Exemplo 1) 2 A 3 1 6 4 B 5 S P Ação 1 2 3 4 5 6 1 x store A, 3 store 4 store 5 store B x
Clipping de polígonos (Exemplo 2) 2 Ax 3 6 x x D 1 x B S 1 2 3 4 5 6 C 4 5 A D 1 B C 5 4 P 2 3 4 5 6 1 Ação store A x store B, 4 store 5 store C store D, 1
Clipping de polígonos (Exemplo 2) Ax x x D 1 x C 5 B x x E F 4 B, E, F, 5, C, D, 1, A S A B 4 5 C D 1 P B 4 5 C D 1 A Ação store B store E store F, 5 store C store D x store 1, A
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 q q n p Alberto Raposo – PUC-Rio P q n p P n
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 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: – Grave o ponto de interseção – 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: – Grave o ponto de interseção – 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: – Grave o ponto de interseção – 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: – Grave o ponto de interseção – 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, Mc. Graw-Hill, 1988. Marcelo Gattass: notas de aula. http: //www. tecgraf. pucrio. br/~mgattass/cg. html Alberto Raposo – PUC-Rio
- Slides: 78