// $Source: /local/data/cvs/yellowbank/tile/qangle.cc,v $
// $Revision: 1.2 $
// $State: Exp $
// $Date: 2004/07/19 03:54:07 $
// $Author: yrp001 $
// $Locker:  $

#include "qangle.h"

qangle::
qangle( float angle, unsigned char t )
  : _unit( 0 )
{
  set( angle, t );
}

qangle::
qangle( float a, float b, unsigned char t ) {
  set( a, b, t );
}

void
qangle::
set( float angle, unsigned char t ) {
  if( t == 0 )
    _angle = wrap( angle );
  else
    _angle = wrap( Q_DEG_2_RAD * angle );
}

int
qangle::
set( float a, float b, unsigned char t ) {
  switch( t ) {
  case 0:
    if( a == 0.0 )
      if( b > 0 )
	_angle = M_PI_2;
      else if( b < 0 )
	_angle = Q_3_PI_2;
      else {
	_angle = 0;
	return 0;
      }
    else
      _angle = wrap( atan2( b, a ) );
    break;
  default:
    std::cerr << "Error: qangle: bad argument to constructor" << std::endl;
    return 1;
  }
  return 1;
}

qangle
qangle::
operator+( const qangle& rhs ) const {
  return qangle( _angle + rhs._angle );
}

qangle
qangle::
operator-( const qangle& rhs ) const {
  double a = _angle;
  if( a < rhs._angle )
    a += Q_2_PI;
  return qangle( a - rhs._angle );
}

qangle&
qangle::
operator=( const qangle& rhs ) {
  if( &rhs == this )
    return *this;
  _angle = rhs._angle;
  return *this;
}

int
qangle::
operator==( const qangle& rhs ) const {
  return( _angle == rhs._angle );
}

int
qangle::
operator!=( const qangle& rhs ) const {
  return( _angle != rhs._angle );
}

int
qangle::
operator<( const qangle& rhs ) const {
  qangle t = rhs - *this;
  if( t < M_PI )
    return 1;
  return 0;
}

int
qangle::
operator>( const qangle& rhs ) const {
  qangle t = *this - rhs;
  if( t < M_PI )
    return 1;
  return 0;
}

float
qangle::
wrap( float angle ) const {
  float temp = fmod( angle, Q_2_PI );
  if( temp < 0 )
    temp += Q_2_PI;
  return temp;
}

std::ostream&
operator<<( std::ostream& os, qangle& angle ) {
  if( angle._unit == 0 )
    return os << angle._angle;
  return os << angle._angle * Q_RAD_2_DEG;
}

std::istream&
operator>>( std::istream& is, qangle& angle ) {
  is >> angle._angle;
  if( angle._unit != 0 )
    angle._angle *= Q_DEG_2_RAD;
  return is;
}

