/*
    Eksempel på klasser:

    Nyhoff: pp. 560

*/

#include <iostream>
#include <fstream>
using namespace std;

class Particle
{
  private:
   double mass;
   double vx,vy,vz;
   double x,y,z;
 
  public:
 
   Particle()
      {
         cout << "Nu er vi i constructoren\n";
         mass=1.0;
         vx=vy=vz=x=y=z=0.0;
      }

   Particle(double xx,double yy,double zz)
      {
         cout << "Nu er vi i constructoren( position)\n";
         mass=1.0; vx=vy=vz=0.0;
         x=xx; y=yy; z=zz;
      }

   Particle(double xx,double yy,double zz,  double vxx,double vyy,double vzz)
      {
         cout << "Nu er vi i constructoren( position + hastighed)\n";
         mass=1.0;
         vx=vxx; vy=vyy; vz=vzz;
         x=xx; y=yy; z=zz;
      }

   Particle(double xx,double yy,double zz,  double vxx,double vyy,double vzz, double mm)
      {
         cout << "Nu er vi i constructoren( ALT )\n";
         mass=mm;
         vx=vxx; vy=vyy; vz=vzz;
         x=xx; y=yy; z=zz;
      }

   void Move(double xx,double yy,double zz)
     {
        x=xx; y=yy; z=zz;
     }

   void SetVelocity(double vxx,double vyy,double vzz)
     {
        vx=vxx; vy=vyy; vz=vzz;
     }

   void  AngularMomentum(double& Lx,double& Ly,double& Lz)
   /*
    *   L = r x P   P=mv   Lx= ry*Pz-rz*Py;
    */
     {
         Lx=mass*(y*vz-z*vy);
         Ly=mass*(-x*vz+z*vx);
         Lz=mass*(x*vy-y*vx);
     }

   double KineticEnergy()
     {
         return 0.5*mass*(vx*vx+vy*vy+vz*vz);
     }

   void Euler(double dt, double Fx,double Fy, double Fz)
   /*
    *    ma = F  dvs.  a= dv/dt = F/m  => dv = F/m * dt
    */
     {
// Implement
     }

   friend ostream& operator<<(ostream&, Particle);
};

ostream& operator<<(ostream& out, Particle a)
{
  out << a.x << " " << a.y << " " << a.z << " ";
  out << a.vx << " " << a.vy << " " << a.vz;
  return out;
}

int main()
{
   Particle a;

   a.Move( 0.0, 100.0, 0.0 );
   a.SetVelocity( 1.0, 0.0, 0.0 );

   double mass=1;
   double dt=0.01;
   double Jx,Jy,Jz;
   double Fx,Fy,Fz;
   Fx=Fy=Fz=0.0;
   Fy=-9.82*mass;

   ofstream fo("Freefall.t");

   for (double T=0.0; T<100.0 ; T+=dt)
      {
          a.Euler(dt, Fx,Fy,Fz );
          a.Lvector(Jx,Jy,Jz);

          cout << T << "\t" << a << "\n";
          fo << T << "\t" << a << "\n";
      }
   fo.close();

   return 0;
}
