Reutilizando as funções MRU e MRUV - e diferenciando claramente as variáveis necessárias - crie uma aplicação que simula lançamentos balísticos (logicamente o tempo é o mesmo para ambos os movimentos simulados)
Bom começamos utilizando as funções de MRU e MRUV. Uma para movimento horizontal e outra vertical, respectivamente.
float MRUV(float vv, float av, float t){
float d;
t=tAtual;
d=vv*t+av*t*t/2;
dAtualver=d;
return (dAtualver);
}
float MRU(float vh, float t){
float d;
t=tempaux;
d = vh*t;
dAtualhor=d;
return (dAtualhor);
}
As duas funções retornam o cálculo da distância, uma com apenas velocidade e tempo, e a outra com acréscimo da aceleração! Esses dois movimentos ao mesmo tempo causam o lançamento balístico.
Transformando em 60fps: Mudando o frameRate para 60 e incrementar o tempo em +1.0/60.0!!
DESAFIO:
Simule o quicar de uma bola lançada para a frente e para cima!
Para fazer a bola quicar foi a parte mais complicada para mim. Bom, acrescentei uma condição para sempre que o eixoY for maior que o tamanho da tela, sua nova posição ser o limite da tela menos o raio. Para o movimento repetir é preciso zerar o tempo e para completar a sensação de quicar a variável velver (velocidade vertical) será diminuída até tender a zero! Criei outra variável com mesmo valor de tempo porém ela não é zerada e é usada na função do movimento horizontal para fazer com que ele continue normalmente na horizontal e apenas vá reiniciando o movimento na vertical, quando quica.
Código completo:
float tAtual = 0;
float dAtualhor;
float dAtualver;
float raio=5;
float velver=70;
float velhor=15;
float eixoX;
float eixoY;
float tempaux=tAtual;
void setup(){
frameRate (60);
size(600,600);
background(255);
}
void draw(){
eixoY=600-dAtualver;
eixoX=dAtualhor;
background(255);
mostraMundo();
textSize(25);
text("Distância vertical: "+dAtualver, 10, 30);
text("Distância horizontal: "+dAtualhor, 10, 60);
text("Tempo: "+tempaux, 10, 90);
println("Distância percorrida na vertical:");
println(MRUV(velver,-9.8,0),"metros");
println("Distância percorrida na horizontal:");
println(MRU(velhor,9.8),"metros");
println("Tempo decorrido:");
println(tAtual,"segundos");
fill (200,2,100);
ellipse(eixoX,eixoY,raio*2,raio*2);
tAtual+=1.0/60.0;
tempaux+=1.0/60.0;
if ((eixoY)>600)
{
eixoY=600-raio;
tAtual=0;
velver=velver/1.5;
}
}
float MRUV(float vv, float av, float t){
float d;
t=tAtual;
d=vv*t+av*t*t/2;
dAtualver=d;
return (dAtualver);
}
float MRU(float vh, float t){
float d;
t=tempaux;
d = vh*t;
dAtualhor=d;
return (dAtualhor);
}
void mostraMundo(){
for (int i=0 ; i<12 ; i++) {
line(i*50,0,i*50,600);
line(0,i*50,600,i*50);
}
}
A parte do texto é simples usando a ferramenta text, lembra bastante o já conhecido println, porém você também controla o tamanho da fonte e a posição do eixo x e y que o texto se posicionará.
Acima o gif do resultado!