class ObjetoCeleste;
//Clase contenedora de Objetos Celestes. Utiliza memoria estática
//por lo que como máximo almacenará hasta 100
class ListaObjetos
{
ObjetoCeleste *lista[100];
int num;
public:
ListaObjetos(){num=0;}
ObjetoCeleste * operator[](int i)
{
if((i<num)&&(i>-1))return lista[i];
else return NULL;
}
bool AgregarObjeto(ObjetoCeleste *obj)
{
if(num<100){lista[num++]=obj;return true;}
else return false;
}
void Itera();
void Pinta();
int GetNum(){return num;}
};
class ObjetoCeleste
{
protected:
double posicion[3];
double velocidad[3];
int tipo;
public:
ObjetoCeleste(double x, double y, double z,double vx,double vy,double vz)
{
posicion[0]=x;posicion[1]=y;posicion[2]=z;
velocidad[0]=vx;velocidad[1]=vy;velocidad[2]=vz;
}
virtual void Pintar(){}
virtual void Itera(ListaObjetos &lista)
{
for(int i=0;i<3;i++)posicion[i]+=velocidad[i];
}
double operator -(ObjetoCeleste &obj)
{
double dist=0;
for(int i=0;i<3;i++)
dist+=((posicion[i]-obj.posicion[i])*(posicion[i]-obj.posicion[i]));
return sqrt(dist);
}
void PrePintado()
{
glPushMatrix();
glTranslated(posicion[0],posicion[1],posicion[2]);
}
void PostPintado(){glPopMatrix();}
};
class Planeta:public ObjetoCeleste
{
protected:
double Masa;
double Radio;
float Color[3];
public:
Planeta(double rad,double mas,
double x, double vx, double y=0,double vy=0,double z=0,double vz=0)
:ObjetoCeleste(x,y,z,vx,vy,vz),Masa(mas),Radio(rad){}
void SetColor(float r,float g,float b){Color[0]=r;Color[1]=g;Color[2]=b;}
void Pintar();
void Itera(ListaObjetos &lista);
};