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