Nesta tarefa, devemos realizar o seguinte desafio: empregando as funções MRU e MRUV, explicar o
desenvolvimento de uma aplicação que simula o
quicar de uma bola lançada para cima e para frente,
e cuja velocidade vertical diminui (numa proporção
à sua escolha) sempre que o chão é tocado.
|
Tela do programa. |
Para fazer o círculo quicar foi necessário criar variáveis separadas para o eixo X e Y e trabalhar com cada uma separadamente. Escopo inicial:
float tAtualX = 0;
float tAtualY = 0;
float vAtualX = 15;
float vAtualY = 50;
float aAtual = -10;
float dAtualX;
float dAtualY;
float x = 0;
int raio;
O
MRU foi usado para calcular a posição no eixo
x e o
MRUV no eixo
y:
float mru(float v, float t) {
float d;
d = v * t;
return d;
}
float mruv(float v, float a, float t) {
float d;
d = v*t+a*t*t/2.0;
return d;
}
Para desenhar o círculo no
draw(), eu criei uma função chamada
desenha(), onde todas as funções principais são usadas, e o desenho impresso na tela:
void desenha(){
x = mru(vAtualX, tAtualX);
dAtualY = mruv(vAtualY, aAtual, tAtualY);
ellipse(5 + x, height-dAtualY, raio, raio);
if(dAtualY < 0) {
tAtualY = 0;
dAtualY = 0;
vAtualY = vAtualY-2.5;
if(vAtualY<0) {
vAtualY = 0;
}
}
tAtualY = tAtualY + (1/20.0);
tAtualX = tAtualX + (1/20.0); // A contagem do tempo é baseado em segundos.
println("y: " + dAtualY);
}
Vamos por etapas. A posição do eixo X não muda ao quicar, ou seja, ela é sempre progressiva. Para calcular esta posição, utilizei a função
mru() que usa o valor de velocidade como
vAtualX (15),
tAtualX como tempo, inicializado em 0, mas aumentando gradativamente conforme mostrado nesta função. Vale frisar que o tempo de Y e X foi aumentado em um valor fracionado, não em 60 segundos, mas em 20, para acelerar o tempo durante os testes.
Como o objetivo é fazer a bola quicar, o eixo Y foi bastante trabalhado. Para definir a distância foi usada a função
mruv() que recebe os parâmetros de velocidade como
vAtualY, aceleração como
aAtual e tempo como
tAtualY. Para saber se a bola acertou o chão foi criado um
if verificando se o valor de
dAtualY (distância atual no eixo y) foi menor que 0. Se sim, ele tem seu tempo e distância reiniciadas, e velocidade diminuída de acordo com o quicar da bola. Além disso, caso a velocidade ficasse negativa (abaixo de 0) ela também é reiniciada, tornando possível uma continuação do quicar da bola.
A interface de verificação foi feita através de uma função chamada
layout():
void layout() {
fill(29, 81, 126);
stroke(29, 81, 126);
rect (0,0, width, 50);
fill(44, 123, 181);
stroke(44, 123, 181);
rect (0, 50, width, 1);
fill(255);
text ("Segundo: " + tAtualX, 15, 30);
text ("Altura: " + dAtualY, 215, 30);
}
|
Programa em funcionamento |
Acessar arquivo: MRUV
Comentários
Postar um comentário