-
Niklas Yann Wettengel authored
This reverts commit d5e27568.
Niklas Yann Wettengel authoredThis reverts commit d5e27568.
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