Implementando animaciones en C++ mediante ROOT

Objetivo: Simular un choque frontal perfectamente elástico con el fin de mostrar el uso de la clase TTimer para lograr la visualización de figuras en movimiento.

Interfaz gráfica de usuario para la simulación de un choque frontal perfectamente elástico

El código utilizado para realizar la simulación es el siguiente:


// Update: 2013-09-12 10:11:09-0500
// Archivo: choques.C
// Para mayor información:
// http://www.k-lab.tk/content/physics/root/gui.php
// Ejecutar con:
// $root -l choques.C


float m1,m2; //Masas
float v1i,v2i; //Iniciales
float v1f,v2f; //Finales
float v1,v2; //En un instante dado
float x1,x2; //posiciones
float t,dt; //tiempo
TEllipse *Cuerpo1,*Cuerpo2; //Representación del cuerpo
TCanvas *Lienzo; //Espacio de visualización

void Reubicar(){

  //Condición de Choque
  if ((x1+Cuerpo1->GetR1())>(x2-Cuerpo2->GetR1())){
    v1 = v1f;
    v2 = v2f;
  }
  
  t = t + dt; //Avanzamos en el tiempo t+=dt
  x1 = x1 + v1*t; //Calculamos la nueva posición del cuerpo 1 x1+=v1*t
  Cuerpo1->SetX1(x1); //Cambiamos la posición de la representación del cuerpo
  Cuerpo1->Draw(); //Ejecutamos Draw() para actualizar la posición del cuerpo en el "Espacio de visualización"

  x2 = x2 + v2*t; //Calculamos la nueva posición del cuerpo 2 x2+=v1*t
  Cuerpo2->SetX1(x2); //Cambiamos la posición de la representación del cuerpo
  Cuerpo2->Draw(); //Ejecutamos Draw() para actualizar la posición del cuerpo en el "Espacio de visualización"

  Lienzo->Update(); //Actualizamos el Lienzo == "Espació de visualización"
  
}

void choques(){

  //Pasos del taller:
  //Declaración de variables
  //Asignación de valores
  //Crear Lienzo
  //Crear Cuerpo1
  //Escribir Reubicar()  
  //Crear Cuerpo2
  //Establecer el condicional

  //---------------------------------------------
  //Condiciones del choque
  t = 0.0;
  dt = 1e-3;

  m1 = 1.0;
  m2 = 1.5;
 
  v1i = 2.5;
  v2i = -5.0;
  
  v1 = v1i;
  v2 = v2i;
  
  //x1 siempre tiene que estar antes de x2 según nuestra condición de choque (ver Reubicar())
  x1 = -10;
  x2 = 10;
  //---------------------------------------------

  //Calcular a partir de los datos asignados las "velocidades" finales
  v1f=(v1i*(m1-m2)+2*m2*v2i)/(m1+m2);
  v2f=(v2i*(m2-m1)+2*m1*v1i)/(m1+m2);
  
  //Crear y configurar el "Espacio de visualización
  Lienzo = new TCanvas(); 
  Lienzo->SetWindowSize(600,600); //Tamaño en píxeles
  Lienzo->Range(-12.0,-12.0,12.0,12.0); //Ajustar el sistema coordenado
  
  //Crear y configurar la representación del cuerpo 1
  Cuerpo1 = new TEllipse();
  Cuerpo1->SetFillColor(2); //Color de relleno
  Cuerpo1->SetR1(m1); //El radio es proporcional a la masa 
  Cuerpo1->SetR2(Cuerpo1->GetR1()); // r1==r2 para que sea un círculo
  Cuerpo1->SetX1(x1); //Posición inicial
  Cuerpo1->SetY1(0.0); //Posición inicial
  Cuerpo1->Draw(); //Mostrar en el lienzo

  //Crear y configurar la representación del cuerpo 2
  Cuerpo2 = new TEllipse();
  Cuerpo2->SetFillColor(4);
  Cuerpo2->SetR1(m2);
  Cuerpo2->SetR2(Cuerpo2->GetR1());
  Cuerpo2->SetX1(x2);
  Cuerpo2->SetY1(0.0);
  Cuerpo2->Draw();

  //TTimer se encarga de ejecutar la función comando cada n (n=20) ms
  Animador = new TTimer(20);
  Animador->SetCommand("Reubicar()"); //Se asigna la función comando
  Animador->TurnOn(); //Se activa la instancia
}

La extensión con una interfaz gráfica del prototipo realizado (que se muestra en la imagen al incio de la página) se puede descargar aquí. No olvide visitar Introducción al desarrollo de interfaces gráficas de usuario en ROOT para mayor información.

Comentarios

Agregue usted un comentario,

Nombre:

Dirección de correo electrónico:

URL:

Mensaje:



* La dirección de correo electrónico no será publicada.




This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 Colombia License.


I'm committed to the privacy of k-lab users. Each time you access content delivered by http://www.k-lab.tk/, information like referrer, anonymized IP (255.255.X.X), date, time and requested resources are sent to a Google Analytics. This is done in order to know user preferences to adapt our content for users needs and to detect failures in the website. However, respecting your decision we don't store any of this information if you have enabled Do Not Track option in your web browser (Preferences/Privacy/Tracking/Tell Websites I do not want to be tracked). Protect your privacy.