Viewing 2D - 0.5cmSCC0250 - Computação Gráficapaulovic/aulas/CG/slides_novos/SCC0250... ·...

Post on 20-Dec-2018

218 views 1 download

Transcript of Viewing 2D - 0.5cmSCC0250 - Computação Gráficapaulovic/aulas/CG/slides_novos/SCC0250... ·...

Viewing 2D

Viewing 2D

SCC0250 - Computação Gráfica

Prof. Fernando V. Paulovichhttp://www.icmc.usp.br/~paulovic

paulovic@icmc.usp.br

Instituto de Ciências Matemáticas e de Computação (ICMC)Universidade de São Paulo (USP)

15 de abril de 2015

1 / 72

Viewing 2DIntrodução

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

2 / 72

Viewing 2DIntrodução

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

3 / 72

Viewing 2DIntrodução

Introdução

Viewing Pipeline 2D

Processo para criar a visão 2D de uma cena, determinando quaispartes serão mostradas e suas localizações na tela

A imagem é determinada no sistema de coordenadas do mundo(world coordinates) cujas partes especificadas (selecionadas) sãomapeadas para o sistema de coordenadas do dispositivo (devicecoordinates)

Esse mapeamento envolve uma série de translações, rotações eescalasAssim como operações para eliminar as partes da imagem que estãofora da área de visão

4 / 72

Viewing 2DIntrodução

Introdução

Janela de Recorte ou Clipping Window

Uma seção de uma cena 2D que é selecionada para ser mostradaTudo o que estiver fora dessa seção será “cortado fora”

Viewport

A Janela de Recorte pode ser posicionada dentro de uma janela dosistema usando outra “janela” chamada de Viewport

Objetos dentro da Janela de Recorte (o que será visto) sãomapeados para a Viewport, que por sua vez é posicionada dentro dajanela do sistema (onde serão vistos)Múltiplas Viewports podem ser usadas para mostra diferentes seçõesda imagem em diferentes posições

5 / 72

Viewing 2DIntrodução

Introdução

6 / 72

Viewing 2DIntrodução

Introdução

Transformação 2D da Visão

Mapeamento de uma descrição da cena no sistema de coordenadasdo mundo para o sistema de coordenadas do dispositivo

Para acelerar o processo de recorte, sistemas gráficos convertem adescrição dos objetos para coordenadas normalizadas (entre 0 e 1ou entre −1 e 1)

7 / 72

Viewing 2DA Janela de Recorte

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

8 / 72

Viewing 2DA Janela de Recorte

A Janela de Recorte

Embora seja possível criar Janelas de Recorte de qualquer formato,a maioria as APIs gráficas somente suporta janelas retangularesalinhadas aos eixos x e y devido o custo computacional

Normalmente a Janela de Recorte é especificadas no sistema decoordenadas do mundo

9 / 72

Viewing 2DA Janela de Recorte

Sistema de Coordenadas de Visão da Janela de Recorte

Normalmente, a transformação de visão é definida em um sistema decoordenadas de visão dentro do sistema de coordenadas de mundo

Isso permite especificar uma Janela de Recorte retangular emqualquer posiçãoUma visão das coordenadas do mundo é obtida transferindo a cenapara as coordenadas de visão

10 / 72

Viewing 2DA Janela de Recorte

Sistema de Coordenadas de Visão da Janela de Recorte

Escolhe-se uma origem P0 = (x0, y0) no sistema de coordenadas devisão e uma orientação usando um vetor V que dá a direção yview

V é chamado de view-up vector 2D

Outra abordagem é definir um ângulo de rotação relativa a x ou y ea partir desse obter o view-up vector

11 / 72

Viewing 2DA Janela de Recorte

Sistema de Coordenadas de Visão da Janela de Recorte

Uma vez estabelecido o sistema de coordenadas de visão, é possíveltransformar a descrição dos objetos em uma cena usando translaçõese rotações para sobrepor os diferentes sistemas de coordenadas

Translado a origem P0 para a origem do sistema de coordenadas demundoRotaciono o sistema de visão para alinhá-lo com o sistema decoordenadas de mundo

Essa conversão, entre coordenadas do mundo em coordenadas devisão é dada por

MWC,V C = R ·T

12 / 72

Viewing 2DA Janela de Recorte

Sistema de Coordenadas de Visão da Janela de Recorte

