Computação Gráfica I Conteúdo: Professor: - Recorte 2D

Slides:



Advertisements
Apresentações semelhantes
IFTO ESTRUTURA DE DADOS AULA 05 Prof. Manoel Campos da Silva Filho
Advertisements

RECORTE DE FIGURAS Algoritmo proposto para Recorte de Segmentos (atribuído a Ivan Sutherland e Dan Cohen) Para o entendimento do algoritmo a ser proposto,
Programação em Java Prof. Maurício Braga
Geometria Computacional Fecho Convexo II
Instituto de Computação - UFF 1 Computação Gráfica I Professor: Anselmo Montenegro Conteúdo: - Transformações geométricas no plano.
Computação Gráfica I Conteúdo: Professor: - Objetos gráficos espaciais
Marco Antonio Montebello Júnior
Lógica booleana e implementação de funções booleanas
MÁQUINAS UNIVERSAIS Fabrício Dias
Celso C. Ribeiro Caroline T. Rocha
14/10/09 Uma animação possui: Início; Passo; Fim; 1.
Interação entre objetos
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 4.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 9.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 2.
9 de Março de 2006Trajectória de um Projéctil1 Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2005/2006.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3.
Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 11.
Excel Profa. Cristina M. Nunes.
MC542 Organização de Computadores Teoria e Prática
MC542 Organização de Computadores Teoria e Prática
Instituto de Computação - UFF Detecção de Terminação Algoritmos Distribuídos Professora: Lúcia Drummond.
Árvores.
EXPRESSÕES ARITMÉTICAS
EXPRESSÕES ARITMÉTICAS
Introdução à Computação Gráfica Recorte
Geometria Computacional Fecho Convexo
Soma de Produtos Soma de produtos é uma forma padrão de representação de funções Booleanas constituida pela aplicação da operação lógica OU sobre um conjunto.
Recorte e seleção de linhas e polígonos
INF 1366 – Computação Gráfica Interativa Clipping (Recorte)
Linha de produção de imagens com o OpenGL™ (OpenGL Rendering Pipeline)
FUNÇÃO MODULAR.
9. Modelos de Alta Freqüência Pequenos Sinais:
Aula 6 Subprogramas Universidade do Vale do Rio dos Sinos
Programação Baseada em Objectos Desenho de TAD
Listas Encadeadas.
Estrutura de decisão e repetição em JAVA
TENSÕES E CORRENTES EM CIRCUITOS TRIFÁSICOS BALANCEADOS Sistemas de potência são alimentados por geradores trifásicos. De maneira ideal, os geradores suprem.
APRESENTAÇÃO Está prevista a utilização de 6 aulas (6 blocos de 90 minutos) para o ensino do Subtema das Funções Quadráticas. Todas as aulas servirão.
Calculada a solução óptima
Técnica de modelagem de Máquina de Estados em VHDL
PROGRAMAÇÃO I UNIDADE 1.
Dinâmica do Movimento Plano de um Corpo Rígido: Força e Aceleração
Cinemática Plana de um Corpo Rígido Cap. 16
MECÂNICA - ESTÁTICA Esforços Internos Cap. 7.
Momentos de Inércia Cap. 10
Fundamentos de Engenharia de SW
Algoritmos Culturais.
1 António Arnaut Duarte. 2 Sumário: primeiros passos;primeiros passos formatar fundo;formatar fundo configurar apresentação;configurar apresentação animação.
Funções Universidade Federal de Ouro Preto - UFOP
Principais operações em Listas TPA Listas Simples Inserção no Final 1.void insereNofinalDaLista(Lista *l, Elemento e){ 2.Lista paux,p; 3. p.
Representação Digital da Informação
É u m e l e m e n t o f u n d a m e n t a l
EXERCÍCIOS PARA GUARDA-REDES
Infra-Estrutura de Hardware
Técnicas de Modelagem para Aplicações em Computação Gráfica
Tópicos em Arquitetura de Computadores João Angelo Martini Universidade Estadual de Maringá Departamento de Informática Mestrado em Ciência.
1 2 Observa ilustração. Cria um texto. Observa ilustração.
Conceitos básicos em grafos
PROGRAMAÇÃO MATEMÁTICA MÉTODO SIMPLEX
Cinemática Plana de um Corpo Rígido Cap. 16
BCC /01 Aula Teórica 09 Funções Material Didático Proposto. 1 BCC701 – Programação de Computadores I Universidade Federal de Ouro Preto Departamento.
UNIVERSIDADE CATÓLICA DE PELOTAS CENTRO POLITÉCNICO COMPUTAÇÃO GRÁFICA
Dinâmica do Movimento Plano de um Corpo Rígido: Força e Aceleração
GINÁSTICA LABORAL UM NOVO CAMINHO.
Computação Gráfica - Recorte
Introdução à Computação Gráfica Visibilidade e Recorte
Computação Gráfica - Recorte Profa. Mercedes Gonzales Márquez.
Prof. Edison Oliveira de Jesus
Introdução à Computação Gráfica Rasterização
Transcrição da apresentação:

Computação Gráfica I Conteúdo: Professor: - Recorte 2D Anselmo Montenegro www.ic.uff.br/~anselmo Computação Gráfica I Conteúdo: - Recorte 2D

Recorte 2D: introdução Quando especificamos uma janela no espaço do objeto queremos exibir somente dos objetos que estejam no seu interior. Naturalmente alguns objetos estarão parcialmente visíveis. A operação que determina quais partes dos objetos planares estão visíveis na janela é denominado recorte 2D.

Recorte 2D: introdução

Recorte 2D: recorte segmento de reta x retângulo Problema clássico 2D Entrada: Segmento de reta P1P2 Janela alinhada com eixos (xmin, ymin), (xmax, ymax) Saída: Segmento recortado (possivelmente nulo) Algoritmos: Cohen-Sutherland Cyrus-Beck

Recorte 2D: algoritmo Cohen-Sutherland Vértices do segmento são classificados com relação a cada semi-espaço plano que delimita a janela x ≥ xmin e x ≤ xmax e y ≥ ymin e y ≤ ymax Se ambos os vértices são classificados como “fora”, descartar o segmento (totalmente invisível).

Recorte 2D: algoritmo Cohen-Sutherland Se ambos são classificados como “dentro”, testar o próximo semi-espaço. Se um vértice está dentro e outro fora, computar o ponto de interseção Q e continuar o algoritmo com o segmento recortado.

Recorte 2D: algoritmo Cohen-Sutherland ymax ymin xmax xmin

Recorte 2D: algoritmo Cohen-Sutherland ymax ymin xmax xmin

Recorte 2D: algoritmo Cohen-Sutherland ymax ymin xmax xmin

Recorte 2D: algoritmo Cohen-Sutherland ymax ymin xmax xmin

Recorte 2D: algoritmo Cohen-Sutherland ymax ymin xmax xmin

Recorte 2D: algoritmo Cohen-Sutherland Recorte só é necessário quando houver um vértice dentro e outro fora. Classificação de cada vértice pode ser codificada em 4 bits, um para cada semi-espaço: Dentro = 0 e Fora = 1 1000 x=x0 y=y1 x=x1 y=y0 1010 1001 0000 0010 0001 0100 0110 0101 tbrl

Recorte 2D: algoritmo Cohen-Sutherland Rejeição trivial: Classif(P1) and Classif(P2) ≠ 0 Aceitação trivial: Classif(P1) or Classif(P2) = 0 Interseção com quais semi-espaços? Classif(P1) xor Classif(P2) 1000 1010 1001 0000 0010 0001 0100 0110 0101 1000 1010 1001 0000 0010 0001 0100 0110 0101 1000 1010 1001 0000 0010 0001 0100 0110 0101 1000 1010 1001 0000 0010 0001 0100 0110 0101 0000 and 0000 = 0000 0000 or 0000 = 0000 0000 xor 0000 = 0000 1010 and 0110 = 0010 1010 or 0110 = 1110 1010 xor 0110 = 1100 0001 and 0100 = 0000 0001 or 0100 = 0101 0001 xor 0100 = 0101 0100 and 1010 = 0000 0100 or 1010 = 1110 0100 xor 1010 = 1110

Recorte 2D: algoritmo Cohen-Sutherland - cálculo do código de um vértice unsigned char code(double x, double y, double xmin, double xmax, double ymin, double ymax) { unsigned char code=0; if (y > ymax) code += 8; if (y < ymin) code += 4; if (x > xmax) code += 2; if (x < xmin) code += 1; return code; }

Recorte 2D: algoritmo Cohen-Sutherland void CohenSutherlandLineClip(double x0, double y0, double x1, double y1, double xmin, double xmax, double ymin, double ymax) { unsigned char outcode0, outcode1, outcodeOut; double x, y; boolean accept = FALSE, done = FALSE; outcode0 = code(x0, y0, xmin, xmax, ymin, ymax); outcode1 = code(x1, y1, xmin, xmax, ymin, ymax); do { if (outcode0 == 0 && outcode1 == 0) { accept = TRUE; done = TRUE; /* trivial draw and exit */ } else if((outcode0 & outcode1) != 0) { done = TRUE; /* trivial reject and exit */ } else { /* discart an out part */ outcodeOut = (outcode0 != 0) ? outcode0 : outcode1; /* pick an out vertice */ if (outcodeOut & 8) { /* discart top */ x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0); y = ymax; } else if(outcodeOut & 4) { /* discart bottom */ x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0); y = ymin; } else if(outcodeOut & 2) { /* discart right */ y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0); x = xmax; } else if(outcodeOut & 1) { /* discart left */ y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0); x = xmin; } if (outcodeOut == outcode0) { x0 = x; y0 = y; outcode0 = code(x0, y0, xmin, xmax, ymin, ymax); } else { x1 = x; y1 = y; outcode1 = code(x1, y1, xmin, xmax, ymin, ymax); } while (!done); if (accept) DrawLineReal(x0, y0, x1, y1);

