Computação Gráfica I
Exercícios para P1 - 2011/1
Processo
de Visualização 2D
-
Suponha
um programa de desenho onde a
área disponível, na tela, para a
exibição
dos objetos é de tamanho fixo. Uma das facilidades do
programa
é a ferramenta de ZOOM. Explique detalhadamente quais as
etapas
envolvidas no processo de realização do Zoom.
Considere
deste a marcação da área de zoom,
até a
reexibição do desenho. Assuma a
existência de uma
rotina(DesenhaTudo) capaz de reexibir todo o desenho, já
realizando o recorte. Explique como são obtidos os valores
limites para as janelas de exibição e
seleção. Quem informa este valores, o programador
ou o
usuário ?. Mostre quais as rotinas necessárias
para
conversão de coordenadas. Voce NÃO precisa
criar o
código das rotinas, apenas explique em detalhes o que elas
fazem.
-
Explique
qual a utilidade da etapa de
Instanciamento no processo de visualização
bidimensional.
-
Dê
um exemplo em que se possa mostra
porque a técnica de Instanciamento pode economizar
memória. Assuma que 1 número inteiro ocupa 2
bytes.
-
Desenhe em uma viewport quadrada o triângulo
(10,10)-(20,50)-(30-10). Estas coordenadas referem-se ao modelo do
triângulo no universo. Considere cada uma das windows
especificadas.
Window
: (0,0)-(100,200)
Window : (0,0)-(200,100)
Window : (0,0)-(1000,60)
- Considere: todas as etapas do
processo de visualização de objetos 2D; uma window delimitada por:
xumin=10, xumax=70, yumin=40 e yumax=80; e os seguintes parâmetros de
instanciamento, aplicados nesta ordem:
1º) Escala em X: 1, Escala em Y: 2 2º) Rotação: 0
3º) Translação X: 10, Translação Y: 0
Os retângulos com linhas pontilhadas representam a viewport.
Qual dos desenhos a seguir pode representar o desenho do triângulo definido por (0,10)-(0,40)-(60,10)?
Justifique sua resposta.
-
Suponha
um programa de desenho onde a
área disponível, na tela, para a
exibição
dos objetos é de tamanho fixo. Utilizando os conceitos de
Janela
de Seleção(window) e Janela de
Visualização
como seria possível exibir uma certa parte de um desenho com
um
tamanho maior na tela ?
-
Suponha
um programa de desenho onde haja
disponível, na tela, duas áreas de tamanhos
diferentes
para a exibição dos objetos. Utilizando os
conceitos de
Janela de Seleção(window) e Janela de Exibição(viewport) como seria possível
exibir os mesmos
objetos em ambas as regiões ?
Manipulação/Processamento
de Imagens
- Execute na imagem a seguir o
algoritmo de halftone, dither e
difusão de erro. Considere, nos três casos que a
imagem
pode ter 10 tons de cinza(0 a 9) e use uma matriz 2x2.
- Crie uma rotina capaz de
imprimir um ponto usando a
técnica de Halftone. Armazene apenas uma matriz.
Não use
uma matriz diferente para cada cor, nem faça um grande
switch.
- Esboce o algoritmo que
você usaria para exibir uma
cópia de uma imagem de 64 tons de cinza(que já
está na tela) com 16 tons, na mesma tela. A escolha do
algoritmo
deve ter como objetivo exibir a imagem com a maior velocidade
possível.
- Crie uma rotina
void ExibePtoHalf(x,y,tom) capaz de
imprimir um ponto usando a técnica de Halftone. Na rotina os
parâmetros x,y representam do ponto na imagem de origem e tom
a
intensidade deste e mesmo ponto. Armazene apenas uma vez a matriz dada
acima. Não use uma matriz diferente para cada tom de cinza ,
nem
faça um grande switch. Considere que a imagem de entrada tem
10
tons de cinza [0..9] e que a matriz de Halftone é 2x2.
Considere
que as variáveis (CX,CY) são o canto superior
esquerdo da
região onde deve ser exibida a imagem de saída.
-
Crie
uma rotina para suavizar uma imagem. Defina
você mesmo a matriz de suavização.
Assuma a
existência da rotina LeCor(x,y, R,G,B) capaz de ler as
componentes R, G e B de um ponto (x,y) da imagem.
-
Explique
como funciona a técnica de
detecção de bordas.
- Explique como funciona o método da mediana para remoção de ruídos.
- Execute na imagem a seguir o algoritmo de difusão de erro.
Considere que a imagem pode ter 256 tons de cinza (de 0 a 255).
Considere o Limiar como sendo 128.
IMAGEM
100 165
165 125 |
MATRIZ DE DIFUSÃO
40%
40% 20%
|
- Crie uma imagem-exemplo e aplique uma convolução a partir da matriz abaixo.
- Para que servem os filtros SOBEL e GAUSSIANO ??
- O que é um histograma ? Monte
uma imagem 10x10 pontos em tons de cinza e crie um histograma.
Considere que a imagem tem cada tonde cinza armazenado em 4 bits.
- A equalização do histograma de uma imagem produz que efeito sobre uma imagem ?
- Como se equaliza uma imagem em true-color ?
- Quais as formas de segmentação por limiar ?
- Quais as formas de segmentação por regiões ?
- Aplique na imagem abaixo um algoritmo de segmetação por Divisão-União, dividindo a imagem por uma quadtree.
Modelagem de Sólidos
- Crie uma quadtree para representar a figura
abaixo. Use uma
árvore com no máximo 5 níveis.
- Quais as formas de
armazenamento de objetos geométricos
apresentadas
na disciplina ? Apresente as características de cada forma.
- Quais
as técncas de modelagem pode ser usadas para criar objetos geométricos.
Explique qual a forma de armazenamento é mais adequada para cada
técnica.
- Considere que você precisa construir um sistema de modelagem para
criar
objetos a partir dos quais um outro sistema vai calcular
intersecções entre objetos. Como você armazenaria esses objetos, se desejasse ter um
melhor
desempenho
em termos de tempo de execução do
cálculo de
intersecção
?
- Imagine um
polígono desenhado sobre uma tela. Este
polígono
está pintado em verde, sobre um fundo amarelo.
Crie uma rotina que
armazene este polígono em uma
quadtree.
O cabeçalho da rotina deve ser
void Quadtree(NODO *Raiz; int X1,Y1,X2,Y2);
onde (X1,Y1) representam as coordenadas do canto superior esquerdo
da área de desenho e (X2,Y2) representam as coordenadas do
canto
inferior direito da área de desenho.
Sabendo que:
- A classe
a seguir serve para armazenar um do nodo
de uma quadtree;
class Nodo{
int Status;
// Cheio,
Vazio, Cinza
Nodo *ListaDeFilhos[4];
// 4 referências para nodos-filho
} ;
- Existe uma
função LeCor(x,y) capaz de ler a
cor de um ponto
na tela;
- Se o nodo da quadtree
tem dimensões menores que 5x5,
não
é preciso subdividi-lo mais;
- Se o nodo tem 90% de
seus pontos pintados, então ele
é considerado cheio;
- Se o nodo tem 90% de
seus pontos não pintados,
então ele
é considerado vazio.
OpenGL
-
Mostre a imagem gerada pelo trecho de programa em OpenGL dado a seguir.
Numere os desenhos de acordo com os comentários do código
fonte.
void Desenha()
{
glBegin();
glvertex2f(0,0);
glvertex2f(0,10);
glEnd();
}
void FazDesenho()
{
glTranslatef(10,0,0);
glRotatef(-45,0,0,1);
Desenha(); // 1
glLoadIdentity();
glTranslatef(0,10,0);
Desenha(); // 2
glTranslatef(0,10,0);
glRotatef(90,0,0,1);
Desenha(); // 3
glRotatef(-90,0,0,1);
Desenha(); // 4
}
-
Mostre a imagem gerada pelo trecho de programa em OpenGL dado a seguir.
Numere os desenhos de acordo com os comentários do código
fonte.
void DesenhaObjeto() {
glBegin(GL_LINE_STRIP);
glVertex2f(0,0);
glVertex2f(2,0);
glVertex2f(2,2);
glVertex2f(0,2);
glEnd();
}
void Desenha(void) {
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glColor3f(1.0f, 1.0f, 1.0f);
glTranslatef(5,0,0);
DesenhaObjeto(); // Desenha 1
glPushMatrix();
glTranslatef(-10,0,0);
DesenhaObjeto(); // Desenha 2
glPushMatrix();
glRotatef(90,0,0,1);
glTranslatef(0,-5,0);
DesenhaObjeto(); // Desenha 3
glPopMatrix();
glRotatef(-90,0,0,1);
glTranslatef(0,5,0);
DesenhaObjeto(); // Desenha 4
glPopMatrix();
}
FIM.