martes, 5 de marzo de 2013

Animación de bolas de billar

Hola,
esta mañana me habéis pedido que os dejara el programa que hemos hecho en el que un círculo rebotaba contra la parte superior y la inferior de la pantalla. Os pongo aquí el esqueleto del programa principal ya que las clases Círculo y Vector ya las debéis tener hechas vosotros.

public static void main(String[] args) {
    // Crear circulo
    Circulo bola = Circulo.nuevo(100, 100, 50.0);
    // Crear vector
    Vector velocidad = new Vector(0,1);
    // Crear Pantalla
    Pantalla p = new Pantalla(500,500);
    while (true) {
      // Dibujar el circulo pidiéndoselo al objeto de tipo pantalla
      bola.dibujate(p);
      // Mover el circulo pidiéndoselo al objeto de tipo Circulo y usando como parámetro el objeto de tipo vector
      bola.mueve(velocidad);
      // Comprobar si el círculo choca con la parte superior o inferior e invertir el sentido del vector velocidad
      if (bola.getY() >= 450 || bola.getY() <= 50) {
        velocidad.setY(-1*velocidad.getY());
        // A mi me gusta más así: velocidad = velocidad.inverso();
        bola.mueve(velocidad);
      }

      // Esperar un poco (10 milisegundos) para que de tiempo a verlo
      p.espera(10);
      // Borrar la pantalla
      p.limpia();
    }
  }

Como se puede ver es muy sencillo hacer que la bola rebote arriba y abajo. También sería sencillo hacer que rebotara sólo horizontalmente si la velocidad inicial fuera, por ejemplo, (1,0).

Pero si la velocidad inicial no fuera horizontal ni vertical sino un valor intermedio, conseguir que la bola rebote de forma natural independientemente del ángulo de incidencia necesitamos calcular el vector reflejado en relación al vector normal al plano contra el que el círculo choque. Ojo, el vector n debe ser unitario.

Aquí os dejo una ilustración con lo necesario para calcular ese vector reflejado y os animo a que ampliéis el programa para que rebote por todos lados.

También os animo a que añadáis más bolas usando un array para manejarlas. Recordad en este caso que las pruebas de las colisiones hay que hacerlas para todas ellas y que necesitaréis un vector velocidad para cada bola por lo que, quizás, sea interesante hacer que la velocidad sea un miembro de la clase Circulo.

saludos

No hay comentarios:

Publicar un comentario