14 - Imagens

05 - MRUV: Movimento balístico

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



Anúncio

Comentários