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.
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.
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.