1 - Informática

Propaganda
UFES – Centro Tecnológico
DEPARTAMENTO DE INFORMÁTICA
Prof. Thomas W. Rauber
1ª Prova
Computação Gráfica 2007/2
Justifique todos os cálculos e todas as respostas! Seja breve e rigoroso nos passos lógicos e/ou
matemáticos. Prove os seus passos, não adivinhe!  Boa Prova!
MODELOS DE CORES EM IMAGENS DIGITAIS (3 Pontos)
1. Dada uma cor em uma das três formas de especificação RGB, HSV e verbal, complete as outras duas.
a) branco; b) RGB=(1,2/3,2/3); c) HSV=(1/2,1/2,2/3); d) vermelho pastel; e) RGB(1,1/2,1). Ajuda: A
seqüência do matiz (Hue) no modelo HSV é: Vermelho, Amarelo, Verde, Ciano, Azul, Magenta.
2. O formato PNG tem a capacidade de guardar imagens digitais em “true color” ou com tabela, usando o
modelo de cores RGBA, i.e. RGB mais um canal “alfa” de transparência que tem a mesma resolução
máxima (um byte) que as componentes RGB. Quanta memória ocupa a tabela de cores no mínimo e
no máximo no formato PNG, se para o índice de cor no máximo oito bits são usados?
3. Em geral, qual é a largura máxima de uma imagem PNG “true color” retangular de altura de 32 pixels
que não perderia informação na conversão para PNG com tabela?
4. Em termos de gasto de memória seria melhor guardar um ícone HTML (16x16 pixels) no PNG com ou
sem tabela?
TRANSFORMAÇÕES AFINS DE DUAS DIMENSÕES (5 Pontos)
Use coordenadas homogêneas em todos os cálculos! Com mais que duas concatenações de
transformações afins não é preciso calcular a matriz final, basta a seqüência.
5. Aplique uma reflexão em relação à reta y=mx+b. Ajuda: Decomposição, Pitágoras.
6. É possível deslizar a coordenada (x,-2) para (0,0)?
7. Transforme o quadrado {(1,0), (0,1), (-1,0), (0,-1)} no quadrado {(0,0), (1,0), (1,1), (0,1)}.
PostScript - SINTAXE E SEMÂNTICA (2 Pontos)
8. Desenhe o rolamento da figura A, usando somente uma macro que desenha uma circunferência de raio
um, usando uma repetição incondicional valor_inicial incremento valor_final { ... }
for
9. A curva de Koch é a base do floco de neve de Koch (“Koch snowflake”) que é um fractal. A curva de
Koch de nível 0 é uma reta de comprimento d. Para gerar um nível mais alto, divide se a reta do nível
anterior em três partes iguais e substitui-se o segmento do meio pela parte superior de um triângulo
eqüilateral, veja a figura B para os níveis 0 a 2. Gere uma curva de Koch de nível n de comprimento
d inicial por recursão. Ajuda: A construção do if-then-else com comparação de dois valores é val1
val2 eq { ... } { ... } ifelse. A recursão recebe o nível e o comprimento.
A)
.)
B)
GABARITO
MODELOS DE CORES EM IMAGENS DIGITAIS
1.
COR
R
G
B
H
S
V
Restrições
branco
1
1
1
a
0
1
a[0,1]
vermelho pastel alta intensidade
1
2/3
2/3
0
1/3
1
1/2
4/5
4/5
1/2
1/2
2/3
vermelho pastel
a
b
b
0
(0,0.5)
(0,1]
magenta pastel intensidade
1
1/2
1
5/6
1/2
1
ciano pastel
a>b,
a(0,1]
2. MT = NCor * MCor = NCor * NComp * MComp = 2t * NComp * MComp
em que MT=Memória da tabela, NCor=Número de cores existentes na tabela, MCor=Memória por
cor, NComp=Número de componentes de uma cor, t= Número de bits para indexar a cor
Mínimo: t=0 (uma cor) e MComp=1 bit (dois valores por comp)  MT = 1 * 4 * 1 bit = 4 bits
Máximo: t=8 (256 cores) e MComp=1 byte (256 por comp)  MT = 256 * 4 * 1 byte = 1024 bytes
3. PNG com tabela tem no máximo 256 cores. Se a resolução de cada componente for dois bits ou menos,
somente 256 cores diferentes existem, portanto a imagem pode ter qualquer número de pixels. Se a
resolução de cada componente for três a oito e cada pixel tiver uma cor diferente, a imagem pode ter
no máximo 256 pixels, com uma altura de 32 pixels então uma largura de 256/32 = 8.
4. Da pergunta 2 sabe-se que a tabela ocupa em geral 1024 bytes na pior das hipóteses. Além disso
precisa-se um byte por pixel para indexar a cor. Uma imagem de 256 pixels gasta no máximo a
mesma memória em “true color”, se a resolução das componentes for um byte. Então nesse caso é
melhor guardar em “true color”. Se o ícone for uniforme (ou bastante homogêneo, i.e. poucas cores)
a tabela é pequena o precisa-se poucos bits para indexar a cor. Nesse caso é melhor com tabela.
TRANSFORMAÇÕES AFINS DE DUAS DIMENSÕES
5. Decomposição: 1) Translação por –b em y, 2.) Rotação pelo ângulo negativo que a reta tem com o eixo
x, 3.) Reflexão pelo eixo x, 4.) Rotação inversa, 5.) Translação inversa
 M = T(0,b) R() S(1,-1) R(-) T(0,-b)
