Visualização 2D: - Transformação window to viewport - Clipping Sistemas Gráficos/ Computação Gráfica e Interfaces 1
Transformação de Visualização (window to viewport) Objectivo: obter uma matriz de transformação que quando aplicada aos objectos contidos na parte do mundo que se pretende mostrar, mantenha a posição relativa entre eles. yw Window Viewport yv yw yv xw xw xv xv Coordenadas mundo Coordenadas do dispositivo de visualização Window este termo significa que apenas uma parte do mundo (janela) é usado para mostrar no ecrã, e não necessariamente todo o espaço. As coordenadas do mundo, espaço objecto, podem ser cm, m, km, anos-luz, etc. Viewport espaço em coordenadas do ecrã reservado para representar o mundo pretendido. Notar que o viewport pode não ocupar todo o ecrã. 2
Transformação de Visualização (window to viewport) Pipeline de visualização v y Translação y Escalamento v Translação Coordenadas Mundo: Recorte (clipping) x Coordenadas Mundo x u Coordenadas ecrã u Coordenadas ecrã Se a janela de coordenadas mundo tiver as dimensões (x, y ) (x,y ) e as coordenadas do viewport forem (u, v ) (u,v ), então as transformações são: Translação: T w 1 = 1 x y 1 S wv u x = Escalamento: u x v v y y 1 Translação: T v 1 = 1 u v 1 3
Transformação de Visualização (window to viewport) A transformação final será M wv = T v.s wv.t w M wv = u x Eficiência u x v y Notar que a matriz contém 4 elementos com valor ZERO. Para implementar esta transformação que se repete em cada actualização do viewport devemos optimiza-la evitando a multiplicação e a adição por zero. Os valores (u,v) correspondentes às coordenadas (x,y) são: u = m 11 *x + m 13 v = m 22 *y + m 23 v y x y u x v y u x v y 1 + u + v m = 11 m 22 m m 1 13 23 De 9 multiplicações e 6 somas passamos para 2 mult. e 2 somas. 4
Corte (clipping) Operação que selecciona a parte das primitivas do mundo que são visíveis num deterado viewport. Corte de: Pontos Segmentos de Recta Polígonos Curvas Caracteres Alfanuméricos Forma da Janela: Rectângulo Polígono Convexo Polígono Côncavo Polígono com Buracos 5
Corte de Pontos Ponto (x,y) Região de Corte definida por (x, y ) a (x, y ) y y x <= x <= x y <= y <= y x x Se as duas condições forem válidas então o ponto está dentro da área de corte. 6
Corte de Segmentos de Recta Dois pontos são suficientes para definir a parte visível de um segmento de recta. O segmento de recta poderá estar: Completamente visível Completamente invisível Parcialmente visível 7
Corte de Segmentos de Recta Algoritmo de Dan Cohen e Ivan Suntherland 1. Prolongamento das arestas da região de corte de forma a ter 9 regiões 2. A cada região é atribuído um código de 4 bits 1 _ y > y _1 1 1 y < y x > x x < x 8
A B Corte de Segmentos de Recta Algoritmo de Dan Cohen e Ivan Suntherland Para cada segmento de recta: 1. Atribuir aos dois pontos extremos o código de 4 dígitos corresponde à sua localização A 1 B 2. Verificar se pode de forma trivial aceitar ou rejeitar o segmento. A & B não cruza região rejeição trivial A B = totalmente visível aceitação trivial 3. Dividir o segmento em dois de modo a um deles ser trivialmente rejeitado. Voltar a 1. A estratégia consiste em subdividir sucessivamente os segmentos até obter segmentos onde a verificação é trivial. 9
Corte de Segmentos de Recta Algoritmo de Dan Cohen e Ivan Suntherland Algoritmo // função para calcular o código de um ponto unsigned codigo(float x, float y, float x, float x, float y, float y) { unsigned c=; if (y > y) c = 8; else if (y < y) c = 4; if (x > x) c += 2; else if (x < x) c += 1; } return c; 1
Corte de Segmentos de Recta Algoritmo de Dan Cohen e Ivan Suntherland // Segmento AB, A=(x,y) B=(x1,y1) void CohenSuntherland(float x, float y, float x1, float y1, float x, float x, float y, float y) { boolean accept, done; unsigned coda, codb, codout; accept = false; done = false; coda = codigo(x,y, x, x, y, y); codb = codigo(x1,y1, x, x, y, y); } do { if ((coda codb)==) { accept = true; done = true;} else if ((coda & codb)!= ) done = true; else { if (coda!= ) codout = coda; else codout = codb; if (codout & x8) // se primeiro bit é 1 { x=x+(x1-x)*(y-y)/(y1-y); y=y; }else if (codout & x4) // se segundo bit é 2 { x=x+(x1-x)*(y-y)/(y1-y); y=y; }else if (codout & x2) // se terceiro bit é 2 { y=y+(y1-y)*(x-x)/(x1-x); x=x; }else if (codout & x1) // se terceiro bit é 2 { y=y+(y1-y)*(x-x)/(x1-x); x=x; } if (codout == coda) { x=x; y=y; coda = codigo(x,y, x, x, y, y);} else { x1=x; y1=y; codb = codigo(x1,y1, x, x, y, y);} } } while (!done) 11
Corte de Segmentos de Recta Algoritmo da Divisão pelo Ponto Médio x 1,y 1 Ponto Médio x 2 + x x 1 m = 2 y 2 + y y 1 m = 2 x 2,y 2 x m,y m P PV PV 1 PV PV 1 porção visível de P P 1 P 1 P a P P 1 b P 1 P c P 1 P P m d P 1 P P P m e P m P 1 Deteração de PV 1 : (mesmo procedimento para PV ) 1.Se P 1 visível (código ) PV 1 =P 1 e tera (caso do segmento a) Senão continua. 2.Se (P & P 1 ) Rejeita segmento e tera (caso do segmento b) Senão continua. 3.Calcula o ponto médio P m Se (P m & P 1 ) Rejeita segmento e volta a 2 com P P m (caso do segmento d) Senão volta a 2 com P m P 1 (caso do segmento c e e) NOTA: Pesquisa logarítmica 12
Corte de Polígonos (polygon clipping) Polígono obtido usando um dos algoritmos de corte de segmentos de recta. Obtém-se um conjunto de segmentos não relacionados. Dificuldade no preenchimento do polígono. Objectivo: Obter uma região fechada, descrita por uma sequência de vértices, depois da operação de corte. 13
Corte de Polígonos Algoritmo de Sutherland-Hodgeman Algoritmo: 1. Representar o polígono por uma sequência de vértices 2. Processar a fronteira do polígono sucessivamente com todas (4) as fronteiras da região de corte. O resultado, i.e. a lista de vértices, do processamento anterior é usado como entrada do próximo. O resultado final é uma lista de vértices representando a fronteira do polígono visível. Vértices iniciais Vértices resultantes do processamento com a fronteira de topo Vértices resultantes do processamento com a fronteira da direita Vértices resultantes do processamento com a fronteira de baixo 14
Corte de Polígonos Algoritmo de Sutherland-Hodgeman Processo de criação da lista de arestas em cada etapa: v v 1 v 1 2 v 1 v 2 v 2 v 2 v 1 v 1 v 1 out in Junta v 1 e v 2 à lista de vértices in in Junta v 2 in out Junta v 1 out out rejeita os pontos 15
Exemplo: 2 Corte de Polígonos Algoritmo de Sutherland-Hodgeman Lista inicial: P1, P2, P3, P4, P5 1 p 1 p2 p 1 p 5 p 2 Aresta 1: P1, P2, P3, P4, P5 Todos os vértices estão no semiespaço visível definido por 1. p 5 Aresta 2: P1, P2, P4, P4, P5, P1 p 4 p 4 p 3 Aresta 3: P1, P2, P4, P5, P5, P1 p 2 p 1 p 1 p 5 P 5 P 4 3 p 4 p 4 16
Corte de Polígonos Algoritmo de Sutherland-Hodgeman Exemplo: Aresta 4: P1, P2, P4, P5, P5, P1 p 2 p 1 p 1 p 5 P 5 P 4 4 17
Exercício Exame de 2 de Junho de 22 18