Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <iostream>
00011 #include <sstream>
00012
00013 #ifndef VEC2_H
00014 #define VEC2_H
00015
00016 #include <math.h>
00017
00018 class CVec2
00019 {
00020 public:
00021
00022 inline CVec2()
00023 {
00024 m_X = 0; m_Y = 0;
00025 }
00026
00027 inline CVec2 ( double x, double y )
00028 {
00029 m_X=x; m_Y=y;
00030 }
00031
00032 inline CVec2 ( const CVec2& vec )
00033 {
00034 m_X=vec.x(); m_Y=vec.y();
00035 }
00036
00037 inline CVec2 operator+ ( const CVec2& vVector ) const
00038 {
00039 return CVec2 ( vVector[0] + m_X, vVector[1] + m_Y );
00040 };
00041
00042 inline CVec2 operator- ( const CVec2& vVector ) const
00043 {
00044 return CVec2 ( m_X - vVector[0], m_Y - vVector[1] );
00045 };
00046
00047 inline CVec2 operator- ( ) const
00048 {
00049 return CVec2 ( - m_X, - m_Y );
00050 };
00051
00052 inline CVec2 operator* ( double num ) const
00053 {
00054 return CVec2 ( m_X * num, m_Y * num );
00055 };
00056
00057 inline double operator* ( const CVec2& vVector ) const
00058 {
00059 return m_X*vVector[0]+m_Y*vVector[1];
00060 }
00061
00062 inline CVec2 operator/ ( double num ) const
00063 {
00064 return CVec2 ( m_X / num, m_Y / num );
00065 }
00066
00067 inline void set ( double fx, double fy )
00068 {
00069 m_X=fx; m_Y=fy;
00070 }
00071
00072 inline double x() const
00073 {
00074 return m_X;
00075 }
00076
00077 inline double y() const
00078 {
00079 return m_Y;
00080 }
00081
00082 inline double magnitude() const
00083 {
00084 double sumOfSquares = m_X*m_X + m_Y*m_Y;
00085 return sqrt ( sumOfSquares );
00086 }
00087
00088 inline double operator [] ( unsigned int i ) const
00089 {
00090 return ( ( double* ) this ) [i];
00091 }
00092
00093 inline double& operator [] ( unsigned int i )
00094 {
00095 return ( ( double* ) this ) [i];
00096 }
00097
00098 inline CVec2& operator/= ( double num )
00099 {
00100 double inv=1.0f/num;
00101 m_X*=inv;
00102 m_Y*=inv;
00103 return ( *this );
00104 }
00105
00106 inline CVec2& operator*= ( double num )
00107 {
00108 m_X*=num;
00109 m_Y*=num;
00110 return ( *this );
00111 }
00112
00113 inline CVec2& normalize()
00114 {
00115 return ( *this/=magnitude() );
00116 }
00117
00118 inline CVec2& makePerp()
00119 {
00120 double xn=m_X;
00121 m_X=-m_Y;
00122 m_Y=xn;
00123 return *this;
00124 }
00125
00126 inline CVec2 getNormal() const
00127 {
00128 return CVec2 ( m_Y, -m_X );
00129 }
00130
00131 inline CVec2 getNormalized() const
00132 {
00133 return ( *this ) /magnitude();
00134 }
00135
00136 inline double sqr() const
00137 {
00138 return ( *this ) * ( *this );
00139 }
00140
00141 inline double dot ( const CVec2& vec ) const
00142 {
00143 return ( m_X*vec[0] ) + ( m_Y*vec[1] );
00144 }
00145
00146 inline double getAngle ( const CVec2& vec ) const
00147 {
00148 return acos ( dot ( vec ) / ( magnitude() *vec.magnitude() ) );
00149 }
00150
00152 inline CVec2 rotate ( float angle ) const
00153 {
00154 double xRot = m_X*cos ( angle ) - m_Y*sin ( angle );
00155 double yRot = m_X*sin ( angle ) + m_Y*cos ( angle );
00156 return CVec2 ( xRot, yRot );
00157 }
00158
00159 inline bool equal ( CVec2 vec ) const
00160 {
00161 return ( m_X==vec.x() && m_Y==vec.y() );
00162 }
00163
00168 inline std::string toString() const
00169 {
00170 std::ostringstream str;
00171 str << m_X << " " << m_Y;
00172 return str.str();
00173 }
00174
00175 protected:
00176 double m_X, m_Y;
00177 };
00178
00179 inline CVec2 operator* ( double f, const CVec2& v )
00180 {
00181 return v*f;
00182 }
00183
00184 inline CVec2 normalize ( const CVec2& v )
00185 {
00186 return v/v.magnitude();
00187 }
00188
00189 #endif