topical media & game development

talk show tell print

lib-of-vs-addons-ofxVectorMath-src-ofxVec2f.cpp / cpp



  include <ofxVec2f.h>
  
  ofxVec2f::ofxVec2f( float _x, float _y ) {
          x = _x;
          y = _y;
  }
  
  ofxVec2f::ofxVec2f( const ofPoint& pnt ) {
          x = pnt.x;
          y = pnt.y;
  }
  
  // Getters and Setters.
  //
  //
  void ofxVec2f::set( float _x, float _y ) {
          x = _x;
          y = _y;
  }
  
  void ofxVec2f::set( const ofPoint& vec ) {
          x = vec.x;
          y = vec.y;
  }
  
  float& ofxVec2f::operator[]( const int& i ) {
          switch(i) {
                  case 0:  return x;
                  case 1:  return y;
                  default: return x;
          }
  }
  
  // Check similarity/equality.
  //
  //
  bool ofxVec2f::operator==( const ofPoint& vec ) {
          return (x == vec.x) && (y == vec.y);
  }
  
  bool ofxVec2f::operator!=( const ofPoint& vec ) {
          return (x != vec.x) || (y != vec.y);
  }
  
  bool ofxVec2f::match( const ofPoint& vec, float tollerance ) {
          return (fabs(x - vec.x) < tollerance)
                  && (fabs(y - vec.y) < tollerance);
  }
  
  
