|
|||||||
|
|
|
|||||
|
|
|||||||
Se implementó una clase qe simulara el comportamiento espacial de un proyectil lanzado en un espacio de tres dimensiones.
El proyectil puede simular desde lanzamientos con aceleración constante en sus tres ejes (X,Y,Z), hasta movimientos rectilineos de velocidad constante.
Por ejemplo , se hizo un programa de prueba con las siguientes condiciones
iniciales :
vector aceleración : { 0.0 , 0.0 , -9.8 }
vector velocidad
inicial : { 30.0 , 5.0 , 130.0 }
vector posición inicial : { 2.0 , 1.0 , 0.0
}
Por lo tanto se trata de un lanzamiento desde el punto (2.0 , 1.0 , 0.0) del
plano tridimensional , teniendo las características de un lanzamiento con un
cierto ángulo con respecto al eje Z.
Es por eso que en el vector aceleración
inicial , la componente z simula la constante de gravedad.
Teniendo las condiciones iniciales de aceleración, velocidad y posición , la
clase se encarga internamente de obtener los polinomios correspondientes en
función del tiempo.
Salida del programa de prueba
Atributos y Métodos de la clase proyectil
Constructor
Inicializa internamente las variables de tipo VectorEspacial (aceleración, velocidad, posición).
public Proyectil( )
Atributos
Cuenta con una constante G que representa la constantede gravedad (9.8) y tres vectores que manejan la aceleración, velocidad y posición del proyectil.
public final static double G = 9.8; public VectorEspacial aceleracion; public VectorEspacial velocidad; public VectorEspacial posicion;
Métodos
Los siguientes métodos permiten formar los polinomios internos de cada vector según las condiciones iniciales que se le pasen.
public void asignarAceleraciones(double acel[ ]) public void calcularVectores(double vel_ini[ ] , double pos_ini[ ])
Ej : Proyectil lanzado en caída libre desde un bombardero
a 800 mts de altura con una velocidad en el eje X de 120 m/s.
Proyectil p = new Proyectil( );
/* condiciones iniciales */
double acel_ini[ ] = { 0.0 , 0.0 , -9.8 };
double vel_ini[ ] = { 120.0 , 0.0 , 0.0 };
double pos_ini[ ] = { 0.0 , 0.0 , 800.0 };
p.asignarAceleraciones(acel_ini);
p.calcularVectores(vel_ini , pos_ini);
Por último, se tienen dos métodos que evalúan los polinomios internos del vector velocidad y posición, retornando la referencia del arreglo que contiene los valores de la evaluación.
public double [ ]obtenerVelocidad(double t) public double [ ]obtenerPosicion(double t)
Ej : Se quiere saber la posición y la velocidad del proyectil pasado los 10
segundos de haberse lanzado desde el bombardero.
double vel[ ] = p.obtenerVelocidad(10.0);
double pos[ ] = p.obtenerPosicion(10.0);
System.out.println(" Velocidad eje Z : " + vel[ p.velocidad.Z ]);
System.out.println(" Px : " + pos[ p.posicion.X ]);
System.out.println(" Pz : " + pos[ p.posicion.Z ]);
Implementación de la clase proyectil
class Proyectil
{
public final static double G = 9.8;
public VectorEspacial aceleracion;
public VectorEspacial velocidad;
public VectorEspacial posicion;
public Proyectil( )
{
aceleracion = new VectorEspacial( );
velocidad = new VectorEspacial( );
posicion = new VectorEspacial( );
}
public void asignarAceleraciones(double acel[ ])
{
double coef[ ] = new double[1];
for(int i = 0; i < VectorEspacial.DIMENSIONES; i++)
{
coef[0] = acel[i];
aceleracion.asignarPolinomio(coef,i);
}
}
public void calcularVectores(double vel_ini[ ],double pos_ini[ ])
{
velocidad = VectorEspacial.integrar(aceleracion,vel_ini);
posicion = VectorEspacial.integrar(velocidad,pos_ini);
}
public double [ ]obtenerVelocidad(double t)
{
velocidad.evaluar(t);
return velocidad.obtenerEvaluacion( );
}
public double [ ]obtenerPosicion(double t)
{
posicion.evaluar(t);
return posicion.obtenerEvaluacion( );
}
}
Bajar archivo
Programa de prueba
Consiste en determinar el tiempo total que un proyectil está en el "aire" , mostrando una tabla de contenga 14 mediciones de tiempo, posición y velocidad.
class prbProyectil
{
/* Redondea o más bien limita a un número decimal a tener
un decimal. */
public static double redondear(double num)
{
double aux = num * 10;
int tmp = (int) aux;
return (double) tmp / 10;
}
/* Dado un proyectil, calcula con los métodos disponibles
del objeto , el tiempo total de recorrido. */
public static double t_recorrido(Proyectil p)
{
p.velocidad.evaluar(0.0);
double vel[ ] = p.velocidad.obtenerEvaluacion();
return 2 * vel[p.velocidad.Z] / p.G;
}
public static void main(String arg[ ])
{
Proyectil p = new Proyectil( );
double arr_acel[ ] = { 0.0 , 0.0 , -9.8 };
p.asignarAceleraciones(arr_acel);
double vel_ini[ ] = { 30.0 , 5.0 , 130.0 };
double pos_ini[ ] = { 2.0 , 1.0 , 0.0 };
p.calcularVectores(vel_ini , pos_ini);
System.out.println("\n\ttiempo\t\tPosicion\t\t\tVelocidad");
System.out.println("\t------\t\t--------\t\t\t---------\n");
System.out.println("\tt\t\tPx\tPy\tPz\t\tvz\tV\tdif\n");
double t_total = t_recorrido(p);
double interv = t_total / 14;
double t = 0.0;
while(t <= t_total)
{
double pos[ ], vel[ ];
vel = p.obtenerVelocidad(t);
pos = p.obtenerPosicion(t);
System.out.print("\t" + redondear(t) + "\t");
for(int k = 0; k < 3; k++)
System.out.print("\t"+ redondear(pos[k]));
System.out.print("\t\t" + redondear(vel[2]));
double aux_norma = redondear(p.velocidad.norma( ));
double aux_vz = redondear(vel[2]);
double dif = Math.abs(aux_norma) - Math.abs(aux_vz);
dif = Math.abs(dif);
dif = redondear(dif);
System.out.print("\t" + aux_norma);
System.out.println("\t"+ dif );
t += interv;
}
System.out.println( );
}
}
Bajar archivo