Explicitly call deprecated AX name calculation API.
[chromium-blink-merge.git] / native_client_sdk / src / examples / demo / flock / vector2.h
blob9d68178f6db7ae1742f3a5ef266f17aa21a2023a
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.
5 #ifndef VECTOR2_H_
6 #define VECTOR2_H_
8 #include <stdlib.h>
9 #include <cmath>
10 #include <limits>
12 // A small class that encapsulates a 2D vector. Provides a few simple
13 // operations.
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() {}
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;
27 // The magnitude of this vector.
28 double Magnitude() const {
29 return sqrt(x_ * x_ + y_ * y_);
32 // Add |vec| to this vector. Works in-place.
33 void Add(const Vector2& vec) {
34 x_ += vec.x();
35 y_ += vec.y();
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);
47 // Scale the vector in-place by |scale|.
48 void Scale(double scale) {
49 x_ *= scale;
50 y_ *= scale;
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).
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;
70 // Accessors and mutators for the coordinate values.
71 double x() const { return x_; }
72 void set_x(double x) { x_ = x; }
74 double y() const { return y_; }
75 void set_y(double y) { y_ = y; }
77 double x_;
78 double y_;
81 #endif // VECTOR2_H_