Skip to content
Snippets Groups Projects
vec2.h 3.72 KiB
/*******************************************************************************
 *  vec2.h
 *
 *  (C) 2006 AG Aktives Sehen <agas@uni-koblenz.de>
 *           Universitaet Koblenz-Landau
 *
 * Author: Frank Neuhaus, Susanne Maur
 *******************************************************************************/

#include <iostream>
#include <sstream>

#ifndef VEC2_H
#define VEC2_H

#include <math.h>

class CVec2
{
  public:

    inline CVec2()
    {
      m_X = 0; m_Y = 0;
    }

    inline CVec2 ( double x, double y )
    {
      m_X=x; m_Y=y;
    }

    inline CVec2 ( const CVec2& vec )
    {
      m_X=vec.x(); m_Y=vec.y();
    }

    inline CVec2 operator+ ( const CVec2& vVector ) const
    {
      return CVec2 ( vVector[0] + m_X, vVector[1] + m_Y );
    };

    inline CVec2 operator- ( const CVec2& vVector ) const
    {
      return CVec2 ( m_X - vVector[0], m_Y - vVector[1] );
    };
    
    inline CVec2 operator- ( ) const
    {
        return CVec2 ( - m_X, - m_Y );
    };

    inline CVec2 operator* ( double num ) const
    {
      return CVec2 ( m_X * num, m_Y * num );
    };

    inline double operator* ( const CVec2& vVector ) const
    {
      return m_X*vVector[0]+m_Y*vVector[1];
    }

    inline CVec2 operator/ ( double num ) const
    {
      return CVec2 ( m_X / num, m_Y / num );
    }

    inline void set ( double fx, double fy )
    {
      m_X=fx; m_Y=fy;
    }

    inline double x() const
    {
      return m_X;
    }

    inline double y() const
    {
      return m_Y;
    }

    inline double magnitude() const
    {
      double sumOfSquares = m_X*m_X + m_Y*m_Y;
      return sqrt ( sumOfSquares );
    }

    inline double operator [] ( unsigned int i ) const
    {
      return ( ( double* ) this ) [i];
    }

    inline double& operator [] ( unsigned int i )
    {
      return ( ( double* ) this ) [i];
    }

    inline CVec2& operator/= ( double num )
    {
      double inv=1.0f/num;
      m_X*=inv;
      m_Y*=inv;
      return ( *this );
    }

    inline CVec2& operator*= ( double num )
    {
      m_X*=num;
      m_Y*=num;
      return ( *this );
    }

    inline CVec2& normalize()
    {
      return ( *this/=magnitude() );
    }

    inline CVec2& makePerp()
    {
      double xn=m_X;
      m_X=-m_Y;
      m_Y=xn;
      return *this;
    }

    inline CVec2 getNormal() const
    {
      return CVec2 ( m_Y, -m_X ); //?
    }

    inline CVec2 getNormalized() const
    {
      return ( *this ) /magnitude();
    }

    inline double sqr() const
    {
      return ( *this ) * ( *this );
    }
    inline double dot ( const CVec2& vec ) const
    {
      return ( m_X*vec[0] ) + ( m_Y*vec[1] );
    }

    inline double getAngle ( const CVec2& vec ) const
    {
      return acos ( dot ( vec ) / ( magnitude() *vec.magnitude() ) );
    }

    /// @param angle Rotation angle in radiants
    inline CVec2 rotate ( float angle ) const
    {
      double xRot =  m_X*cos ( angle ) - m_Y*sin ( angle );
      double yRot =  m_X*sin ( angle ) + m_Y*cos ( angle );
      return CVec2 ( xRot, yRot );
    }

    inline bool equal ( CVec2 vec ) const
    {
      return ( m_X==vec.x() && m_Y==vec.y() );
    }

    /**
     * Returns the string representation of the vector.
     * @return string representation of the point.
     */
    inline std::string toString() const
    {
      std::ostringstream str;
      str << m_X << " " << m_Y;
      return str.str();
    }

  protected:
    double m_X, m_Y;
};

inline CVec2 operator* ( double f, const CVec2& v )
{
  return v*f;
}

inline CVec2 normalize ( const CVec2& v )
{
  return v/v.magnitude();
}

#endif