Recorte 2D: algoritmo Cyrus-Beck O algoritmo de Cohen-Sutherland calcula interseções desnecessárias. O algoritmo de Cyrus-Beck utiliza uma estratégia que permite recortar um segmento com menor número de interseções. Pode ser utilizado quando a região de recorte é um polígono convexo.

Recorte 2D: algoritmo Cyrus-Beck Se baseia na equação paramétrica da reta e no cálculo de interseções baseado nesta representação. PEi P1 P0 Ni

Recorte 2D: algoritmo Cyrus-Beck Dado um segmento P0P1, sua reta suporte intersecta as quatro retas laterais do retângulo em quatro pontos (caso geral). Usando a equação paramétrica calculamos os quatro valores do parâmetro t no qual a reta intersecta as quatro retas laterais do retângulo de recorte. Após calcular o valor de t para as quatro retas descartamos os valores de t fora do intervalo [0,1].

Recorte 2D: algoritmo Cyrus-Beck Cada uma das quatro retas divide o espaço em dois semi-planos. Chamaremos de semi-planos positivos aqueles dados pelas equações yy1, yy0, x  x1, x  x0. y  y1 y  y0 x  x0 x  x1

Recorte 2D: algoritmo Cyrus-Beck Quando a reta P(t) entra em um dos semi-planos através do ponto P(t0), tal ponto é identificado com um sinal - (tE). Se o ponto for de saida indicamos com sinal +(tL). O sinal do ponto é obtido usando o sinal do produto interno <Ni,P1-P0>. Se <Ni,P1-P0><0 então o ponto é negativo, caso contrário é positivo.

