Lista extra - Computação gráfica
4 pág.

Lista extra - Computação gráfica


DisciplinaAlgoritmo e Programação1.766 materiais14.781 seguidores
Pré-visualização1 página
Algoritmos e Programação ­ Exercícios 
1) Uma das operações mais comuns sobre imagens é processá­las através dos assim chamados 
\u201cfiltros de convolução\u201d. Um filtro de convolução consiste em substituir o valor de cada pixel por 
uma média ponderada entre o valor do pixel e o de seus vizinhos imediatos. Uma maneira 
habitual de se expressar filtros de convolução é através de uma matriz quadrada de tamanho 
ímpar, tipicamente 3x3 ou 5x5, que representa os pesos a serem usados na média ponderada. 
Nesta matriz, o elemento central contém o peso que multiplica o próprio pixel enquanto que os 
demais contêm pesos que multiplicam seus vizinhos. Por exemplo, se tomarmos uma matriz da 
forma [ 0 \u22121 0\u22121 6 \u221210 \u22121 0 ] , um pixel  px , y  situado na posição (x,y) da imagem seria 
substituído por  6px , y\u2212px , y\u22121\u2212px ,y\ue0831\u2212px\u22121, y\u2212px\ue0831, y . Escreva uma função 
convolucao(img,matriz) que toma uma imagem em tons de cinza, uma matriz quadrada de 
pesos e retorna uma imagem processada pelo filtro de convolução. Você pode assumir que o 
objeto img implementa os seguintes métodos/atributos:
\u2022 copy() retorna uma cópia da imagem
\u2022 size é uma tupla da forma (largura,altura) correspondente às dimensões da imagem
\u2022 getpixel(pos) retorna o valor do pixel da imagem na posição pos, onde pos é uma tupla 
da forma (x,y).
\u2022 putpixel(pos,valor) atribui valor ao pixel na posição pos, onde pos é uma tupla da 
forma (x,y).
Na verdade, esta interface é implementada pela biblioteca PIL. Se você a tem instalada, pode 
experimentar seu código com ela. Como exemplo, na figura abaixo, a imagem à direita foi 
obtida processando a imagem da esquerda (uma foto de Ansel Adams obtida em 
http://www.sonoma.edu/pubs/release/2002/ansel.jpeg) usando a matriz dada acima, que efetua 
um realce das bordas da imagem.
 
2) Considere uma lista de pontos p em 3D, onde cada ponto é representado por uma tupla da forma 
(x,y,z). Define­se como mediana da coordenada d (0, 1 ou 2, correspondendo a x, y ou z) 
como a mediana entre todos os valores da d­ésima coordenada de todos os pontos. Escreva uma 
função cortemediana(p,d) que retorna uma lista da forma [a,b], onde a é a lista de todos os 
pontos em p tais que sua d'ésima coordenada é menor que a mediana e b é a lista de todos os 
pontos em p tais que sua d­ésima coordenada é maior ou igual que a mediana. Assim, por 
exemplo, seja p igual a [[8,1,2],[3,2,1],[9,0,1],[0,4,3]]; então, cortemediana(p,1) 
retorna [[[8,1,2],[9,0,1]],[[3,2,1],[0,4,3]]], enquanto que cortemediana (p,0) 
retorna [[[3,2,1],[0,4,3]],[[8,1,2],[9,0,1]]].
3) O módulo turtle provê uma maneira prática de produzir desenhos bidimensionais em Python. 
Após importar o módulo, você pode desenhar retas e curvas movimentando uma \u201ctartaruga\u201d 
(turtle, em inglês) virtual com comandos simples. A idéia geral é que a tartaruga tem uma 
\u201cpena\u201d acoplada que gera traços sobre a tela à medida que esta se move. O módulo implementa 
várias funções entre as quais destacamos:
\u2022 forward(dist) move a tartaruga para a frente dist unidades.
\u2022 backward(dist) move a tartaruga para trás dist unidades.
\u2022 left(ang) gira a tartaruga para a esquerda segundo o ângulo ang dado (em graus, 
normalmente).
\u2022 right(ang) gira a tartaruga para a direita segundo o ângulo ang dado.
\u2022 up() levanta a pena do papel (assim o movimento da tartaruga não deixa marcas)
\u2022 down() abaixa a pena no papel.
\u2022 reset() limpa a tela e centraliza a tartaruga no papel.
\u2022 speed(velocidade) altera a velocidade de movimentação da tartaruga, onde velocidade 
pode ser 'fastest', 'fast', 'normal', 'slow' e 'slowest' (é recomendado usar 
'fastest').
\u2022 tracer(flag) faz com que tartaruga seja mostrada (flag = True) ou não (flag = 
False).
\u2022 done() encerra o desenho e espera que a janela seja fechada manualmente pelo usuário. 
Como exemplo, o trecho abaixo gera o desenho da figura ao lado:
from turtle import * 
setup(width=300,height=300) 
for i in range(3): 
 forward(100) 
 left(120) 
done() 
Considere agora o código abaixo:
def poly(s0,ds=1,incs=0,dang=90,n=4): 
 for i in range(n): 
 forward(s0) 
 right(dang) 
 s0=s0*ds+incs
Chamando a rotina poly passando diferentes parâmetros é possível obter os seguintes desenhos 
(você seria capaz de inferir os parâmetros usados para cada um?)
(a) (b)
(c) (d)
4) Curvas fractais são curvas que apresentam características de auto­semelhança, isto é, partes da 
curva se assemelham à própria curva como um todo. O desenho dessas curvas pode ser 
realizado naturalmente através de rotinas recursivas. Em outras palavras, a rotina chama a si 
própria para desenhar a parte da curva (caso geral) ou então realiza um desenho simples no caso 
base. A recursão é controlada por parâmetros que controlam a escala (o tamanho) das cópias e o 
nível de recursão. Como exemplo, considere uma curva de Koch cujos 4 primeiros níveis de 
aproximação são mostrados abaixo e que pode ser desenhada usando o código Python a seguir:
(nível 0) (nível 1) (nível 2) (nível 3)
def koch (tam, n): 
 """Gera uma curva de Koch de nível n e com lado 'tam'.""" 
 if n==0: 
 forward(tam) 
 else: 
 koch(tam/3,n-1) 
 left(60) 
 koch(tam/3,n-1) 
 right(120) 
 koch(tam/3,n-1) 
 left(60) 
 koch(tam/3,n-1)
Escreva uma função sierpinski (tam, n) para desenhar o triângulo de Sierpinski, cujos 4 
primeiros níveis de aproximação são mostrados na figura abaixo.
(nível 0) (nível 1) (nível 2) (nível 3)
	Algoritmos e Programação - Exercícios