Determinação do ângulo: Nas matrizes de rotação aparece somente o seno e co-seno do ângulo.
Temos m = dy/dx. A hipotenusa do triângulo é h = Sqrt(dx*dx+dy*dy).
cos()=x/h = 1/Sqrt(1+m*m), sen()=y/h = m/Sqrt(1+m*m)
6. Hipótese: (0 0 1) T = SH(shx,shy) (x -2 1) T ,  shx=x/2, shy=2/x,  Deslizamento é possível desde que
x seja diferente de zero.
7. Pitágoras: lado do quadrado Q é 2 e ângulo para alinhar lados com os eixos é de ±45º. Passo 1:
Escalamento não diferenciado por = 2/2  S(2/2, 2/2). Centro de Q fica invariante. Passo 2:
Rotação por -45º.  R(-45º). Centro em (0,0) tem que ser transladado para centro (1/2,1/2). Passo 3:
Translação T(1/2,1/2)
 0.5 0.5 0.5 


M = T(1/2,1/2) . S(2/2, 2/2) . R(-45º) = 0.5 0.5 0.5 .


 0

0
1


PostScript - SINTAXE E SEMÂNTICA
8. Rolamento
9. Curva de Koch
%%%%%%%%%% B E A R I N G %%%%%%%%%%%%%%%
/circ {
% unit circle
newpath 0 0 1 0 360 arc closepath stroke
} def
% set the linewidth always to 0.1 dividing it by the scale factor
/linewidth { 0.1 exch div setlinewidth } def
/numBalls 12 def
/bearing {
gsave
/s 100 def
s s scale s linewidth
circ
% outer raceway
grestore
gsave
/s 80 def
s s scale s linewidth
circ
% inner raceway
grestore
/incang 360 numBalls div def % angle increment
0 1 numBalls 1 sub
% repeat 0 ... N-1
{
% counter of loop in now on the stack
/ang exch incang mul def
gsave
ang rotate
90 0 translate
/s 10 def
s s scale s linewidth
circ
% ball
grestore
} for
} def
Erasepage initgraphics
300 300 translate
Bearing showpage
%%%%%%%%%% K O C H S N O W F L A K E %%%%%%%%%%%%%%%
/koch_curve {
% Usage: level length koch_curve
exch
% swap the two arguments
dup
% get the level to test it against 0
0 eq
{
pop
% destroy 'level'
newpath
0 0 moveto
0 lineto
closepath stroke
}
{
1 sub
exch
3.0 div
% now the stack is length/3 , level-1
gsave
2 copy koch_curve
dup 0 translate
-60 rotate
2 copy koch_curve
dup 0 translate
120 rotate
2 copy koch_curve
dup 0 translate
-60 rotate
koch_curve
grestore
}
ifelse
} def
/koch_snowflake {
newpath
2 copy koch_curve
dup 0 translate
% Usage: level length koch_snowflake
120 rotate
2 copy koch_curve
dup 0 translate
120 rotate
koch_curve
closepath stroke
} def
erasepage initgraphics
200 300 translate
3 300 koch_snowflake showpage
Download