00001
00002
00003
00004
00005
00006
00007
00008 #ifndef QAF_UTIL_VECTOR2D_H
00009 #define QAF_UTIL_VECTOR2D_H
00010
00011 #include <math.h>
00012 #include "../qafDef.h"
00013
00014 namespace qaf {
00015
00026 class Vector2D {
00027 public:
00028 float x, y;
00029
00030 Vector2D () : x(0), y(0) {}
00031 Vector2D ( float _x, float _y ) : x(_x), y(_y) {}
00032 Vector2D ( int _x, int _y ) : x((float) _x), y((float) _y) {}
00033
00034 inline Vector2D & operator = ( const Vector2D & v );
00035
00037 inline float length () const;
00038
00040 inline float dist ( const Vector2D & that ) const;
00041
00043 inline Vector2D unit () const;
00044
00046 inline void normalize ();
00047
00049 inline Vector2D project ( const Vector2D & onto ) const;
00050
00052 inline Vector2D reflect ( const Vector2D & around ) const;
00053
00055 inline Vector2D rotate ( float radians ) const;
00056
00058 inline float angle ( const Vector2D & v ) const;
00059
00060 inline Vector2D & operator += ( const Vector2D & v );
00061 inline Vector2D & operator -= ( const Vector2D & v );
00062 inline Vector2D operator + ( const Vector2D & v ) const;
00063 inline Vector2D operator - ( const Vector2D & v ) const;
00064 inline Vector2D operator - () const;
00065
00066 inline Vector2D & operator *= ( float s );
00067 inline Vector2D operator * ( float s ) const;
00068 inline Vector2D & operator /= ( float s );
00069 inline Vector2D operator / ( float s ) const;
00070
00072 inline float operator * ( const Vector2D & v ) const;
00073
00074 };
00075
00076 inline Vector2D operator * ( float s, const Vector2D & v );
00077
00078
00079
00080 Vector2D & Vector2D::operator = ( const Vector2D & v ) {
00081 x = v.x;
00082 y = v.y;
00083
00084 return *this;
00085 }
00086
00087 float Vector2D::length () const {
00088 return sqrtf( x * x + y * y );
00089 }
00090
00091
00092 float Vector2D::dist ( const Vector2D & that ) const {
00093 return sqrtf( ((x - that.x) * (x - that.x)) +
00094 ((y - that.y) * (y - that.y)) );
00095 }
00096
00097
00098 Vector2D Vector2D::unit () const {
00099 float abs = length();
00100 if ( abs <= QAF_EPSILON )
00101 return (*this);
00102 else
00103 return Vector2D(
00104 x / abs,
00105 y / abs );
00106 }
00107
00108 void Vector2D::normalize () {
00109 float abs = length();
00110 if ( abs <= QAF_EPSILON )
00111 return;
00112 else {
00113 x /= abs;
00114 y /= abs;
00115 }
00116 }
00117
00118
00119 Vector2D Vector2D::project ( const Vector2D & onto ) const {
00120
00121 if ( fabs(onto * onto) < QAF_EPSILON )
00122 return Vector2D( 0, 0 );
00123
00124
00125
00126 float newScale = ((*this) * onto)/(onto * onto);
00127
00128
00129 return Vector2D (
00130 onto.x * newScale,
00131 onto.y * newScale );
00132 }
00133
00134
00135 Vector2D Vector2D::reflect ( const Vector2D & around ) const {
00136
00137 Vector2D vProj = this->project( around );
00138
00139
00140 Vector2D vIncrH ( vProj.x - x, vProj.y - y );
00141
00142
00143 return Vector2D (
00144 vProj.x + vIncrH.x,
00145 vProj.y + vIncrH.y );
00146 }
00147
00148
00149 Vector2D Vector2D::rotate ( float radians ) const {
00150 float cosR = cosf( radians );
00151 float cosMR = cosf( -radians );
00152 float sinMR = sinf( -radians );
00153
00154 return Vector2D (
00155 x * cosMR + y * sinMR,
00156 y * cosR - x * sinMR );
00157 }
00158
00159
00160 float Vector2D::angle ( const Vector2D & v ) const {
00161 float dot = (*this) * v;
00162 float zCross = v.x * y - x * v.y;
00163
00164 float absAngle = acosf(dot / length() / v.length());
00165
00166 if ( zCross > 0 )
00167 return -absAngle;
00168 else
00169 return absAngle;
00170 }
00171
00172
00173 Vector2D & Vector2D::operator += ( const Vector2D & v ) {
00174 x += v.x;
00175 y += v.y;
00176
00177 return *this;
00178 }
00179
00180 Vector2D & Vector2D::operator -= ( const Vector2D & v ) {
00181 x -= v.x;
00182 y -= v.y;
00183
00184 return *this;
00185 }
00186
00187 Vector2D Vector2D::operator + ( const Vector2D & v ) const {
00188 return Vector2D (
00189 x + v.x,
00190 y + v.y );
00191 }
00192
00193 Vector2D Vector2D::operator - ( const Vector2D & v ) const {
00194 return Vector2D (
00195 x - v.x,
00196 y - v.y );
00197 }
00198
00199 Vector2D Vector2D::operator - () const {
00200 return Vector2D ( -x, -y );
00201 }
00202
00203
00204 Vector2D & Vector2D::operator *= ( float s ) {
00205 x *= s;
00206 y *= s;
00207
00208 return *this;
00209 }
00210
00211 Vector2D Vector2D::operator * ( float s ) const {
00212 return Vector2D (
00213 x * s,
00214 y * s );
00215 }
00216
00217 Vector2D operator * ( float s, const Vector2D & t ) {
00218 return Vector2D (
00219 t.x * s,
00220 t.y * s );
00221 }
00222
00223 Vector2D & Vector2D::operator /= ( float s ) {
00224 x /= s;
00225 y /= s;
00226
00227 return *this;
00228 }
00229
00230 Vector2D Vector2D::operator / ( float s ) const {
00231 return Vector2D (
00232 x / s,
00233 y / s );
00234 }
00235
00236
00237 float Vector2D::operator * ( const Vector2D & v ) const {
00238 return x * v.x + y * v.y;
00239 }
00240
00241 }
00242
00243 #endif