//Inicializando variables locales
int i=0;
char ord[20];
//Obteniendo m xima resolución posible
xmax=getmaxx();
ymax=getmaxy();
//Creando ejes de coodernadas
line(20,0,20,ymax-20);//ejes de las x
line(20,ymax-20,xmax,ymax-20); //ejes de las y
for (i=1;i<=20;i++) //numerando ejes cartesianos
{
sprintf(ord,"%d",i*3);
outtextxy((i*30)+20,ymax-20,ord); //ejes x
outtextxy(5,ymax-(i*30)-20,ord); //ejes y
outtextxy(xmax-100,30,"Escala 1:10");
};
}
void ejes::cuadricula()
{
int i=0,j=0;
for (i=1;i<=34;i++)
{
line(20,(ymax-20)-(i*10),xmax,(ymax-20)-(i*10)); //filas
};
for (j=1;j<=65;j++)
{
line(20+(j*10),ymax-20,20+(j*10),120); //columnas
};
}
class parabola
{
public:void graftiro(float ang,float vel);
};
void parabola::graftiro(float ang, float vel) //ángulo y velocidad
{
//Inicializando variables para el cálculo
const g=9.8; //gravedad terrestre
double x=0,y=0,t=0,stop=1;
char ord[20];
for (t=1;stop!=0; t++)
{
//formulas para el movimiento vertical y horizontal
//en funcián del tiempo respectivamente
y=(vel*sin(ang*M_PI/180)*t/30)-(g*0.5*pow(t/30,2));
//g es la aceleración de la gravedad
x=(vel*cos(ang*M_PI/180)*t/30);
moveto(((x+20)),(ymax-20-y));
putpixel(getx(), gety(), getmaxcolor());
if (t<1000) //esto no puede durar mas de 10 segundos
{ //control de pausa por si la cosa se alarga
delay(10);
};
if (gety()>=ymax-20)
{
stop=0;
outtextxy(xmax-280,40,"Sumario");
sprintf(ord,"Tiempo %f segundos",t/30);
outtextxy(xmax-280,60,ord);
sprintf(ord,"Distancia %f metros",vel*cos(ang*M_PI/180)*t/30);
outtextxy(xmax-280,80,ord);
sprintf(ord,"Altura máxima %f metros",pow(vel*sin(ang*M_PI/180),2)/(2*g));
outtextxy(xmax-280,100,ord);
};
};
}
void main()
{
video objvideo; //instanciando objetos
ejes objejes;
parabola grafica;
objvideo.inicializar();
cout<<" Simulaci¢n de tiro parab¢lico"<<"n";
cout<<" Desarrollado por Luis Alberto De Jesús"<<"n";
cout<<" 19/11/07"<<"n";
cout<<" Digite una opción para continuar";
char inf,inf1;
gotoxy(2,6);
cout<<"Cuadricular s/n ?"; //por si queremos cuadricular
inf1=getche();
double a,v;
inicio: //etiqueta de referencia
objejes.dibujar();
if ((inf1=='s')||(inf1=='S')) // si se eligio s cuadriculamos
{
objejes.cuadricula();
}
outtextxy(30,20,"Digite el ngulo de tiro: ");
gotoxy(30,2);cin>>a;
if ((a<0)||(a>90)) //control del angulo de tiro
{
cout.width(20);
cout<<"Entrada inv lida";
getche();
goto inicio; //si es menor que 0 o mayor de 90 ir a inicio
}
outtextxy(30,35,"Digite la velocidad de tiro en m/seg: ");
gotoxy(42,3);cin>>v;
grafica.graftiro(a,v);//grados y velocidad
outtextxy(30,50,"Desea terminar la simulación s/n? ");
gotoxy(40,4);
inf=getche();
if ((inf=='s')||(inf=='S')) //por si queremos repetir la simulación o terminar
{
goto fin;
}
else
{
goto inicio;
}
fin: //etiqueta de referencia
objvideo.finalizar(); //liberando la memoria
}
Veamos ahora el aspecto en pantalla
Presionamos s para ver la simulación en cuadrícula. Cualquier tecla por si no.
Digitamos un ángulo, por ejemplo 56
Pulsamos intro y digitamos una velocidad inicial, 65 por ejemplo y pulsamos intro.
Si digitamos s salimos del simulador y si presionamos cualquier tecla realizamos otra simulación.
Hasta otra próxima monografía.
Luís Alberto De Jesús
Santo Domingo República Dominicana.
23/11/2007
Autor:
dataunix[arroba]hotmail.com
Programa que simula el lanzamiento de un proyectil dado su ángulo
y velocidad inicial tomando como base las fórmulas referentes al tiro parabólico
*/
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream.h>
#include <dos.h>
#include <string.h>
double xmax=0, ymax=0;
//variables globales, obtienen resolución máxima
class video
{
public: void inicializar();
public: void finalizar();
};
void video::inicializar()
{
//solicitando autodetección del driver de gráficos
int gdriver = DETECT, gmode, errorcode;
//Inicializando driver de gr ficos y variables locales
initgraph(&gdriver, &gmode, "c:/tc/bgi");
//no olvidar especificar ruta de las librerias de gráficos
//verificando errores
errorcode = graphresult();
if (errorcode != grOk) //ocurri¢ un error?
{
grapherrormsg(errorcode);
cout<<"Error de video: "<<errorcode;
cout<<"Presionar cualquier tecla: ";
getch();
exit(1); //Termina si hay un error
};
}
void video::finalizar()
{
closegraph(); //proceso de limpieza
}
class ejes
{
public: void dibujar();
public: void cuadricula();
};
void ejes::dibujar()
{
cleardevice();//limpia la pantalla
setcolor(EGA_YELLOW);
setbkcolor(EGA_BLUE);
Página anterior | Volver al principio del trabajo | Página siguiente |