Escolar Documentos
Profissional Documentos
Cultura Documentos
PROGRAMAÇÃO MULTIMÉDIA
2 de maio de 2023
0 Revisões 1
0.1 Bolas e Quadrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.2 Cursores deslizantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.3 Grelha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
0.4 Gráfico de Linhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
0.5 Bolas à roda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
0.6 Sub-grelhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1 Áudio 6
1.1 Bola que colide com bordo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Bola “panorâmica” que colide com bordo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Múltiplas bolas “panorâmicas” que colidem com bordo . . . . . . . . . . . . . . . . . . . . 7
1.4 Bateria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5 Bate Palmas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6 Volume Visual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.7 Círculo para posição e amplitude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.8 Visualização de Volume em Barra de LEDs . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.9 Visualização de posição e análise espectral . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.10 Visualização de Bandas de Frequência em Barras de LEDs . . . . . . . . . . . . . . . . . . 10
1.11 Visualização de volume e deteção de batida . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.12 Análise espectral de sinais sinusoidais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.13 Análise FFT de onda quadrada versus ruído branco . . . . . . . . . . . . . . . . . . . . . 15
1.14 Visualizador baseado na posição e FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2 Imagem 16
2.1 Rato sobre imagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Redimensionar imagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 Stop motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 Grelha de imagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5 Sintetizar gradiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6 Gradiente sobre imagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.7 Animação de imagem de avião . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.8 Pontilhismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.9 Alteração de Imagem e geração de Som . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.10 Transparência com máscara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.11 Lanterna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.12 Mudança de cor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.13 Mudança de Brilho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
i
3 Estruturas de Dados: ArrayLists 26
3.1 Fita de um Filme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2 Bolas na horizontal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.3 Faixas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.4 Tinta que Desaparece . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.5 Bolas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.6 Quadrados com escolha de cor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.7 ArrayLists e imagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4 Texto 31
4.1 Strings e Tipografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.1 Concatenar ao Centro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.2 Escreve Palavras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.3 Espreitar sub-cadeias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1.4 Chuva de Carateres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1.5 Animação de carateres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1.6 Grelha de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2 Ficheiros de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.1 Animar linhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.2 Mostrar linhas pares / ímpares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.3 Codificar texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.4 Mostrar contexto de palavra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.5 Guardar Iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.6 Funções sobre conteúdo de ficheiro . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.7 Bolas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.8 Configurar Animação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.9 Ler melodia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.10 Wordle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.11 Nuvem de Palavras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5 Vídeo 40
5.1 Classe Movie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.1.1 Tint aleatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.1.2 Play Pause Duplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.3 Bloco aleatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.4 Barra de reprodução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.5 Slitscan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.1.6 Grelha de vídeo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2 Captura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.1 Ponto mais brilhante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2 Slitscan: câmara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.3 Espelho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.4 Ponto mais brilhante interativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.5 Detetor de movimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.6 Movimento com ruído . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.7 Brilho e Saturação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.8 Movimento e som . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6 Herança 47
6.1 Ecrãs e Botões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.2 Bateria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.3 Efeitos em imagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
ii
7 Simulação Física 50
7.1 Cinemática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
7.1.1 Bola com vento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
7.1.2 Bolas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.1.3 Colisão parcialmente inelástica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.2 Sistemas de Partículas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.2.1 Bolas e Blocos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.2.2 Chuva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
iii
Capítulo 0
Revisões
(a) Rato sobre a metade superior (b) Rato sobre a metade inferior
Figura 1
1
Ficha 0.4
Figura 2: Cursores
Quando o utilizador clicar num dos cursores, este deverá acompanhar a coordenada Y do rato até
que o botão seja libertado (independentemente da coordenada X).
0.3 Grelha
Construa um programa que crie uma janela de 400×400. Nessa janela deve ser desenhada uma grelha de
quadrados. Sabe-se que cada quadrado tem lado 20. Há quadrados brancos e há quadrados com outras
cores (quando a linha e a coluna são ímpares). No início, alguns destes últimos são azuis e os restantes
amarelos, havendo uma probabilidade de 50% para cada caso (fig. 3a). Quando o utilizador clica com o
rato sobre um quadrado branco nada deve acontecer. No entanto, quando clica sobre um quadrado com
outra cor, todos os quadrados com essa cor devem mudar para uma nova cor definida aleatoriamente.
Este comportamento deve manter-se enquanto o programa estiver a correr (na fig. 3b mostra-se uma
situação em que o utilizador clicou sobre um quadrado cor de laranja, tendo todos os dessa cor mudado
de cor).
Figura 3
2
Ficha 0.5
a Implemente o programa de forma a desenhar, numa janela de 500×500, um gráfico de linhas como
o da Figura 4. Os valores de dados são representados por pontos (pequenos círculos negros); as
linhas unem esses pontos; os valores de erros são representados por linhas vermelhas. Cada uma
destas linhas vermelhas verticais está centrada num ponto e tem um comprimento igual ao dobro
do respectivo erro.
b Faça as alterações necessárias para que o valor do erro varie consoante a posição do click do rato.
Se o utilizador premir na parte inferior da janela, os valores do erro diminuem; na parte superior
aumentam. Esta variação é feita em decrementos/incrementos de 1 ponto.
3
Ficha 0.5
• um método void desenha(), que deverá desenhar a bola de acordo com os valores das
variáveis de estado;
b. Escreva um programa que, recorrendo à classe da alínea anterior, permita criar 8 bolas que rodam
em torno do centro de uma janela de 500×500.
Cada bola rodará a uma distância do centro diferente (ver figura 6a): a que roda mais próximo do
centro está a uma distância deste de 40; as distâncias das bolas seguintes são sempre superiores
em 25 à distância da bola anterior.
O raio de cada bola é um valor entre 5 e 12 definido aleatoriamente. A cor de cada bola é definida
aleatoriamente.
A distância angular de cada bola à origem é inicialmente zero (ver figura 6a). O incremento angular
de cada bola é um valor obtido dividindo 2π por um valor aleatório entre 300 e 400 (ou seja, as
bolas rodam a velocidades diferentes). A figura 6b ilustra uma situação algum tempo após o início.
Nota: as linhas cinzentas que aparecem nas figuras não são para desenhar.
c. Acrescente ao programa da alínea anterior o código necessário para que o programa passe a
funcionar da seguinte forma:
• Quando se prime a tecla de espaço, o sentido de rotação das bolas inverte-se (se estavam a
rodar no sentido dos ponteiros do relógio, passam a rodar no sentido contrário, e vice-versa).
• Quando se prime a tecla ‘c’, as cores de todas as bolas são aleatoriamente redefinidas.
• Quando se prime a tecla ‘v’, o valor absoluto da velocidade de rotação de cada uma das bolas
é incrementada no valor de 2π/500.
d. Acrescente ao programa da alínea anterior o código necessário para que o programa passe a
funcionar da seguinte forma:
• É desenhado um círculo de raio 30, interior branco e bordo cinzento, centrado na posição do
rato;
4
Ficha 0.6
• Sempre que se der um click no botão do rato, todas as bolas que sejam intersetadas pelo
círculo branco mudarão de cor: o seu interior passará a ser preto.
0.6 Sub-grelhas
Escreva um programa que construa um array bidimensional de estruturas color, com 20×20 posições, e
inicialize aleatoriamente cada célula com uma cor. Em seguida, o programa deverá desenhar uma grelha
20×20 numa janela 300×300 representando o conteúdo do array (exemplo na Figura 7a).
Uma vez desenhada a grelha, o programa passa a interagir com o rato: espera-se que o utilizador
dê dois clicks sobre a grelha, marcando, assim, duas quadrículas. Estas quadrículas são os vértices
opostos de um rectângulo cuja cor pretendemos manter. Todas as quadrículas fora deste rectângulo
deverão passar a preto (exemplo na Figura 7b).
Figura 7: Sub-grelhas
5
Capítulo 1
Áudio
6
Ficha 1.5
1.4 Bateria
Crie um programa que reproduza graficamente (de forma aproximada apenas – com círculos e retângulos)
a Figura 1.4. Utilize classes na sua implementação – uma classe para as peças retangulares e outra para
as peças redondas – e um array para armazenar estas últimas.
Para além das respetivas dimensões, ao construir as peças, deve associar-lhes um som, entre os
ficheiros de áudio disponibilizados, correspondente ao nome na imagem. Finalmente, garanta que, ao
clicar em cada peça, o som respetivo é reproduzido.
7
Ficha 1.7
8
Ficha 1.9
(a) Programa quando o som está na (b) Programa quando o som está perto
primeira metade e a amplitude elevada. do final e a amplitude é baixa.
9
Ficha 1.10
10
Ficha 1.10
11
Ficha 1.10
12
Ficha 1.10
13
Ficha 1.13
– o círculo deverá ser desenhado com centro em (x, y), onde x é proporcional à posição atual
(em segundos) do ficheiro que está a ser reproduzido e y proporcional à amplitude, com
60 ≤ y ≤ 540;
– o raio deverá ser 5;
– a cor de preenchimento corresponde ao valor hexadecimal #1ECBE1 e a opacidade (canal
alpha) a 127.
14
Ficha 1.14
Figura 1.15: Análise espectral de uma onda quadrada (em cima) e de ruído branco (em baixo).
15
Capítulo 2
Imagem
(a) Rato sobre a imagem da esquerda (b) Rato sobre a imagem da direita
Figura 2.2
Nota:
16
Ficha 2.3
Figura 2.3
17
Ficha 2.6
cor diferente. A Figura 2.4 exemplifica as cores vermelho, verde e azul com transparência (127) para os
filtros.
18
Ficha 2.7
19
Ficha 2.9
Na metade direita da janela, deverá animar uma nova imagem invertida que é sintetizada a partir
da imagem original. A imagem invertida deverá mover-se de cima para baixo, à mesma velocidade da
original, de forma síncrona com ela: quando a original surge no fundo, a invertida surge de cima. Veja
o exemplo da Figura 2.8.
Para além disso, a cor do fundo deve alterar-se consoante a posição da imagem original. O programa
não deve parar.
2.8 Pontilhismo
Construa um programa que leia uma imagem e construa uma nova num estilo inspirado no pontilhismo,
mostrando o processo de construção. Para tal, o programa deverá animar uma janela inicialmente branca,
com o mesmo tamanho (640×425) da imagem original5 . Depois, em cada frame, deverá selecionar
aleatoriamente um ponto dessa imagem, e usar a cor desse ponto para desenhar na janela uma elipse
centrada na coordenada correspondente ao ponto, com a mesma cor, mas uma transparência gerada
aleatoriamente (entre 50 e 100), e com altura e largura também definidas aleatoriamente (entre 4 e 8).
A Fig. 2.9 ilustra o resultado que se pode obter ao fim de algum tempo.
a) O mesmo programa deve reproduzir uma onda sinusoidal, com frequência que pode variar entre 50 e
1000, consoante o matiz do pixel para onde o ponteiro do rato estiver a apontar6 ;
b) Uma segunda funcionalidade do programa deve ser ativada ao carregar nas teclas 1, 2, e 3. Neste caso,
a imagem deve ser alterada, desenhando faixas horizontais vermelhas, verdes e azuis, respetivamente
nos píxeis com o valor da ordenada múltiplo de 5, 7 e 11. Ao voltar a carregar nas mesmas teclas, as
faixas respetivas devem desaparecer.
A título de exemplo, para a imagem tulips.jpg e depois de carregar uma vez nas teclas 1, 2 e 3, o
resultado deve ser o da Figura 2.10.
5 Use a imagem com o nome "tulips.jpg".
6 Para obter o matiz de um pixel pode usar a função hue().
20
Ficha 2.10
Nota: para que demasiadas alterações da frequência da onda em curtos intervalos de tempo não
gerem ruído, recomenda-se alterar a frameRate para um valor baixo, por exemplo, 10.
21
Ficha 2.11
A imagem transformada é obtida através da aplicação de uma máscara. A máscara é aplicada sobre o
canal alfa para possibilitar transparência. Por exemplo, a aplicação da máscara da Fig. 2.11a à imagem
da Fig. 2.11b resulta no efeito de transparência que se vê na Fig. 2.11c sobre fundo branco.
Figura 2.11
Notas:
• Recomenda-se a utilização do método copy() para obter uma imagem que corresponde a uma cópia
da original (imagem cópia).
• Para ser possível a aplicação da máscara, a imagem cópia e a imagem da máscara devem ter as
mesmas dimensões. Use a função resize().
• Recomenda-se a utilização do método mask() da classe PImage.
22
Ficha 2.11
2.11 Lanterna
Crie um programa que simule o funcionamento de uma lanterna ao ajustar o brilho de uma parte de uma
imagem em função da distância dessa região ao rato – a imagem7 será o cenário a iluminar. A mudança
de brilho deverá ocorrer num raio de 100 pixels.
A simulação da lanterna deverá incluir quatro modos de iluminação: branco, vermelho verde e azul
(ver Fig. 2.13). Para alternar entre estes modos, as teclas ‘1’ a ‘4’ deverão ser programadas.
(a) (b)
(c) (d)
Figura 2.13: Os quatro modos de iluminação: (a) branco; (b) vermelho; (c) verde; (d) azul.
23
Ficha 2.13
Nota:
• Como exemplo, poderá consultar o vídeo disponível em http://tinyurl.com/y4aqh26g.
24
Ficha 2.13
Figura 2.15
25
Capítulo 3
3.3 Faixas
Crie um programa que comece por desenhar uma janela de (500×500), com fundo branco. A partir desse
momento, de cada vez que o utilizador dê um click na janela, o programa deverá dividir a janela , fazendo
aparecer um traço vertical no ponto onde o click foi dado. Os traços irão dividindo a janela em faixas
verticais, com diferentes níveis de cinzento, como se ilustra na Fig. 3.4.
O cálculo do nível de cinzento imediatamente à direita de cada traço é efetuado a partir da coordenada
horizontal desse mesmo traço: quanto mais à esquerda está o traço, mais clara é a cor da faixa à direita
do traço. Por exemplo, um traço na coordenada zero dá cor branca à sua direita, enquanto um traço na
coordenada 250 (a meio da janela) dará um nível de cinzento 123 (255/2).
26
Ficha 3.5
Figura 3.1
(a) Situação inicial (b) Após premir duas vezes ’p’ (c) Após premir quatro vezes ’u’
Figura 3.2
27
Ficha 3.6
(a) Situação inicial (b) Após premir duas vezes ’p’ (c) Após premir quatro vezes ’u’
Figura 3.3
3.5 Bolas
Escreva um programa que, numa janela 500×500, comece por desenhar um conjunto de 10 bolas em
posições aleatórias, com diâmetro aleatório entre 50 e 100. Durante a execução, o programa deverá ter
o seguinte comportamento:
i) permitir ao utilizador apagar bolas premindo o rato sobre uma ou mais bolas;
ii) permitir ao utilizador adicionar mais bolas premindo o rato sobre uma posição não ocupada por
nenhuma bola;
iii) animar as bolas existentes fazendo a sua cor variar em função do valor da posição Y do rato: devem
ser pretas quando mouseY for 0, brancas quando mouseY for 500, apresentando níveis de cinzento
progressivos e uniformes à medida que o rato vai do topo para o fundo da janela.
As figuras 3.6a e 3.6b mostram duas situações do programa, a primeira com o rato perto do topo da
janela (logo, as bolas são muito escuras) e a segunda após a inserção de mais algumas bolas e a deslocação
do rato para a parte inferior da janela levando a que a cor das bolas se aproxime de branco.
Implemente este programa recorrendo a um ArrayList.
28
Ficha 3.6
(a) Rato próximo do topo, com as 10 bolas iniciais. (b) Rato próximo do fundo, com mais bolas inseridas.
Figura 3.6
• a zona entre os 100 e os 600 de altura, incialmente livre, mas onde serão desenhados os quadrados
da ArrayList.
A zona de cima servirá apenas para selecionar uma cor, através de um clique num retângulo. Para
saber a cor selecionada, pode recorrer ao array pixels da janela do Processing.
Ao clicar com o rato na zona de baixo, poderão acontecer duas coisas. Um clique numa zona vazia
irá adicionar à ArrayList um quadrado centrado na posição do clique, com lado variável entre 10 e 50, e
29
Ficha 3.7
cor igual à última cor selecionada. Um clique em cima de um quadrado deve resultar na remoção desse
quadrado da ArrayList.
Os quadrados devem ser representados por uma classe Quadrado, com o seguinte esqueleto:
class Quadrado{
color cor;
PVector centro;
int lado;
30
Capítulo 4
Texto
Figura 4.1: Exemplo de concatenação ao centro para array com Strings “um”, “dois”, “três” e “...”.
Altere o programa de forma a que, quando a largura do texto a mostrar ultrapassar a largura
disponível, esse texto seja apagado e comece tudo de novo.
31
Ficha 4.1
Figura 4.2: Exemplo para array com Strings “casa”, “roubada”, “trancas”, “à” e “porta”.
Figura 4.3: Texto visível: no início, após um clique, e após dois cliques no rato.
32
Ficha 4.1
Figura 4.4
frequências do som devem ser analisadas e a posição vertical de cada carater deve ser proporcional ao
valor de cada banda (i.e., cada carater acabará por estar associado a uma banda). A posição horizontal
de cada carater deve ser constante, com os carateres equidistantes um dos outros e a ocupar a largura
total da janela. Utilize uma fonte à sua escolha.
Nota: tenha em atenção que o número de bandas da análise FFT tem de ser uma potência de 2.
Se o comprimento da sua palavra não for uma potência de 2, escolha a potência de 2 mais baixa mas
superior ao comprimento da palavra e ignore as últimas bandas.
33
Ficha 4.1
Figura 4.5
34
Ficha 4.2
• A janela deve ser “dividida” em n divisões horizontais, em que n corresponde ao número de linhas
do ficheiro;
• Cada divisão horizontal será também “dividida” em m partes iguais, em que m é o número de
carateres da string que lhe corresponde;
• Em cada parte será desenhada uma forma, de acordo com o carater correspondente. Por exemplo:
A título de exemplo, as figuras 4.6 e 4.7 mostram o resultado da aplicação das regras anteriores em dois
textos diferentes.
as pombinhas da Catrina
andaram de mão em mão,
foram ter à Quinta Nova
ao Pombal de São João.
Figura 4.6: Exemplo de codificação para a letra As Pombinhas da Catrina.
35
Ficha 4.2
36
Ficha 4.2
• Uma que contém apenas a mais longa palavra no texto. Em caso de empate, use a primeira
palavra encontrada;
• Uma em que cada linha começa apenas a partir da primeira letra ‘e’;
• Uma em que o texto aparece escrito em camelCase , ou seja, sem espaços, e com a primeira
letra de cada palavra, excepto da primeira, maiúscula.
O programa deve ainda começar por escrever a primeira string criada, a branco, com um tipo de letra
aleatório, tamanho 24, e centrada numa janela 500 × 500, com fundo preto. A cada click do utilizador,
é mostrada a string seguinte, com as cores invertidas, produzindo um efeito semelhante ao da figura 4.9:
Depois de mostrar a última string, um novo click deve escolher um novo tipo de letra e voltar a
mostrar a primeira.
37
Ficha 4.2
4.2.7 Bolas
Adapte o programa do capítulo anterior (3.5, Bolas), de forma a que os atributos das bolas iniciais sejam
carregados a partir de um ficheiro de texto que, em cada linha, terá três números inteiros, separados por
vírgulas, um com o valor da coordenada x do centro, outro com a coordenada y, e um último com o
comprimento do diâmetro.
Por exemplo, para desenhar duas bolas, uma com centro em (100, 50) e diâmetro 25, e outra na
posição (170, 180) e diâmetro 30, o conteúdo do ficheiro deve ser o seguinte2 :
100,50,25
170,180,30
Para além disso, sempre que o utilizador pressionar uma tecla, o estado do ecrã (bolas e seus atributos)
deve ficar guardado no ficheiro original, de tal forma que, depois do programa terminar e voltar a ser
iniciado, ele volte ao estado em que estava quando foi guardado. Ao guardar o estado do ecrã, o programa
deve também escrever na consola, para cada bola, a mensagem “Guardar (x, y, d)...”, em que x, y
e d são os atributos de cada bola mostrada no ecrã.
Tudo isto deve ser feito com recurso à implementação de uma classe Bola, com os atributos necessário
e o método String toString().
Ao processar o ficheiro, a animação deve alterar a frameRate para 2. A partir daí, a cada frame,
devem ser desenhadas ora 10 bolas brancas, ora 6 quadrados brancos, com dimensões aleatórias. Linhas
começadas por # ou sem o sinal = devem ser ignoradas.
Siga o formato apresentado e acrescente ao ficheiro de texto outros parâmetros que possa considerar
na animação (por exemplo, cor das bolas e dos quadrados).
4.2.10 Wordle
Desenvolva um programa que carrega de um ficheiro uma lista de palavras de cinco letras e escolhe uma
aleatoriamente, sem informar o utilizador. A partir daí, o utilizador pode escrever no ecrã qualquer
sequência de cinco letras. Ao carregar no ENTER com as cinco letras inseridas, são desenhados cinco
2 Dica: para converter um array com elementos de outro tipo num array de inteiros pode usar int(array)
38
Ficha 4.2
quadrados em linha, cada um correspondente a uma letra, e com as seguintes cores: vermelho, se a letra
não está na palavra; amarelo, se letra está na palavra, mas noutra posição; verde, se letra está na palavra,
na mesma posição. Observe o exemplo da Figura 4.10.
Figura 4.10: Resultado após inserir a sequência BATER para a palavra escolhida tinha sido VELAR.
39
Capítulo 5
Vídeo
Recomenda-se que recorra à variável frameCount para determinar se passaram 5 segundos (documentação
disponível em https://processing.org/reference/frameCount.html).
40
Ficha 5.1
41
Ficha 5.1
Figura 5.3: Três frames ilustrando o cursor a deslocar-se da esquerda para a direita com a reprodução
do vídeo.
5.1.5 Slitscan
Escreva um programa que crie o efeito "slitscan"1 sobre um vídeo. Resumidamente, a técnica consiste
em extrair apenas a coluna central de cada frame do vídeo e desenhar essa coluna de pixels numa
posição da janela que varia entre 0 e a largura da janela. O diagrama da Figura 5.4 exemplifica o
funcionamento da técnica.
Coluna
central
Janela do Processing
1 https://en.wikipedia.org/wiki/Slit-scan_photography
42
Ficha 5.1
43
Ficha 5.2
5.2 Captura
5.2.1 Ponto mais brilhante
Escreva um programa que mostre na janela o vídeo da câmara e determine a posição do pixel mais
brilhante, desenhando nessa posição um círculo colorido semi-transparente.
Para obter o valor do brilho de um píxel pode recorrer à função brightness().
5.2.3 Espelho
Crie um programa que desenhe, de forma espelhada, a imagem da câmara. O programa deve desenhar do
lado esquerdo da janela metade da imagem da câmara; do lado direito deve desenhar a mesma metade,
mas de forma espelhada.
Clicando na janela, o programa deve alternar entre o espelhamento segundo a linha média vertical e
segundo a linha média horizontal. A Figura 5.6 mostra duas capturas de ecrã do programa proposto.
Figura 5.6: Capturas de ecrã do programa a desenvolver. Lado esquerdo: espelhamento segundo linha
média vertical; lado direito: espelhamento segundo linha média horizontal.
Use a lanterna do smartphone para interagir com o programa como exemplificado na Figura 5.7.
44
Ficha 5.2
contar o número de pixels que correspondem a movimento na imagem. Para tal, pode seguir os seguintes
passos:
1. Calcular a diferença entre frames consecutivas.
2. Binarizar a imagem correspondente à diferença entre frames.
3. Contar o número de pixels brancos (N ) na imagem binarizada.
Se N exceder um limite definido por si, o programa deve escrever no centro da janela a mensagem
“Movimento detetado”. A Figura 5.8 mostra duas capturas de ecrã exemplificativas.
45
Ficha 5.2
• cada pixel da imagem da câmara que tenha brilho superior a 75% do brilho máximo da imagem
deverá ser desenhado em cor amarela;
• cada pixel da imagem da câmara que tenha saturação superior a 75% da saturação máxima da
imagem deverá ser desenhado em cor azul;
• cada pixel da imagem da câmara que tenha simultaneamente brilho superior a 75% do brilho
máximo da imagem e saturação superior a 75% da saturação máxima da imagem, deverá ser
desenhado em cor vermelha;
Por exemplo, se a cãmara estiver a captar a imagem do lado esquerdo da Figura 5.9, deverá desenhar
o que está à sua direita.
Figura 5.9: Imagem captada pela câmara (esquerda) e imagem desenhada (direita).
Desenhe ainda sobre a imagem, em cor vermelha, os valores máximos da frame atual para o brilho e
para a saturação.
46
Capítulo 6
Herança
• O método desenha() desenha um retângulo centrado em (px, py), com largura e altura, e com
o texto no seu centro, a preto, com o tipo fonte e tamanho 14. Caso a variável pintar seja
verdadeira, o retângulo deve ser preenchido com a cor ; caso contrário, o interior deve ficar
transparente, ou por preencher.
• O método pinta() verifica se o rato está dentro dos limites do retângulo e, em caso afirmativo,
altera a variável booleana pintar, que indica se o retângulo deve ser preenchido ou não.
Botao
px : int
py : int
largura : int
altura : int
cor : color
texto : String
fonte : PFont
pintar : boolean
Botao(String t, String f)
Botao(String t, String f, int x, int y, int l, int h, color c)
desenha() : void
pinta() : void
b) Recupere o código do exemplo Ecrãs, nos slides sobre Herança, e crie um novo Ecrã (por exemplo,
EcraBotoes2), com um array de objetos Botao. Se quiser que o tipo de letra dos botões seja igual
ao do título dos ecrãs, pode obter o nome da uma fonte através de fonte.getName(). Experimente
o seu novo ecrã.
c) Crie uma nova classe que descende de Botao, mas que também tenha um som como atributo.
Reimplemente o método desenha() de forma a que, quando o rato passa por cima dos limites de
47
Ficha 6.3
um objeto desta classe, um som seja reproduzido. Altere o novo ecrã de forma a que alguns dos
seus botões tenham som.
6.2 Bateria
Tire partido dos conceitos relacionados com Herança para resolver o exercício 1.4, Bateria. O exercício
envolve o desenho de uma bateria, com várias peças, cada uma com um som associado. Sugere-se a
criação de uma classe Peca, para representar uma peça da bateria, que tenha associadas as coordenadas
do centro, a largura, um som, e um nome. Deve ainda ter métodos para desenhar, tocar, verificar se o
rato está dentro do limite da peça, e retornar uma representação em String (nome da peça). Para peças
não-circulares, crie uma classe PecaRetangular, derivada de Peca, mas que tem mais uma dimensão para
a altura. O diagrama da figura 6.2 ilustra o conteúdo das classes sugeridas.
Peca
centro : PVector
largura : int
som : SoundFile
nome : String
Peca(String nome, PVector centro, int largura, SoundFile som)
desenha() : void
dentro() : boolean
toca() : void
toString() : String
PecaRetangular extends Peca
altura : int
PecaRetangular(String nome, PVector centro, int largura, int altura, SoundFile som)
desenha() : void
dentro() : boolean
a) Experimente o seu código, identifique alterações necessárias para o bom funcionamento das peças
retangulares, e implemente essas alterações, tirando partido do polimorfismo.
b) A reorganização proposta permite simplificar o código para desenhar as peças e também o conteúdo
da função mousePressed. Realize essas simplificações e, para lidar com os dois tipos de classe, tire
partido do polimorfismo. Por exemplo, as peças deverão ser todas colocadas num array e desenhadas
da seguinte forma:
48
Ficha 6.3
mente, crie classes para alguns dos efeitos aplicados em exercícios anteriores, tais como: Pontilhismo,
Binarizar, ou alterações com base no Brilho e Saturação.
Para concluir, crie um programa com uma imagem e uma ArrayList de Efeito, que comece por
adicionar os objetos das classes Efeito à ArrayList e desenhar a imagem na tela. A partir daí, sempre
que carregar num dígito, deve aplicar à imagem desenhada o efeito no índice correspondente. Ou seja,
será possível aplicar sequências de efeitos. Um clique no rato deve voltar a desenhar a imagem original.
49
Capítulo 7
Simulação Física
7.1 Cinemática
7.1.1 Bola com vento
a) Aplique os conceitos que aprendeu acerca da utilização de objetos PVector e simulação de bolas
“elásticas” na criação de uma classe Bola que permita representar bolas deste tipo, com os seguintes
atributos:
– Raio;
– Posição;
– Velocidade;
– Aceleração.
Cada bola deve ainda ter os seguintes três métodos:
b) Use em seguida a classe Bola para simular uma bola elástica que se desloca num ambiente com
gravidade, mas sem atrito. Os limites da janela são os limites do ambiente de simulação: quando a
bola toca um dos lados da janela, há uma colisão elástica. Considere ainda que a bola está sujeita
à ação do vento, e que esta é controlada pela posição horizontal do rato na janela:
– Quando o rato está do lado esquerdo da janela, o vento sopra da esquerda para a direita, e
quando está do lado direito, sopara da direita para a esquerda;
– Não há vento quando o rato está centrado na horizontal;
– A intensidade do vento é proporcional à distância, na horizontal, a que o rato está do centro
da janela.
50
Ficha 7.2
7.1.2 Bolas
Recorra à classe Bola, que desenvolveu na pergunta anterior, para fazer uma simulação com 10 bolas,
inicializando cada uma da seguinte forma:
• Raio r entre 5 e 25;
• Posição aleatória (válida);
• Velocidade (1, 0);
• Aceleração (0, raio/100);
a) Crie uma classe Particula, de acordo com o diagrama da figura 7.1 para representar cada partícula.
Inicialmente, a vida deve ter um valor fixo, por exemplo, 255. A função atualiza() atualiza a
velocidade e a aceleração, sem permitir que a partícula passe do limite inferior da janela. Ao tocar
nesse limite, o som deve ser reproduzido, mas apenas uma vez e, enquanto estiver a tocar nele,
decremente 1 ao valor da vida. A função desenha() desenha, na posição atual, um círculo vermelho,
com transparência igual ao valor de vida, diâmetro igual ao valor da variável altura. Finalmente, a
função morreu() indica se a vida da partícula é 0 ou menos.
b) Escreva o código de um programa que abre uma janela 400×600 e, a cada click no rato, crie novas
partículas a partir da posição do ponteiro, todas com os seguintes parâmetros:
• Velocidade em x com um valor aleatório entre -1 e 1, e em y um valor aleatório entre -2 e 0;
• Aceleração em x igual a 0, e em y igual a 0,05;
• Cor vermelho, diâmetro 25, e um som curto à sua escolha.
c) Crie agora classes para representar dois tipos de partícula: bolas de borracha e blocos de cimento.
As bolas de borracha devem ter:
• Velocidade em x com um valor aleatório entre -1 e 1, e em y um valor aleatório entre -2 e 0;
• Aceleração em x igual a 0, e em y igual a 0,2;
• Cor azul, diâmetro 15, e um som curto, à sua escolha1 .
Para além disso, sempre que uma bola de borracha bate no limite inferior da janela, ela deve saltar,
e a sua aceleração deve ser multiplicada por 1,5. Os blocos de cimento devem:
1 Para uma classe carregar um som, ela precisa de saber qual é o ficheiro principal do seu programa. Esse ficheiro é
do tipo PApplet e pode ser passado através da palavra this, no próprio ficheiro. Ou seja, para um objeto receber uma
referência para o programa principal, ela deve ter um parâmetro do tipo PApplet, que pode depois ser utilizado na criação
de um SoundFile.
51
Ficha 7.2
Particula
posicao : PVector
velocidade : PVector
aceleracao : PVector
vida : int
altura : int
cor : color
som : SoundFile
Particula(PVector pos, PVector vel, PVector acel, color c, int h, SoundFile s)
atualiza() : void
desenha() : void
morreu() : boolean
7.2.2 Chuva
Desenvolva uma simulação de chuva. Comece por desenvolver uma classe Pingo, que deve ter os seguintes
atributos e métodos:
• Comprimento c;
• Posição;
• Velocidade;
• Aceleração;
• desenha(), para desenhar um pingo (linha azul);
• move(), para a atualizar a sua posição;
• boolean fim(), para informar se o pingo chegou ao fundo da janela.
A simulação deve criar instâncias da classe Pingo, adicioná-las a uma estrutura de dados adequada,
e animá-las. Ainda que seja interessante introduzir alguma aleatoriedade, defina valores coerentes com
os atributos de um pingo, que, entre outros, se deve mover de cima para baixo.
A sua simulação deve ainda permitir a alteração dos seguintes parâmetros:
• frequência: número de pingos criados em cada frame, que pode ser controlado através das teclas
do teclado;
• aceleração dos pingos: controlada pela posição do ponteiro do rato.
Quando um pingo chega ao fundo da janela, ele deve ser removido da estrutura de pingos. A Figura 7.3
exemplifica os possíveis resultados.
52
Ficha 7.2
Figura 7.2: Programa no momento em que um bloco é lançado, depois de terem já sido lançadas duas
bolas e dois blocos.
53