13 / 72

Viewing 2DNormalização e Transformações de Viewport

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

14 / 72

Viewing 2DNormalização e Transformações de Viewport

Normalização e Transformações de Viewport

Em alguns sistemas, a normalização e a transformaçãowindow-viewport são combinadas em uma única operação

Nesse caso as coordenadas da viewport são definidas entre 0 e 1Após o recorte, o quadrado unitário contendo a viewport é mapeadopara o dispositivo de saída

Em outros sistemas a normalização e as rotinas de recorte sãoaplicadas antes das transformações de viewport

Nesse caso as coordenadas do viewport são as coordenadas da tela

15 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em uma ViewportNormalizada

Considerando uma viewport com as coordenadas entre 0 e 1, temosque mapear a descrição dos objetos para esse espaço normalizadousando transformações que mantenham a posição relativa de umponto como foi definida na Janela de Recorte

O ponto (xw, yw) é mapeado para (xv, yv)

16 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em uma ViewportNormalizada

Para transformar um ponto no sistema de coordenadas do mundopara um ponto na viewport, temos que fazer

xv − xvmin

xvmax − xvmin=

xw − xwmin

xwmax − xwmin

yv − yvmin

yvmax − yvmin=

yw − ywmin

ywmax − ywmin

Resolvendo para o posição (xv, yv) na viewport temosxv = Sx · xw + tx

yv = Sy · yw + ty

17 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em uma ViewportNormalizada

Onde os fatores de escala são

sx =xvmax − xvmin

xwmax − xwmin

sy =yvmax − yvmin

ywmax − ywmin

E os fatores de translação são

tx =xwmax · xvmin − xwmin · xvmax

xwmax − xwmin

ty =ywmax · yvmin − ywmin · yvmax

ywmax − ywmin

18 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em uma ViewportNormalizada

Como simplesmente mapeamos o sistema de coordenadas de mundopara uma viewport, é possível obter o mesmo resultado usando umasequencia de transformações

Converter o retângulo da Janela de Recorte no retângulo da viewport

Isso pode ser obtido fazendo1 Escala a Janela de Recorte para ter o tamanho da viewport usando o

ponto fixo (xwmin, ywmin)2 Translada (xwmin, ywmin) para (xvmin, yvmin)

19 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em uma ViewportNormalizada

Onde a matriz de escala é

S =

sx 0 xwmin(1− sx)0 sy ywmin(1− sy)0 0 1

E a matriz de translação é

T =

1 0 xvmin − xwmin

0 1 yvmin − ywmin

0 0 1

20 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em uma ViewportNormalizada

Sendo a matriz composta

Mwindow,normviewport = T · S

Igual a

Mwindow,normviewport =

sx 0 tx0 sy ty0 0 1

Com sx, sy, tx e ty dados anteriormente

21 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em uma ViewportNormalizada

Nesse mapeamento, as posições relativas dos objetos são mantidasUm objeto dentro da Janela de Recorte estará dentro da viewport

As proporções relativas dos objetos só serão mantidas se a razão deaspecto da viewport for igual a da Janela de Recorte

Em outras palavras sx tem de ser igual a sy

22 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em um QuadradoNormalizado

Uma outra abordagem para a transformação de visão é transformara Janela de Recorte em um quadrado normalizado, fazer o recorteem coordenadas normalizadas e então transferir a descrição da cenapara a viewport especificada no sistema de coordenadas da tela

Nessa representação, (parte dos) objetos fora dos limites x = ±1 ey = ±1 são facilmente detectados e removidos da cena

23 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em um QuadradoNormalizado

Para se mapear o conteúdo da Janela de Recorte para o quadradonormalizado procedemos similarmente a transformaçãowindow-viewport fazendo xvmin = yvmin = −1 exvmax = yvmax = +1

Mwindow,normsquare =

2xwmax−xwmin

0 −xwmax+xwmin

xwmax−xwmin

0 2ywmax−ywmin

− ywmax+ywmin

ywmax−ywmin

0 0 1

24 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em um QuadradoNormalizado

Similarmente, após os algoritmos de recorte serem aplicados, aquadrado normalizado de tamanho 2 é transformado na viewportfazendo xwmin = ywmin = −1 e xwmax = ywmax = −1

Mnormsquare,viewport =

xvmax−xvmin

2 0 xvmax+xvmin

2

0 yvmax−yvmin

2yvmax+yvmin

20 0 1

25 / 72

Viewing 2DNormalização e Transformações de Viewport

Mapeando a Janela de Recorte em um QuadradoNormalizado

O último passo consiste em posicionar a área da viewport na janelada tela

26 / 72

Viewing 2DProgramação OpenGL

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

27 / 72

Viewing 2DProgramação OpenGL

Modo de Projeção OpenGL

Antes de definir a Janela de Recorte e a viewport, é necessário criaruma matriz para fazer o mapeamento (matriz de projeção)

1 public class Example04 implements GLEventListener {2 private final Matrix4 projectionMatrix;3 ...45 public Example04() {6 ...7 projectionMatrix = new Matrix4();8 }9 }

Não esqueça que as transformações são cumulativas, então quandonecessário carregar a matriz identidade

1 projectionMatrix.loadIdentity();

28 / 72

Viewing 2DProgramação OpenGL

Definindo a Janela de Recorte

A Janela de Recorte é definida por de uma função criada

1 public class Matrix4 {2 ...3 public void ortho2D(float xwmin, float xwmax, float ywmin, float ywmax) {4 float[] ortho = new float[16];5 ortho[0] = 2.0f / (xwmax - xwmin);6 ortho[5] = 2.0f / (ywmax - ywmin);7 ortho[10] = 1.0f;8 ortho[12] = -(xwmax + xwmin) / (xwmax - xwmin);9 ortho[13] = -(ywmax + ywmin) / (ywmax - ywmin);

10 ortho[15] = 1.0f;11 multiply(ortho);12 }13 }

Isso mapeia a janela de recorte para a janelaxwmin = yw = min = −1 e xwmax = ywmax = +1

O processo de recorte ocorre em um quadrado normalizado entre −1e 1

29 / 72

Viewing 2DProgramação OpenGL

Definindo a Janela de Recorte

A Janela de Recorte é definida usando função criada

1 public class Example04 implements GLEventListener {23 @Override4 public void init(GLAutoDrawable drawable) {5 ...67 //cria a projecao 2D8 projectionMatrix.loadIdentity();9 projectionMatrix.ortho2D(

10 -0.501f, 0.501f,11 -0.501f, 0.501f);12 projectionMatrix.bind();13 }14 }

30 / 72

Viewing 2DProgramação OpenGL

Definindo a Viewport

A viewport é definida e posicionada por

1 glViewport(GLint xvmin, Glint yvmin, GLsizei vpWidth, GLsizei vpHeight);

Todos os parâmetros são dados no sistema de coordenadas da tela,relativas a janela de visão

(xvmin, yvmin): canto inferior esquerdovpWidth e vpHeight: largura e altura da viewport

31 / 72

Viewing 2DProgramação OpenGL

Múltiplas Viewports

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

32 / 72

Viewing 2DProgramação OpenGL

Múltiplas Viewports

Exemplo

