// Copyright (c) 1999 Philip A. Hardin (pahardin@cs.utexas.edu)
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License v2 or later.


#include "pt2d.h"



/*======================================================================*/
// Return value is in the range [-MA_PI/4, 7*MA_PI/4)
ang2d pt2d::Ang2d() const {
  if (x==0 and y==0) return 0;
  if (x  >=ABS(y)) return (ang2d)(      0   + (y * (MA_PI/4)) / x);
  if (-x >=ABS(y)) return (ang2d)(  MA_PI   + (y * (MA_PI/4)) / x);
  if (y  > ABS(x)) return (ang2d)(  MA_PI/2 - (x * (MA_PI/4)) / y);
                   return (ang2d)(3*MA_PI/2 - (x * (MA_PI/4)) / y);
}


/*----------------------------------------------------------------------*/
void pt2d::Interpolate(const pt2d& pt1, const pt2d& pt2, int i, int range)
{ if (range==0) return;
  x= pt1.x + i*(pt2.x -pt1.x)/range;
  y= pt1.y + i*(pt2.y -pt1.y)/range;
}


/*-------------------------------------------------------------------------*/
pt2d pt2d::Normalized(coord len) const
// Treating this pt as a vector, normalize so that vector length= len
{ return (*this) * (len/Dist());
}


/*----------------------------------------------------------------------*/
// Treating this pt as a vector, normalize so that vector length= len
void pt2d::Normalize(coord len)
{ *this *= len/Dist();
}


/*----------------------------------------------------------------------*/
// Treating this pt as a vector, normalize so that vector length= len
void pt2d::FastNormalize(coord len)
{ *this *= len/FastDist();
}


/*----------------------------------------------------------------------*/
pt2d pt2d::operator>>(double ang) const
{ double sinAng= sin(ang);
  double cosAng= cos(ang);
  return pt2d((coord)(cosAng*x - sinAng*y),(coord)(cosAng*y + sinAng*x));
}


/*----------------------------------------------------------------------*/
void pt2d::operator>>=(double ang)
{ double sinAng= sin(ang);
  double cosAng= cos(ang);
  coord	tempx= (coord)(cosAng*x - sinAng*y);
  y= (coord)(cosAng*y + sinAng*x);
  x= tempx;
}