Checks if vectors look in the same direction. Tollerance is specified in degree.

  
  bool ofxVec2f::align( const ofxVec2f& vec, float tollerance ) const {
          return  fabs( this->angle( vec ) ) < tollerance;
  }
  
  bool ofxVec2f::alignRad( const ofxVec2f& vec, float tollerance ) const {
          return  fabs( this->angleRad( vec ) ) < tollerance;
  }
  
  // Overloading for any type to any type
  //
  //
  void ofxVec2f::operator=( const ofPoint& vec ){
          x = vec.x;
          y = vec.y;
  }
  
  ofxVec2f ofxVec2f::operator+( const ofPoint& vec ) const {
          return ofxVec2f( x+vec.x, y+vec.y);
  }
  
  ofxVec2f& ofxVec2f::operator+=( const ofPoint& vec ) {
          x += vec.x;
          y += vec.y;
          return *this;
  }
  
  ofxVec2f ofxVec2f::operator-( const ofPoint& vec ) const {
          return ofxVec2f(x-vec.x, y-vec.y);
  }
  
  ofxVec2f& ofxVec2f::operator-=( const ofPoint& vec ) {
          x -= vec.x;
          y -= vec.y;
          return *this;
  }
  
  ofxVec2f ofxVec2f::operator*( const ofPoint& vec ) const {
          return ofxVec2f(x*vec.x, y*vec.y);
  }
  
  ofxVec2f& ofxVec2f::operator*=( const ofPoint& vec ) {
          x*=vec.x;
          y*=vec.y;
          return *this;
  }
  
  ofxVec2f ofxVec2f::operator/( const ofPoint& vec ) const {
          return ofxVec2f( vec.x!=0 ? x/vec.x : x , vec.y!=0 ? y/vec.y : y);
  }
  
  ofxVec2f& ofxVec2f::operator/=( const ofPoint& vec ) {
          vec.x!=0 ? x/=vec.x : x;
          vec.y!=0 ? y/=vec.y : y;
          return *this;
  }
  
  //operator overloading for float
  //
  //
  void ofxVec2f::operator=( const float f){
          x = f;
          y = f;
  }
  
  ofxVec2f ofxVec2f::operator+( const float f ) const {
          return ofxVec2f( x+f, y+f);
  }
  
  ofxVec2f& ofxVec2f::operator+=( const float f ) {
          x += f;
          y += f;
          return *this;
  }
  
  ofxVec2f ofxVec2f::operator-( const float f ) const {
          return ofxVec2f( x-f, y-f);
  }
  
  ofxVec2f& ofxVec2f::operator-=( const float f ) {
          x -= f;
          y -= f;
          return *this;
  }
  
  ofxVec2f ofxVec2f::operator-() const {
          return ofxVec2f(-x, -y);
  }
  
  ofxVec2f ofxVec2f::operator*( const float f ) const {
          return ofxVec2f(x*f, y*f);
  }
  
  ofxVec2f& ofxVec2f::operator*=( const float f ) {
          x*=f;
          y*=f;
          return *this;
  }
  
  ofxVec2f ofxVec2f::operator/( const float f ) const {
          if(f == 0) return ofxVec2f(x, y);
  
          return ofxVec2f(x/f, y/f);
  }
  
  ofxVec2f& ofxVec2f::operator/=( const float f ) {
          if(f == 0) return *this;
  
          x/=f;
          y/=f;
          return *this;
  }
  
  ofxVec2f ofxVec2f::rescaled( const float length ) const {
          return getScaled(length);
  }
  
  ofxVec2f ofxVec2f::getScaled( const float length ) const {
          float l = (float)sqrt(x*x + y*y);
          if( l > 0 )
                  return ofxVec2f( (x/l)*length, (y/l)*length );
          else
                  return ofxVec2f();
  }
  
  ofxVec2f& ofxVec2f::rescale( const float length ){
          return scale(length);
  }
  
  ofxVec2f& ofxVec2f::scale( const float length ) {
          float l = (float)sqrt(x*x + y*y);
          if (l > 0) {
                  x = (x/l)*length;
                  y = (y/l)*length;
          }
          return *this;
  }
  
  // Rotation
  //
  //
  ofxVec2f ofxVec2f::rotated( float angle ) const {
          return getRotated(angle);
  }
  
  ofxVec2f ofxVec2f::getRotated( float angle ) const {
          float a = (float)(angle*DEG_TO_RAD);
          return ofxVec2f( x*cos(a) - y*sin(a),
                                          x*sin(a) + y*cos(a) );
  }
  
  ofxVec2f ofxVec2f::getRotatedRad( float angle ) const {
          float a = angle;
          return ofxVec2f( x*cos(a) - y*sin(a),
                                          x*sin(a) + y*cos(a) );
  }
  
  ofxVec2f& ofxVec2f::rotate( float angle ) {
          float a = (float)(angle * DEG_TO_RAD);
          float xrot = x*cos(a) - y*sin(a);
          y = x*sin(a) + y*cos(a);
          x = xrot;
          return *this;
  }
  
  ofxVec2f& ofxVec2f::rotateRad( float angle ) {
          float a = angle;
          float xrot = x*cos(a) - y*sin(a);
          y = x*sin(a) + y*cos(a);
          x = xrot;
          return *this;
  }
  
  // Normalization
  //
  //
  ofxVec2f ofxVec2f::normalized() const {
          return getNormalized();
  }
  
  ofxVec2f ofxVec2f::getNormalized() const {
          float length = (float)sqrt(x*x + y*y);
          if( length > 0 ) {
                  return ofxVec2f( x/length, y/length );
          } else {
                  return ofxVec2f();
          }
  }
  
  ofxVec2f& ofxVec2f::normalize() {
          float length = (float)sqrt(x*x + y*y);
          if( length > 0 ) {
                  x /= length;
                  y /= length;
          }
          return *this;
  }
  
  // Limit length.
  //
  //
  ofxVec2f ofxVec2f::limited(float max) const{
          return getLimited(max);
  }
  
  ofxVec2f ofxVec2f::getLimited(float max) const {
          float length = (float)sqrt(x*x + y*y);
          if( length > max && length > 0 ) {
                  return ofxVec2f( (x/length)*max, (y/length)*max );
          } else {
                  return ofxVec2f( x, y );
          }
  }
  
  ofxVec2f& ofxVec2f::limit(float max) {
          float length = (float)sqrt(x*x + y*y);
          if( length > max && length > 0 ) {
                  x = (x/length)*max;
                  y = (y/length)*max;
          }
          return *this;
  }
  
  // Perpendicular normalized vector.
  //
  //
  ofxVec2f ofxVec2f::perpendiculared() const {
          return getPerpendicular();
  }
  
  ofxVec2f ofxVec2f::getPerpendicular() const {
          float length = (float)sqrt( x*x + y*y );
          if( length > 0 )
                  return ofxVec2f( -(y/length), x/length );
          else
                  return ofxVec2f();
  }
  
  ofxVec2f& ofxVec2f::perpendicular() {
          float length = (float)sqrt( x*x + y*y );
          if( length > 0 ) {
                  float _x = x;
                  x = -(y/length);
                  y = _x/length;
          }
          return *this;
  }
  
  // Length
  //
  //
  float ofxVec2f::length() const {
          return (float)sqrt( x*x + y*y );
  }
  
  float ofxVec2f::lengthSquared() const {
          return squareLength();
  }
  
  float ofxVec2f::squareLength() const {
          return (float)(x*x + y*y);
  }
  
  
Angle (deg) between two vectors. This is a signed relative angle between -180 and 180.

  
  float ofxVec2f::angle( const ofxVec2f& vec ) const {
          return (float)(atan2( x*vec.y-y*vec.x, x*vec.x + y*vec.y )*RAD_TO_DEG);
  }
  
  
Angle (deg) between two vectors. This is a signed relative angle between -180 and 180.

  
  float ofxVec2f::angleRad( const ofxVec2f& vec ) const {
          return atan2( x*vec.y-y*vec.x, x*vec.x + y*vec.y );
  }
  
  
Dot Product.

  
  float ofxVec2f::dot( const ofxVec2f& vec ) const {
          return x*vec.x + y*vec.y;
  }
  
  // Non-Member operators
  //
  //
  ofxVec2f operator+( float f, const ofxVec2f& vec ) {
      return ofxVec2f( f+vec.x, f+vec.y);
  }
  
  ofxVec2f operator-( float f, const ofxVec2f& vec ) {
      return ofxVec2f( f-vec.x, f-vec.y);
  }
  
  ofxVec2f operator*( float f, const ofxVec2f& vec ) {
      return ofxVec2f( f*vec.x, f*vec.y);
  }
  
  ofxVec2f operator/( float f, const ofxVec2f& vec ) {
      return ofxVec2f( f/vec.x, f/vec.y);
  }
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.