domingo, 15 de setembro de 2019

Tarefa 6 - Ao infinito e além do Yin Yang

"crie uma função recursiva que crie o efeito do yin yang infinito, dando atenção ao controle do limite, e discuta a implementação de um zoom para seu programa"

obs: Pedi para o professor Melo para que pudesse publicar minha tarefa do yin yang no lugar da tarefa de fibonacci, pois ela já estava quase completa no dia em que foi postada na pasta do drive.

Yin Yang, equilíbrio não apenas na imagem, mas na forma e na proporção. E uma das mais comuns tatuagens hoje em dia.

Para chegar ao resultado desejado, foi necessário um estudo do uso de funções recursivas, que ainda não havia sido estudada em Programação II. Mas a lógica do Yin Yang infinito independe do nosso conhecimento de programação. Vamos a ela.

O que há de comum na estrutura deste desenho aparentemente confuso? Apenas uma mente em pleno equilíbrio pode responder.

Temos acima um círculo que dentro de si contém dois círculos. Cada um desses círculos menores conterá outros dois círculos dentro de cada um deles. E cada um desses círculos menores ainda possuirão outros dois círculos em seu interior. É logo perceptível a presença de uma progressão definida na geração de nossa imagem:
1 -> 2 -> 4 -> 8 -> 16 -> infinito...
É possível então escolhermos a quantidade de círculos que desejamos desenhados na tela, em uma função que dentro dela: desenhará um círculo e em seguida chamará a si mesma para desenhar outros dois círculos menores em posições relativas ao seu centro atual.

A produção dos símbolos é um tanto quanto complexa, é necessário levar em consideração a variação de cor entre preto e branco e se o novo círculo ficará em cima ou em baixo. Talvez no futuro quando tiver estudado mais programação eu consiga "limpar" esse código e torná-lo mais curto.

O parâmetro control é importantíssimo para controlarmos a parada da produção de nossos círculos. Sem ele nossa função se tornará infinita e o processing entrará em pane. Introduzimos na chamada da função a quantidade de camadas que desejamos que nosso yin yang tenha pelo control.

Para gerar um efeito de zoom, foi necessário apenas aumentar geometricamente o valor do diâmetro. É importante frisar a importância desse aumento ser geométrico, pois se for feito por progressão aritmética, a velocidade do zoom diminuirá a cada segundo, pois o aumento não será proporcional a redução de tamanho que os círculos seguem, pois eles seguem uma P.G. de razão fracionária.

Um aumento de apenas 1% parece pouca coisa, mas é importante lembrar que o processing roda a 60 FPS, então esse aumento seria superior a 60% por segundo (aproximadamente 80%).

Essa talvez tenha sido a tarefa mais divertida até agora, o uso de recursividade pode ser um tanto desafiador e estressante, mas os resultados aplicados a computação gráfica são belíssimos.

Código em Processing: Tarefa 6.

Tarefa 5 - Ouviram do Ipiranga ás aulas práticas

"discutir o emprego das instruções quad, beginShape e endShape,
rectMode e ellipseMode do Processing na construção da
bandeira do Brasil, considerando a Lei Federal No 5.700"

Olhando assim nem parece que utiliza décimos de módulo para ser desenhada. Nessa tarefa, vamos focar no quadrado, no losango e no círculo da bandeira, como pedido.

Analisando a referência do processing sobre as funções rectMode() e ellipseMode() é possível perceber uma similaridade entre as duas, são ambas usadas para redefinir o modo como os parâmetros das funções rect() e ellipse() devem ser interpretados.

Para esse trabalho, decidi utilizar o rectMode(CENTER), que faz com que o ponto (x,y) inicial do quadrado seja calculado a partir do centro dele. O ponto x e o ponto y estarão, respectivamente, no x central menos metade da largura e no y central menos metade da altura, como mostra na figura abaixo.

Para o círculo, utilizei o ellipseMode(RADIUS), que modifica os parâmetros de altura e largura da ellipse para meia largura e meia altura, como se mudasse de diâmetro para raio. Fiz isso para adaptar a lei 5700, que apresenta as proporções do círculo pelo raio.

Como dito acima, a lei indica que o círculo azul terá raio de três módulos e meio, então achei importante alterar o modo como a função funciona.


Para a produção do losango, há duas opções. Uma utilizando a função quad() e outra utilizando as funções beginShape(), endShape e vertex(). Ambas as opções precisarão das mesmas coisas, a posição de cada vértice do losango na tela. Porém, há uma diferença importante entre as duas.

Enquanto o quad() recebe como parâmetros os quatro pontos do losango e fecha a figura, beginShape()/endShape() precisaria de cinco pontos para formar uma figura fechada. Esse quinto ponto seria o próprio ponto inicial da figura, que servirá também como ponto final e de fechamento. Essa segunda forma de desenhar o losango possui uma imensa liberdade de uso e com ela podemos desenhar formas bastante peculiares, mas que não vem ao caso de nossa tarefa. Fechar a figura será apenas necessário quando formos fazer uso de contornos.

Nossa bandeira é mais complexa de se produzir e calcular do que as bandeiras do Japão e da Suíça, e talvez por isso para muitos ela seja um símbolo de beleza tão profunda.

Após isso é apenas uma questão de codificar, tendo sempre o modelo acima como referência na hora de criar nossas funções.

Código em Processing: Tarefa 5.


quinta-feira, 12 de setembro de 2019

Tarefa 4 - Um arremesso e tanto

"adicionar a visualização, diretamente na janela do simulador
de lançamento balístico, de todos os valores das variáveis
envolvidas, incluindo as velocidades instantâneas horizontal e vertical, discutindo como as mesmas foram obtidas"

Worms, jogo com alguns dos mais incríveis feitos balísticos da humanidade, também nos mostram o potencial auto-destrutivo de qualquer pequena falha em um cálculo.
Adicionar uma visualização das variáveis a janela foi uma tarefa simples, precisei apenas utilizar um retângulo como fundo para que as linhas não atrapalhassem a leitura e garantir que o tamanho da variável escrita não ultrapasse uma casa decimal.

Aqui nossa bolinha está com aceleração tanto horizontal quanto vertical. Ela inicia com velocidade horizontal positiva e vertical negativa, mas aos poucos esses sentidos irão inverter, devido a aceleração. Por fim, a bolinha sumiria a esquerda.

A velocidade atual é algo fácil de se obter. Segundo a clássica fórmula física v = v0 + a.t, teremos que a velocidade atual é calculada em função da velocidade inicial, da aceleração e do tempo. Temos essas três variáveis em nosso programa, então:
É necessário calcular a aceleração de cada direção separadamente, pois não estamos trabalhando com velocidade vetorial e bidimensional, mas com uma composição desta unidimensionalmente.

Assim, temos nossa visualização de variáveis e nossas velocidades atuais!
Código em Processing: Tarefa 4