Advertisement
DoubleV

C++ | Example Vector classes

Aug 19th, 2016
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class Vector2
  2. {
  3. public:
  4.     float x, y;
  5.     inline void Init(float ix, float iy)                { x = ix; y = iy; }
  6.     Vector2         ( void )                            { x = y = 0.0f; }
  7.     Vector2         ( float X, float Y )                { x = X; y = Y; }
  8.     Vector2         ( float* V )                        { x = V[0]; y = V[1]; }
  9.     Vector2         ( const float* V )                  { x = V[0]; y = V[1]; }
  10.     Vector2         ( const Vector2& V )                { x = V.x; y = V.y; }
  11.  
  12.     inline Vector2& operator= ( const Vector2& v )      { x = v.x; y = v.y; return *this; }
  13.     inline float& operator[]  ( int i )                 { return ( ( float* )this )[i]; }
  14.     inline float operator[]   ( int i ) const           { return ( ( float* )this )[i]; }
  15.     inline Vector2& operator+=( const Vector2& v )      { x += v.x; y += v.y; return *this; }
  16.     inline Vector2& operator-=( const Vector2& v )      { x -= v.x; y -= v.y; return *this; }
  17.     inline Vector2& operator*=( const Vector2& v )      { x *= v.x; y *= v.y; return *this; }
  18.     inline Vector2& operator/=( const Vector2& v )      { x /= v.x; y /= v.y; return *this; }
  19.     inline Vector2& operator+=( float v )               { x += v; y += v; return * this; }
  20.     inline Vector2& operator-=( float v )               { x -= v; y -= v; return *this; }
  21.     inline Vector2& operator*=( float v )               { x *= v; y *= v; return *this; }
  22.     inline Vector2& operator/=( float v )               { x /= v; y /= v; return *this; }
  23.     inline Vector2 operator+  ( const Vector2& v )const { return Vector2( x + v.x, y + v.y ); }
  24.     inline Vector2 operator-  ( const Vector2& v )const { return Vector2( x - v.x, y - v.y ); }
  25.     inline Vector2 operator*  ( const Vector2& v )const { return Vector2( x * v.x, y * v.y ); }
  26.     inline Vector2 operator/  ( const Vector2& v )const { return Vector2( x / v.x, y / v.y ); }
  27.     inline Vector2 operator+  ( float v ) const         { return Vector2( x + v, y + v ); }
  28.     inline Vector2 operator-  ( float v ) const         { return Vector2( x - v, y - v ); }
  29.     inline Vector2 operator*  ( float v ) const         { return Vector2( x * v, y * v ); }
  30.     inline Vector2 operator/  ( float v ) const         { return Vector2( x / v, y / v ); }
  31.  
  32.     void Set        ( float X = 0.0f, float Y = 0.0f )  { x = X; y = Y; }
  33.     float Length    ( void ) const                      { return sqrtf( x * x + y * y ); }
  34.     float LengthSqr ( void ) const                      { return ( x * x + y * y ); }
  35.     float DistTo    ( const Vector2& v ) const          { return ( *this - v ).Length( ); }
  36.     float DistToSqr ( const Vector2& v ) const          { return ( *this - v ).LengthSqr( ); }
  37.     float Dot       ( const Vector2& v ) const          { return ( x * v.x + y * v.y  ); }
  38.     bool IsZero     ( void )    const                   { return ( x > -0.01f && x < 0.01f && y > -0.01f && y < 0.01f ); }
  39. };
  40.  
  41. class Vector
  42. {
  43. public:
  44.     float x, y, z;
  45.     inline void Init(float ix, float iy, float iz)      { x = ix; y = iy; z = iz; }
  46.     Vector          ( void )                            { x = 0; y = 0; z = 0; };
  47.     Vector          ( float X, float Y, float Z )       { x = X; y = Y; z = Z; };
  48.     Vector          ( float* V )                        { x = V[0]; y = V[1]; z = V[2]; }
  49.     Vector          ( const float* V )                  { x = V[0]; y = V[1]; z = V[2]; }
  50.     Vector          ( const Vector& V )                 { x = V.x; y = V.y; z = V.z; }
  51.  
  52.     inline Vector& operator= ( const Vector& v )        { x = v.x; y = v.y; z = v.z; return *this; }
  53.     inline float& operator[] ( int i )                  { return ( ( float* )this )[i]; }
  54.     inline float operator[]  ( int i ) const            { return ( ( float* )this )[i]; }
  55.     inline Vector& operator+=( const Vector& v )        { x += v.x; y += v.y; z += v.z; return *this; }
  56.     inline Vector& operator-=( const Vector& v )        { x -= v.x; y -= v.y; z -= v.z; return *this; }
  57.     inline Vector& operator*=( const Vector& v )        { x *= v.x; y *= v.y; z *= v.z; return *this; }
  58.     inline Vector& operator/=( const Vector& v )        { x /= v.x; y /= v.y; z /= v.z; return *this; }
  59.     inline Vector& operator+=( float v )                { x += v; y += v; z += v; return *this; }
  60.     inline Vector& operator-=( float v )                { x -= v; y -= v; z -= v; return *this; }
  61.     inline Vector& operator*=( float v )                { x *= v; y *= v; z *= v; return *this; }
  62.     inline Vector& operator/=( float v )                { x /= v; y /= v; z /= v; return *this; }
  63.     inline Vector operator+  ( const Vector& v ) const  { return Vector( x + v.x, y + v.y, z + v.z ); }
  64.     inline Vector operator-  ( const Vector& v ) const  { return Vector( x - v.x, y - v.y, z - v.z ); }
  65.     inline Vector operator*  ( const Vector& v ) const  { return Vector( x * v.x, y * v.y, z * v.z ); }
  66.     inline Vector operator/  ( const Vector& v ) const  { return Vector( x / v.x, y / v.y, z / v.z ); }
  67.     inline Vector operator+  ( float v ) const          { return Vector( x + v, y + v, z + v ); }
  68.     inline Vector operator-  ( float v ) const          { return Vector( x - v, y - v, z - v ); }
  69.     inline Vector operator*  ( float v ) const          { return Vector( x * v, y * v, z * v ); }
  70.     inline Vector operator/  ( float v ) const          { return Vector( x / v, y / v, z / v ); }
  71.  
  72.     float*  Base()          { return (float*)this; }
  73.     float*  Base() const    { return (float*)this; }
  74.  
  75.     void  Set( float X = 0.0f, float Y = 0.0f, float Z = 0.0f ) { x = X; y = Y; z = Z; }
  76.     float LengthSqr( void )                                     { return (x*x + y*y + z*z); }
  77.     float Length( void )                                        { return sqrtf(x*x + y*y + z*z); }
  78.     float DistTo    ( const Vector& v ) const                   { return ( *this - v ).Length( ); }
  79.     float DistToSqr ( const Vector& v ) const                   { return ( *this - v ).LengthSqr( ); }
  80.     float Dot       ( const Vector& v ) const                   { return ( x * v.x + y * v.y + z * v.z ); }
  81.     bool  IsZero        ( void )    const                       { return ( x > -0.01f && x < 0.01f && y > -0.01f && y < 0.01f && z > -0.01f && z < 0.01f ); }
  82. };
  83.  
  84. class Vector4
  85. {
  86. public:
  87.     float x, y, z, w;
  88.     inline void Init(float ix, float iy, float iz, float iw)    { x = ix; y = iy; z = iz; w = iw; }
  89.     Vector4         ( void )                                    { x = 0; y = 0; z = 0; w = 0; }
  90.     Vector4         ( float X, float Y, float Z, float W )      { x = X; y = Y; z = Z; w = W; }
  91.     Vector4         ( float* V )                                { x = V[0]; y = V[1]; z = V[2]; w = V[3]; }
  92.     Vector4         ( const float* V )                          { x = V[0]; y = V[1]; z = V[2]; w = V[3]; }
  93.     Vector4         ( const Vector4& V )                        { x = V.x; y = V.y; z = V.z; w = V.w; }
  94.  
  95.     bool IsValid() const    { return !isinf( x ) && !isinf( y ) && !isinf( z ) && !isinf( w ); }
  96.     void Invalidate()       { x = y = z = w = std::numeric_limits<float>::infinity(); }
  97.  
  98.     inline Vector4& operator= ( const Vector4& V )          { x = V.x; y = V.y; z = V.z; w = V.w; return *this; }
  99.     inline float&   operator[]( int i )                     { return ((float*)this)[i]; }
  100.     inline float    operator[]( int i ) const               { return ((float*)this)[i]; }
  101.     inline Vector4& operator+=( const Vector4& v )          { x += v.x; y += v.y; z += v.z; w += v.w; return *this; }
  102.     inline Vector4& operator-=( const Vector4& v )          { x -= v.x; y -= v.y; z -= v.z; w -= v.w; return *this; }
  103.     inline Vector4& operator*=( const Vector4& v )          { x *= v.x; y *= v.y; z *= v.z; w *= v.w; return *this; }
  104.     inline Vector4& operator/=( const Vector4& v )          { x /= v.x; y /= v.y; z /= v.z; w /= v.w; return *this; }
  105.     inline Vector4& operator+=( float v )                   { x += v; y += v; z += v; w += v; return *this; }
  106.     inline Vector4& operator-=( float v )                   { x -= v; y -= v; z -= v; w += v; return *this; }
  107.     inline Vector4& operator*=( float v )                   { x *= v; y *= v; z *= v; w += v; return *this; }
  108.     inline Vector4& operator/=( float v )                   { x /= v; y /= v; z /= v; w += v; return *this; }
  109.     inline Vector4 operator+  ( const Vector4& v ) const    { return Vector4( x + v.x, y + v.y, z + v.z, w + v.w ); }
  110.     inline Vector4 operator-  ( const Vector4& v ) const    { return Vector4( x - v.x, y - v.y, z - v.z, w - v.w ); }
  111.     inline Vector4 operator*  ( const Vector4& v ) const    { return Vector4( x * v.x, y * v.y, z * v.z, w * v.w ); }
  112.     inline Vector4 operator/  ( const Vector4& v ) const    { return Vector4( x / v.x, y / v.y, z / v.z, w / v.w ); }
  113.     inline Vector4 operator+  ( float v ) const             { return Vector4( x + v, y + v, z + v, w + v ); }
  114.     inline Vector4 operator-  ( float v ) const             { return Vector4( x - v, y - v, z - v, w - v ); }
  115.     inline Vector4 operator*  ( float v ) const             { return Vector4( x * v, y * v, z * v, w * v ); }
  116.     inline Vector4 operator/  ( float v ) const             { return Vector4( x / v, y / v, z / v, w / v ); }
  117.  
  118.     float*  Base()          { return (float*)this; }
  119.     float*  Base() const    { return (float*)this; }
  120.  
  121.     void Random( float minVal, float maxVal )
  122.     {
  123.         x = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal);
  124.         y = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal);
  125.         z = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal);
  126.         w = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal);
  127.     }
  128.     void Zero() { x = y = z = w = 0.0f; }
  129.  
  130.     inline bool operator==( const Vector4& src ) const { return (src.x == x) && (src.y == y) && (src.z == z) && (src.w == w); }
  131.     inline bool operator!=( const Vector4& src ) const { return (src.x != x) && (src.y != y) && (src.z != z) && (src.w != w); }
  132.  
  133.     void Negate() { x = -x; y = -y; z = -z; w = -w; }
  134.     float Length() const { return sqrt( x*x + y*y + z*z + w*w ); }
  135.     float LengthSqr() const { return ( x*x + y*y + z*z + w*w ); }
  136.     bool IsZero( float tolerance = 0.01f ) const
  137.     {
  138.         return (x > -tolerance && x < tolerance &&
  139.                 y > -tolerance && y < tolerance &&
  140.                 z > -tolerance && z < tolerance &&
  141.                 w > -tolerance && w < tolerance);
  142.     }
  143.     float   NormalizeInPlace() {}
  144.     Vector4 Normalized() const;
  145.     bool    IsLengthGreaterThan( float val ) const;
  146.     bool    IsLengthLessThan( float val ) const;
  147.  
  148.     bool WithinAABox( Vector4 const &boxmin, Vector4 const &boxmax )
  149.     {
  150.         return (
  151.             (x >= boxmin.x) && (x <= boxmax.x) &&
  152.             (y >= boxmin.y) && (y <= boxmax.y) &&
  153.             (z >= boxmin.z) && (z <= boxmax.z) &&
  154.             (w >= boxmin.w) && (w <= boxmax.w)
  155.             );
  156.     }
  157.     float DistTo( const Vector4 &vOther ) const
  158.     {
  159.         Vector4 delta;
  160.         delta = *this - vOther;
  161.         return delta.Length();
  162.     }
  163.     float DistToSqr( const Vector4 &vOther ) const
  164.     {
  165.         Vector4 delta;
  166.         delta.x = x - vOther.x;
  167.         delta.y = y - vOther.y;
  168.         delta.z = z - vOther.z;
  169.         delta.w = w - vOther.w;
  170.         return delta.LengthSqr();
  171.     }
  172.     void CopyToArray( float* rgfl ) const
  173.     {
  174.         rgfl[0] = x, rgfl[1] = y, rgfl[2] = z; rgfl[3] = w;
  175.     }
  176.     void MulAdd( const Vector4& a, const Vector4& b, float scalar )
  177.     {
  178.         x = a.x + b.x * scalar;
  179.         y = a.y + b.y * scalar;
  180.         z = a.z + b.z * scalar;
  181.         w = a.w + b.w * scalar;
  182.     }
  183.     float Dot( const Vector4& b ) const
  184.     {
  185.         return (x*b.x + y*b.y + z*b.z + w*b.w);
  186.     }
  187.     Vector4 ProjectOnto( const Vector4& onto )
  188.     {
  189.         return onto * (this->Dot( onto ) / (onto.LengthSqr()));
  190.     }
  191.     Vector4 Min( const Vector4 &vOther ) const {
  192.         return Vector4( x < vOther.x ? x : vOther.x,
  193.             y < vOther.y ? y : vOther.y,
  194.             z < vOther.z ? z : vOther.z,
  195.             w < vOther.w ? w : vOther.w );
  196.     }
  197.  
  198.     Vector4 Max( const Vector4 &vOther ) const {
  199.         return Vector4( x > vOther.x ? x : vOther.x,
  200.             y > vOther.y ? y : vOther.y,
  201.             z > vOther.z ? z : vOther.z,
  202.             w > vOther.w ? w : vOther.w );
  203.     }
  204. };
  205.  
  206. // Hehe
  207. typedef Vector QAngle;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement