import PhysicalObject;
import MyCanvas;

public class InertialObject extends PhysicalObject
 {
  public double v;
  public SpacetimePoint p0;  // initial location of object

  public InertialObject()
   {
    this(new SpacetimePoint(), 0.0);
   }

  public InertialObject(SpacetimePoint p0, double abs_v)
   {
    super();
    this.p0 = p0;
    this.v = abs_v;
   }

  public InertialObject(ReferenceFrame f, double x, double t, double v)
   {
    this(f.location(x,t), f.abs_v(v));
   }

  public double gamma()
   {
    return 1 / Math.sqrt(1 - v * v);
   }

  public void setInitialLocation(SpacetimePoint p)
   {
    p0 = p;
   }
 
  public void setInitialVelocity(double v)
   {
    this.v = v;
   }

  public double abs_t(double properTime)
   {
    return p0.t + (properTime - initProperTime) * gamma();
   }

  public double abs_x(double properTime)
   {
    return p0.x + (properTime - initProperTime) * v * gamma();
   }

  public double velocity(double properTime)
   {
    return v;
   }

  public void display(MyCanvas g)
   {
    g.setColor(color);

    if (immortal)
      g.drawForwardLine(p0, v);
    else
      g.drawLine(p0,location(endProperTime));

    if (prehistoric)
      g.drawBackwardLine(p0, v);
   }
 
  public double intersect(ReferenceFrame f, double t)
   {
    double fv = f.v(v);
    double gamma = 1/Math.sqrt(1 - fv*fv);

    return initProperTime + (t - f.t(p0)) * gamma;
   } 

  public ReferenceFrame closest(SpacetimePoint p)
   {
    ReferenceFrame f = new ReferenceFrame(this);
    double dx = f.abs_dx(0,f.t(p));
    double dt = f.abs_dt(0,f.t(p));

    f.x0 += dx;
    f.t0 += dt;

    return f;
   }

 }
