qafVector2D.h

00001 /* 
00002 ** Qaf Framework 1.2
00003 ** June 2006
00004 ** 
00005 ** Pedro Luchini de Moraes, Public Domain - Free Lunch Code
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 ) // Prevent division by zero
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 ) // Prevent division by zero
00111             return;
00112         else {
00113             x /= abs;
00114             y /= abs;
00115         }
00116     }
00117 
00118 
00119     Vector2D Vector2D::project ( const Vector2D & onto ) const {
00120         // Prevent division by zero:
00121         if ( fabs(onto * onto) < QAF_EPSILON ) 
00122             return Vector2D( 0, 0 );
00123 
00124         // Dot product of this with the other, divided by the dot product of the
00125         // other with itself:
00126         float newScale = ((*this) * onto)/(onto * onto);
00127 
00128         // Resize the other vector, and assign to this:
00129         return Vector2D (
00130             onto.x * newScale,
00131             onto.y * newScale );
00132     }
00133 
00134 
00135     Vector2D Vector2D::reflect ( const Vector2D & around ) const {
00136         // Projection of this vector onto the "mirror":
00137         Vector2D vProj = this->project( around );
00138 
00139         // Distance to the "mirror":
00140         Vector2D vIncrH ( vProj.x - x, vProj.y - y );
00141 
00142         // Result:
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

Generated on Sun Mar 25 12:32:12 2007 for Qaf Framework by  doxygen 1.5.1-p1