OgreVector2.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004     (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 
00009 Permission is hereby granted, free of charge, to any person obtaining a copy
00010 of this software and associated documentation files (the "Software"), to deal
00011 in the Software without restriction, including without limitation the rights
00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00013 copies of the Software, and to permit persons to whom the Software is
00014 furnished to do so, subject to the following conditions:
00015 
00016 The above copyright notice and this permission notice shall be included in
00017 all copies or substantial portions of the Software.
00018 
00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00025 THE SOFTWARE.
00026 -----------------------------------------------------------------------------
00027 */
00028 #ifndef __Vector2_H__
00029 #define __Vector2_H__
00030 
00031 
00032 #include "OgrePrerequisites.h"
00033 #include "OgreMath.h"
00034 
00035 namespace Ogre
00036 {
00037 
00051     class _OgreExport Vector2
00052     {
00053     public:
00054         Real x, y;
00055 
00056     public:
00057         inline Vector2()
00058         {
00059         }
00060 
00061         inline Vector2(const Real fX, const Real fY )
00062             : x( fX ), y( fY )
00063         {
00064         }
00065 
00066         inline explicit Vector2( const Real scaler )
00067             : x( scaler), y( scaler )
00068         {
00069         }
00070 
00071         inline explicit Vector2( const Real afCoordinate[2] )
00072             : x( afCoordinate[0] ),
00073               y( afCoordinate[1] )
00074         {
00075         }
00076 
00077         inline explicit Vector2( const int afCoordinate[2] )
00078         {
00079             x = (Real)afCoordinate[0];
00080             y = (Real)afCoordinate[1];
00081         }
00082 
00083         inline explicit Vector2( Real* const r )
00084             : x( r[0] ), y( r[1] )
00085         {
00086         }
00087 
00090         inline void swap(Vector2& other)
00091         {
00092             std::swap(x, other.x);
00093             std::swap(y, other.y);
00094         }
00095 
00096         inline Real operator [] ( const size_t i ) const
00097         {
00098             assert( i < 2 );
00099 
00100             return *(&x+i);
00101         }
00102 
00103         inline Real& operator [] ( const size_t i )
00104         {
00105             assert( i < 2 );
00106 
00107             return *(&x+i);
00108         }
00109 
00111         inline Real* ptr()
00112         {
00113             return &x;
00114         }
00116         inline const Real* ptr() const
00117         {
00118             return &x;
00119         }
00120 
00125         inline Vector2& operator = ( const Vector2& rkVector )
00126         {
00127             x = rkVector.x;
00128             y = rkVector.y;
00129 
00130             return *this;
00131         }
00132 
00133         inline Vector2& operator = ( const Real fScalar)
00134         {
00135             x = fScalar;
00136             y = fScalar;
00137 
00138             return *this;
00139         }
00140 
00141         inline bool operator == ( const Vector2& rkVector ) const
00142         {
00143             return ( x == rkVector.x && y == rkVector.y );
00144         }
00145 
00146         inline bool operator != ( const Vector2& rkVector ) const
00147         {
00148             return ( x != rkVector.x || y != rkVector.y  );
00149         }
00150 
00151         // arithmetic operations
00152         inline Vector2 operator + ( const Vector2& rkVector ) const
00153         {
00154             return Vector2(
00155                 x + rkVector.x,
00156                 y + rkVector.y);
00157         }
00158 
00159         inline Vector2 operator - ( const Vector2& rkVector ) const
00160         {
00161             return Vector2(
00162                 x - rkVector.x,
00163                 y - rkVector.y);
00164         }
00165 
00166         inline Vector2 operator * ( const Real fScalar ) const
00167         {
00168             return Vector2(
00169                 x * fScalar,
00170                 y * fScalar);
00171         }
00172 
00173         inline Vector2 operator * ( const Vector2& rhs) const
00174         {
00175             return Vector2(
00176                 x * rhs.x,
00177                 y * rhs.y);
00178         }
00179 
00180         inline Vector2 operator / ( const Real fScalar ) const
00181         {
00182             assert( fScalar != 0.0 );
00183 
00184             Real fInv = 1.0f / fScalar;
00185 
00186             return Vector2(
00187                 x * fInv,
00188                 y * fInv);
00189         }
00190 
00191         inline Vector2 operator / ( const Vector2& rhs) const
00192         {
00193             return Vector2(
00194                 x / rhs.x,
00195                 y / rhs.y);
00196         }
00197 
00198         inline const Vector2& operator + () const
00199         {
00200             return *this;
00201         }
00202 
00203         inline Vector2 operator - () const
00204         {
00205             return Vector2(-x, -y);
00206         }
00207 
00208         // overloaded operators to help Vector2
00209         inline friend Vector2 operator * ( const Real fScalar, const Vector2& rkVector )
00210         {
00211             return Vector2(
00212                 fScalar * rkVector.x,
00213                 fScalar * rkVector.y);
00214         }
00215 
00216         inline friend Vector2 operator / ( const Real fScalar, const Vector2& rkVector )
00217         {
00218             return Vector2(
00219                 fScalar / rkVector.x,
00220                 fScalar / rkVector.y);
00221         }
00222 
00223         inline friend Vector2 operator + (const Vector2& lhs, const Real rhs)
00224         {
00225             return Vector2(
00226                 lhs.x + rhs,
00227                 lhs.y + rhs);
00228         }
00229 
00230         inline friend Vector2 operator + (const Real lhs, const Vector2& rhs)
00231         {
00232             return Vector2(
00233                 lhs + rhs.x,
00234                 lhs + rhs.y);
00235         }
00236 
00237         inline friend Vector2 operator - (const Vector2& lhs, const Real rhs)
00238         {
00239             return Vector2(
00240                 lhs.x - rhs,
00241                 lhs.y - rhs);
00242         }
00243 
00244         inline friend Vector2 operator - (const Real lhs, const Vector2& rhs)
00245         {
00246             return Vector2(
00247                 lhs - rhs.x,
00248                 lhs - rhs.y);
00249         }
00250 
00251         // arithmetic updates
00252         inline Vector2& operator += ( const Vector2& rkVector )
00253         {
00254             x += rkVector.x;
00255             y += rkVector.y;
00256 
00257             return *this;
00258         }
00259 
00260         inline Vector2& operator += ( const Real fScaler )
00261         {
00262             x += fScaler;
00263             y += fScaler;
00264 
00265             return *this;
00266         }
00267 
00268         inline Vector2& operator -= ( const Vector2& rkVector )
00269         {
00270             x -= rkVector.x;
00271             y -= rkVector.y;
00272 
00273             return *this;
00274         }
00275 
00276         inline Vector2& operator -= ( const Real fScaler )
00277         {
00278             x -= fScaler;
00279             y -= fScaler;
00280 
00281             return *this;
00282         }
00283 
00284         inline Vector2& operator *= ( const Real fScalar )
00285         {
00286             x *= fScalar;
00287             y *= fScalar;
00288 
00289             return *this;
00290         }
00291 
00292         inline Vector2& operator *= ( const Vector2& rkVector )
00293         {
00294             x *= rkVector.x;
00295             y *= rkVector.y;
00296 
00297             return *this;
00298         }
00299 
00300         inline Vector2& operator /= ( const Real fScalar )
00301         {
00302             assert( fScalar != 0.0 );
00303 
00304             Real fInv = 1.0f / fScalar;
00305 
00306             x *= fInv;
00307             y *= fInv;
00308 
00309             return *this;
00310         }
00311 
00312         inline Vector2& operator /= ( const Vector2& rkVector )
00313         {
00314             x /= rkVector.x;
00315             y /= rkVector.y;
00316 
00317             return *this;
00318         }
00319 
00327         inline Real length () const
00328         {
00329             return Math::Sqrt( x * x + y * y );
00330         }
00331 
00342         inline Real squaredLength () const
00343         {
00344             return x * x + y * y;
00345         }
00346 
00354         inline Real distance(const Vector2& rhs) const
00355         {
00356             return (*this - rhs).length();
00357         }
00358 
00369         inline Real squaredDistance(const Vector2& rhs) const
00370         {
00371             return (*this - rhs).squaredLength();
00372         }
00373 
00388         inline Real dotProduct(const Vector2& vec) const
00389         {
00390             return x * vec.x + y * vec.y;
00391         }
00392 
00403         inline Real normalise()
00404         {
00405             Real fLength = Math::Sqrt( x * x + y * y);
00406 
00407             // Will also work for zero-sized vectors, but will change nothing
00408             // We're not using epsilons because we don't need to.
00409             // Read http://www.ogre3d.org/forums/viewtopic.php?f=4&t=61259
00410             if ( fLength > Real(0.0f) )
00411             {
00412                 Real fInvLength = 1.0f / fLength;
00413                 x *= fInvLength;
00414                 y *= fInvLength;
00415             }
00416 
00417             return fLength;
00418         }
00419 
00423         inline Vector2 midPoint( const Vector2& vec ) const
00424         {
00425             return Vector2(
00426                 ( x + vec.x ) * 0.5f,
00427                 ( y + vec.y ) * 0.5f );
00428         }
00429 
00433         inline bool operator < ( const Vector2& rhs ) const
00434         {
00435             if( x < rhs.x && y < rhs.y )
00436                 return true;
00437             return false;
00438         }
00439 
00443         inline bool operator > ( const Vector2& rhs ) const
00444         {
00445             if( x > rhs.x && y > rhs.y )
00446                 return true;
00447             return false;
00448         }
00449 
00457         inline void makeFloor( const Vector2& cmp )
00458         {
00459             if( cmp.x < x ) x = cmp.x;
00460             if( cmp.y < y ) y = cmp.y;
00461         }
00462 
00470         inline void makeCeil( const Vector2& cmp )
00471         {
00472             if( cmp.x > x ) x = cmp.x;
00473             if( cmp.y > y ) y = cmp.y;
00474         }
00475 
00483         inline Vector2 perpendicular(void) const
00484         {
00485             return Vector2 (-y, x);
00486         }
00487 
00491         inline Real crossProduct( const Vector2& rkVector ) const
00492         {
00493             return x * rkVector.y - y * rkVector.x;
00494         }
00495 
00515         inline Vector2 randomDeviant(Real angle) const
00516         {
00517 
00518             angle *=  Math::UnitRandom() * Math::TWO_PI;
00519             Real cosa = cos(angle);
00520             Real sina = sin(angle);
00521             return  Vector2(cosa * x - sina * y,
00522                             sina * x + cosa * y);
00523         }
00524 
00526         inline bool isZeroLength(void) const
00527         {
00528             Real sqlen = (x * x) + (y * y);
00529             return (sqlen < (1e-06 * 1e-06));
00530 
00531         }
00532 
00535         inline Vector2 normalisedCopy(void) const
00536         {
00537             Vector2 ret = *this;
00538             ret.normalise();
00539             return ret;
00540         }
00541 
00545         inline Vector2 reflect(const Vector2& normal) const
00546         {
00547             return Vector2( *this - ( 2 * this->dotProduct(normal) * normal ) );
00548         }
00549 
00551         inline bool isNaN() const
00552         {
00553             return Math::isNaN(x) || Math::isNaN(y);
00554         }
00555 
00560         inline Ogre::Radian angleBetween(const Ogre::Vector2& other) const
00561         {       
00562             Ogre::Real lenProduct = length() * other.length();
00563             // Divide by zero check
00564             if(lenProduct < 1e-6f)
00565                 lenProduct = 1e-6f;
00566         
00567             Ogre::Real f = dotProduct(other) / lenProduct;
00568     
00569             f = Ogre::Math::Clamp(f, (Ogre::Real)-1.0, (Ogre::Real)1.0);
00570             return Ogre::Math::ACos(f);
00571         }
00572 
00578         inline Ogre::Radian angleTo(const Ogre::Vector2& other) const
00579         {
00580             Ogre::Radian angle = angleBetween(other);
00581         
00582             if (crossProduct(other)<0)          
00583                 angle = (Ogre::Radian)Ogre::Math::TWO_PI - angle;       
00584 
00585             return angle;
00586         }
00587 
00588         // special points
00589         static const Vector2 ZERO;
00590         static const Vector2 UNIT_X;
00591         static const Vector2 UNIT_Y;
00592         static const Vector2 NEGATIVE_UNIT_X;
00593         static const Vector2 NEGATIVE_UNIT_Y;
00594         static const Vector2 UNIT_SCALE;
00595 
00598         inline _OgreExport friend std::ostream& operator <<
00599             ( std::ostream& o, const Vector2& v )
00600         {
00601             o << "Vector2(" << v.x << ", " << v.y <<  ")";
00602             return o;
00603         }
00604     };
00608 }
00609 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:28 2012