Recorte 2D: algoritmo Cyrus-Beck F - D + + y=y1 + A + - E - y=y0 C x=x1 x=x0

Recorte 2D: algoritmo Cyrus-Beck – pseudo-código { 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;

Recorte 2D: recorte de polígono x retângulo Inclui o problema de recorte de segmentos de reta. Polígono resultante tem vértices que são: Vértices da janela, Vértices do polígono original, ou Pontos de interseção aresta do polígono/aresta da janela Dois algoritmos clássicos Sutherland-Hodgman Figura de recorte pode ser qualquer polígono convexo. Weiler-Atherton Figura de recorte pode ser qualquer polígono.

Recorte 2D: recorte de polígono x retângulo Casos Simples Casos Complicados

Recorte 2D: Algoritmo Sutherland-Hodgeman Idéia é semelhante a do algoritmo de Cohen-Sutherland. Recortar o polígono sucessivamente contra todos os semi-espaços planos da figura de recorte.

Recorte 2D: Algoritmo Sutherland-Hodgeman Polígono é dado como uma lista circular de vértices. Vértices e arestas são processados em seqüência e classificados contra o semi-espaço plano corrente. Vértice: Dentro: copiar para a saída. Fora: ignorar. Aresta Intercepta semi-espaço plano (vértice anterior e posterior têm classificações diferentes): copiar ponto de interseção para a saída. Não intercepta: ignorar.

Recorte 2D: Algoritmo Sutherland-Hodgeman Dentro Fora Dentro Fora Dentro Fora Dentro Fora s p i s p p s i p s Copiar p Copiar i Ignorar Copiar i,p

Recorte 2D: Algoritmo Sutherland-Hodgeman - exemplo

Recorte 2D: Algoritmo Sutherland-Hodgeman - exemplo

Recorte 2D: eliminando arestas fantasmas Distinguir os pontos de interseção gerados: De dentro para fora: rotular como do tipo . De fora para dentro: rotular como do tipo β. Iniciar o percurso de algum vértice “fora”. Ao encontrar um ponto de interseção , ligar com o último β visto. Resultado pode ter mais de uma componente conexa. β  Dentro Fora

Recorte 2D: eliminando arestas fantasmas - exemplo

vf0 0 vd0 0 vf1 vf2 1vd1 vd2 vd3 1 vf3vf0 Recorte 2D: eliminando arestas fantasmas - exemplo vf3 vf0 vf1 vf2 0 1 1 0 vd1 vd0 vd2 vd3 vf0 0 vd0 0 vf1 vf2 1vd1 vd2 vd3 1 vf3vf0 0 vd0 0 0 e 1 vd1 vd2 vd3 1 1

Recorte 2D: eliminando arestas fantasmas - exemplo 0 1 1 0 vd1 vd0 vd2 vd3

Recorte 2D: eliminando arestas fantasmas - exemplo vd0 vf0 vf3 vd2 vf1 0 vd1 vd3 vf2 0

Recorte 2D: eliminando arestas fantasmas - exemplo vd0 vd2 0 vd1 vd3 0

Recorte 2D: algoritmo Sutherland-Hodgman - resumo Facilmente generalizável para 3D. Pode ser adaptado para implementação em hardware. Cada vértice gerado pode ser passado pelo pipeline para o recorte contra o próximo semi-espaço plano. Pode gerar arestas “fantasma” Irrelevante para propósitos de desenho. Podem ser eliminadas com um pouco mais de trabalho.