Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouMurilo Lupercio Alterado mais de 10 anos atrás
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.