1 public class Example04 implements GLEventListener {23 @Override4 public void init(GLAutoDrawable drawable) {5 // Get pipeline6 GL3 gl = drawable.getGL().getGL3();78 gl.glClearColor(0, 0, 0, 0);9

10 //inicializa os shaders11 shader.init(gl);1213 //ativa os shaders14 shader.bind();1516 //inicializa a matrix Model and Projection17 modelMatrix.init(gl, shader.getUniformLocation("u_modelMatrix"));18 projectionMatrix.init(gl, shader.getUniformLocation("u_projectionMatrix"));1920 //cria o objeto a ser desenhado21 triangle.init(gl, shader);2223 //cria a projecao 2D24 projectionMatrix.loadIdentity();25 projectionMatrix.ortho2D(26 -0.501f, 0.501f,27 -0.501f, 0.501f);28 projectionMatrix.bind();29 }30 ...31 }

33 / 72

Viewing 2DProgramação OpenGL

Múltiplas Viewports

Codificando

1 public class Example04 implements GLEventListener {23 @Override4 public void display(GLAutoDrawable drawable) {5 // Recupera o pipeline6 GL3 gl = drawable.getGL().getGL3();78 // Limpa o frame buffer com a cor definida9 gl.glClear(GL3.GL_COLOR_BUFFER_BIT);

1011 modelMatrix.loadIdentity();12 modelMatrix.bind();1314 gl.glViewport(0, 0, 600, 575);15 triangle.bind();16 triangle.draw(GL3.GL_LINE_LOOP);1718 gl.glViewport(0, 475, 100, 100);19 triangle.bind();20 triangle.draw(GL3.GL_LINE_LOOP);2122 // Força execução das operações declaradas23 gl.glFlush();24 }25 ...26 }

34 / 72

Viewing 2DProgramação OpenGL

Mantendo Razão de Aspecto

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

35 / 72

Viewing 2DProgramação OpenGL

Mantendo Razão de Aspecto

Mantendo Razão de Aspecto

1 public class Example05 implements GLEventListener {23 @Override4 public void init(GLAutoDrawable drawable) {5 // Get pipeline6 GL3 gl = drawable.getGL().getGL3();78 gl.glClearColor(0, 0, 0, 0);9

10 //inicializa os shaders11 shader.init(gl);1213 //ativa os shaders14 shader.bind();1516 //inicializa a matrix Model and Projection17 modelMatrix.init(gl, shader.getUniformLocation("u_modelMatrix"));18 projectionMatrix.init(gl, shader.getUniformLocation("u_projectionMatrix"));1920 //cria o objeto a ser desenhado21 triangle.init(gl, shader);22 }23 ...24 }

36 / 72

Viewing 2DProgramação OpenGL

Mantendo Razão de Aspecto

Mantendo Razão de Aspecto

1 public class Example05 implements GLEventListener {2 @Override3 public void reshape(GLAutoDrawable drawable, int x, int y, int width, int ←↩

height) {4 // Evita a divisão por zero5 if (height == 0) {6 height = 1;7 }89 // Inicializa o sistema de coordenadas

10 projectionMatrix.loadIdentity();1112 // Estabelece a janela de recorte13 if (width <= height) {14 projectionMatrix.ortho2D(15 -1.0f, 1.0f,16 (-1.0f * height) / width, (1.0f * height) / width);17 } else {18 projectionMatrix.ortho2D(19 (-1.0f * width) / height, (1.0f * width) / height,20 -1.0f, 1.0f);21 }2223 projectionMatrix.bind();24 }25 ...26 }

37 / 72

Viewing 2DAlgoritmos de Recorte

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

38 / 72

Viewing 2DAlgoritmos de Recorte

Algoritmos de Recorte

Algoritmo de Recorte

No Viewing Pipeline serve para extrair uma porção designada deuma cena para ser apresentada em um dispositivo de saída

Identifica as partes de uma imagem que estão fora da Janela deRecorte, eliminando essas da descrição da cena que é passada para odispositivo de saídaPor eficiência, o recorte é aplicado sobre Janelas de Recortenormalizadas

Isso reduz cálculos porque todas as matrizes de transformação degeometria e visão podem ser concatenadas para serem aplicadas auma cena antes do recorte acontecer

39 / 72

Viewing 2DAlgoritmos de Recorte

Algoritmos de Recorte

Existem diversos algoritmos para o recorte dePontosLinhas (segmentos de linhas retos)Áreas-preenchidas (polígonos)CurvasTexto

Os três primeiros são componentes padrão dos pacotes gráficosMaior rapidez de processamento se as fronteiras dos objetos foremsegmentos de reta

40 / 72

Viewing 2DAlgoritmos de Recorte

Algoritmos de Recorte

Na discussão que se segue a região de recorte será uma janelaretangular na posição padrão, com arestas de fronteira em xwmin,xwmax, ywmin e ywmax

Tipicamente correspondendo ao quadrado normalizado entre 0 e 1ou −1 e 1

41 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Ponto 2D

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

42 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Ponto 2D

Recorte de Ponto 2D

Dado um ponto P(x, y), esse será apresentado no dispositivo desaída se e somente se

xwmin ≤ x ≤ xwmax

ywmin ≤ y ≤ ywmax

Esse processo é especialmente útil para cortes em sistemas departículas, como nuvens, fumaça, explosões, etc.

43 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

44 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha 2D

Algoritmo de Recorte

Processa cada linha em uma cena por meio de uma série de testes ecálculos de intersecção para determinar se uma linha ou parte delaprecisa ser desenhada

A tarefa mais cara computacionalmente do recorte é calcular asintersecções das linhas com a Janela de Recorte

Portanto, o objetivo é minimizar o cálculo de intersecções

45 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha 2D

É fácil determinar se uma linha está completamente dentro da janela,mas é mais difícil determinar se essa está completamente fora

Quando os dois pontos limitantes de uma linha estão dentro dajanela (linha P1P2), a linha está completamente dentroQuando os dois pontos limitantes estão fora de qualquer uma dasquatro fronteiras (linha P3P4), a linha está completamente foraSe ambos testes falham, o segmento de linha intersecta ao menosuma das fronteiras da janela, e pode ou não cruzar o interior damesma

46 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha 2D

Partindo da definição paramétrica de um segmento de reta, com(x0, y0) e (xend, yend) temos que

x = x0 + u(xend − x0)

y = y0 + u(yend − y0)

0 ≤ u ≤ 1

Podemos determinar a posição de interseção da reta com cadafronteira da janela substituindo o valor da coordenada da fronteirapara x ou y e resolvendo para u

Se 0 > u > 1, então não há cruzamentoCaso contrário, parte da reta está dentro da fronteira, e podemosprocessar essa parte contra as outras fronteiras até determinar se areta será eliminada ou encontrar a seção que está dentro da janela

47 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha 2D

Essa abordagem apesar de simples, não é muito eficienteÉ possível reformular o teste inicial e os cálculos de interseções parareduzir o tempo de processamento

48 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

Algoritmo de Recorte de Cohen-Sutherland

Um dos primeiros algoritmos para acelerar o processo de recorteO tempo de recorte é reduzido executando mais testes antes doscálculos das intersecções

Inicialmente a cada ponto final das linhas é assinalado um valorbinário de 4 dígitos, o código da região

49 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

Os valores binários indicam se o ponto está fora de uma fronteira0 (false): dentro ou sobre a fronteira1 (true): fora da fronteira

50 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

A 4 fronteiras juntas criam nove regiões de separação do espaço

Um ponto abaixo e a esquerda a janela de recorte recebe valor 0101,um ponto dentro 0000

51 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

Os valores dos bits são determinados comparando suas coordenadas(x, y) com as fronteiras de recorte

O bit 1 é definido como 1 se x < xwmin

Os outros são obtidos de forma similar

É possível executar esse teste de forma mais eficiente usandooperações binárias seguindo dois passos

1 Calcular a diferença entre as coordenadas dos pontos e as fronteirasda janela

2 Usar o sinal resultante para definir o valor do código (− vira 1, +vira 0)

bit 1 é o sinal de x− xwmin

bit 2 é o sinal de xwmax − xbit 3 é o sinal de y − ywmin

bit 4 é o sinal de ywmax − y

52 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

Com base nesses códigos é possível determinar rapidamente se umalinha está completamente fora ou dentro da janela

Linhas completamente dentro tem seus pontos definidos como 0000Linhas que tenham 1 nas mesmas posições dos pontos finais estácompletamente fora da janela de recorte

Uma linha com pontos finais identificados por 1001 e 0101 estácompletamente a esquerda da janela de recorte

53 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

Esses testes podem ser executados eficientemente usando operaçõeslógicas

1 Quando a operação ou entre dois pontos for falsa (0000) a linha estádentro

2 Quando a operação e entre dois pontos for verdadeira (não 0000) alinha está completamente fora

54 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

As linhas que não podem ser identificadas como completamente foraou dentro da janela de recorte são então processadas para verificarintersecções

55 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

Conforme cada intersecção com as fronteiras da janela de recortesão calculadas, a linha é recortada até restar apenas o que estádentro da janela, ou nenhuma parte esteja dentro da mesma

Para determinar se uma linha cruza alguma fronteira, é somentenecessário verificar os bits correspondentes da fronteira dos pontosfinais

Se um dos bits for 1 e outro 0, a linha cruza a fronteira

56 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

Processando a fronteira esquerda

P1 = 0100→ está dentro da fronteira esquerdaP2 = 1001→ está fora da fronteira esquerda

Calcula a intersecção P′2 e recorta a seção P2P′

2

As outras fronteiras seguem o mesmo princípio

57 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Linha 2D

Recorte de Linha de Cohen-Sutherland

Para se determinar as intersecções da reta definida pelos pontos(x0, y0) e (xend, yend) podemos usar a equação explicita

y = y0 +m(x− x0)

O valor de x será xwmin ou xwmax e a inclinação serám = (yend − y0)/(xend − x0)

Os valores de x da intersecção podem ser calculados usando

x = x0 +y − y0m

O valor de y será ywmin ou ywmax

58 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

59 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos 2D

Para fazer o corte de polígonos, os algoritmo de recorte de linhasnão podem ser aplicados porque em geral esses não produziriampolígonos fechados

Produziriam linhas desconexas sem informação de como uni-las paraformar o polígono recortado

60 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos 2D

É possível processar o polígono contra as fronteiras da janela derecorte de forma semelhante ao algoritmo de recorte de linhas

Isso é feito determinando o novo formato do polígono cada vez queuma fronteira de recorte é processada

61 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos 2D

É possível verificar se um polígono está completamente dentro oufora da janela de recorte verificando suas coordenadas máximas emínimasQuando uma área não puder ser identificada como completamentedentro ou fora, as intersecções são calculadas

62 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos 2D

Uma forma simples de realizar o recorte de polígonos convexos écriar uma nova lista de vértices a cada recorte realizado contra umafronteira, e então passar essa lista para o próximo recorte, contraoutra fronteiraPara polígonos côncavos o processo é mais complexo podendoresultar em múltiplas listas de vértices

63 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos de Sutherland-Hodgman

Algoritmo de Sutherland-Hodgman

Uma forma eficiente de realizar esse recorte é mandar os vértices dospolígonos para cada estágio de recorte de forma que os vérticesrecortados possa ser passado imediatamente para o próximo estágio

Elimina a necessidade de uma lista de novos vértices para cadaestágio de recortePermite implementação paralela do recorte

64 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos de Sutherland-Hodgman

A estratégia deste algoritmo é mandar os pares de pontos finais decada linha sucessiva do polígono para uma série de recortadores(esquerda, direita, inferior e superior)

Conforme o recorte é executado para um par de vértices, ascoordenadas recortadas são enviadas para o próximo recortador

Existem 4 diferentes casos que precisam ser considerados quandouma aresta do polígono é processada

1 O primeiro ponto final da aresta está fora da janela de recorte e osegundo dentro

2 Ambos pontos finais estão dentro da janela de recorte3 O primeiro ponto final da aresta está dentro da janela de recorte e o

segundo fora4 Ambos pontos finais estão fora da janela de recorte

65 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos de Sutherland-Hodgman

Para facilitar a passagem dos vértices de um recortador para outro, asaída de cada recortador pode ser da seguinte forma

66 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos de Sutherland-Hodgman

Conforme cada par de vértices sucessivos é passado para um dosrecortadores, a saída é gerada para o próximo recortador de acordocom os seguintes testes

1 Se o primeiro vértice está fora da janela e o segundo dentro, émandado para o próximo recortador a intersecção obtida e o segundovértice

2 Se ambos vértices estão dentro, somente o segundo vértice é enviado3 Se o primeiro vértice está dentro da janela e o segundo fora, é

mandado para o próximo recortador somente a intersecção4 Se ambos vértices estão fora, nada é enviado

67 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos de Sutherland-Hodgman

68 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Polígonos 2D

Recorte de Polígonos de Sutherland-Hodgman

Limitação

Para polígonos côncavos, problemas podem ocorrer já que essealgoritmo apenas define como saída uma única lista de vértices

Uma solução seria dividir o polígono côncavo em partes convexas

69 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Outras Primitivas 2D

Sumário

1 Introdução

2 A Janela de Recorte

3 Normalização e Transformações de Viewport

4 Programação OpenGLMúltiplas ViewportsMantendo Razão de Aspecto

5 Algoritmos de RecorteRecorte de Ponto 2DRecorte de Linha 2DRecorte de Polígonos 2DRecorte de Outras Primitivas 2D

70 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Outras Primitivas 2D

Recorte de Curvas

Áreas curvas podem ser recortadas usando abordagens parecidascom as apresentadas

Se as curvas forem aproximações poligonais, então o recorte é omesmo apresentado anteriormenteCaso contrário o procedimento de recorte irá envolver equaçõesnão-lineares

71 / 72

Viewing 2DAlgoritmos de Recorte

Recorte de Outras Primitivas 2D

Recorte de Texto

Existem diversas formar para se fazer o recorte de texto, a escolhadependendo do pacote gráfico utilizado e como as letras são geradas

72 / 72