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
15class 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