Home | History | Annotate | Download | only in flock
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef VECTOR2_H_
      6 #define VECTOR2_H_
      7 
      8 #include <stdlib.h>
      9 #include <cmath>
     10 #include <limits>
     11 
     12 // A small class that encapsulates a 2D vector.  Provides a few simple
     13 // operations.
     14 
     15 class Vector2 {
     16  public:
     17   Vector2() : x_(0.0), y_(0.0) {}
     18   Vector2(double x, double y) : x_(x), y_(y) {}
     19   ~Vector2() {}
     20 
     21   // Create a new vector that represents a - b.
     22   static Vector2 Difference(const Vector2& a, const Vector2& b) {
     23     Vector2 diff(a.x() - b.x(), a.y() - b.y());
     24     return diff;
     25   }
     26 
     27   // The magnitude of this vector.
     28   double Magnitude() const {
     29     return sqrt(x_ * x_ + y_ * y_);
     30   }
     31 
     32   // Add |vec| to this vector.  Works in-place.
     33   void Add(const Vector2& vec) {
     34     x_ += vec.x();
     35     y_ += vec.y();
     36   }
     37 
     38   // Normalize this vector in-place.  If the vector is degenerate (size 0)
     39   // then do nothing.
     40   void Normalize() {
     41     double mag = Magnitude();
     42     if (fabs(mag) < std::numeric_limits<double>::epsilon())
     43       return;
     44     Scale(1.0 / mag);
     45   }
     46 
     47   // Scale the vector in-place by |scale|.
     48   void Scale(double scale) {
     49     x_ *= scale;
     50     y_ *= scale;
     51   }
     52 
     53   // Clamp a vector to a maximum magnitude.  Works on the vector in-place.
     54   // @param max_mag The maximum magnitude of the vector.
     55   void Clamp(double max_mag) {
     56     double mag = Magnitude();
     57     if (mag > max_mag) {
     58       Scale(max_mag / mag);  // Does Normalize() followed by Scale(max_mag).
     59     }
     60   }
     61 
     62   // Compute the "heading" of a vector - this is the angle in radians between
     63   // the vector and the x-axis.
     64   // @return {!number} The "heading" angle in radians.
     65   double Heading() const {
     66     double angle = atan2(y_, x_);
     67     return angle;
     68   }
     69 
     70   // Accessors and mutators for the coordinate values.
     71   double x() const { return x_; }
     72   void set_x(double x) { x_ = x; }
     73 
     74   double y() const { return y_; }
     75   void set_y(double y) { y_ = y; }
     76 
     77   double x_;
     78   double y_;
     79 };
     80 
     81 #endif  // VECTOR2_H_
     82