Simulant  21.12-194
A portable game engine for Windows, OSX, Linux, Dreamcast, and PSP
vec2.h
1 #pragma once
2 
3 #include <cmath>
4 #include "../utils/unicode.h"
5 #include "../utils/formatter.h"
6 
7 namespace smlt {
8 
9 struct Vec3;
10 struct Vec4;
11 struct Degrees;
12 
13 struct Vec2 {
14 
15 public:
16  static const Vec2 NEGATIVE_X;
17  static const Vec2 POSITIVE_X;
18  static const Vec2 NEGATIVE_Y;
19  static const Vec2 POSITIVE_Y;
20 
21  static const Vec2 DOWN;
22  static const Vec2 LEFT;
23  static const Vec2 ONE;
24  static const Vec2 RIGHT;
25  static const Vec2 UP;
26  static const Vec2 ZERO;
27 
28  float x;
29  float y;
30 
31  Vec2():
32  x(0.0f), y(0.0f) {
33  }
34 
35  Vec2(float x, float y):
36  x(x), y(y) {
37 
38  }
39 
40  Vec2 rotated_by(const Degrees& degrees) const;
41 
42  float length() const {
43  return sqrtf(x * x + y * y);
44  }
45 
46  float length_squared() const {
47  return x * x + y * y;
48  }
49 
50  void normalize() {
51  float l = 1.0f / length();
52  x *= l;
53  y *= l;
54  }
55 
56  Vec2 normalized() const {
57  Vec2 ret = *this;
58  ret.normalize();
59  return ret;
60  }
61 
62  void limit(float l) {
63  if(length() > l) {
64  normalize();
65  *this *= l;
66  }
67  }
68 
69  Vec2 operator*(float rhs) const {
70  Vec2 result(x * rhs, y * rhs);
71  return result;
72  }
73 
74  Vec2& operator*=(float rhs) {
75  *this = *this * rhs;
76  return *this;
77  }
78 
79  Vec2& operator+=(const Vec2& rhs) {
80  *this = *this + rhs;
81  return *this;
82  }
83 
84  Vec2& operator-=(const Vec2& rhs) {
85  *this = *this - rhs;
86  return *this;
87  }
88 
89  Vec2 operator+(const Vec2& rhs) const {
90  return Vec2(x + rhs.x, y + rhs.y);
91  }
92 
93  Vec2& operator/=(float rhs) {
94  *this = *this / rhs;
95  return *this;
96  }
97 
98  Vec2 operator/(float rhs) const {
99  Vec2 result(x / rhs, y / rhs);
100  return result;
101  }
102 
103  Vec2 operator-() const {
104  return Vec2(-x, -y);
105  }
106 
107  Vec2 operator-(const Vec2& rhs) const {
108  return Vec2(x - rhs.x, y - rhs.y);
109  }
110 
111  float dot(const Vec2& rhs) const {
112  return x * rhs.x + y * rhs.y;
113  }
114 
115  Vec3 xyz(float z = 0.0f) const;
116 
117  Vec4 xyzw(float z=0.0f, float w=1.0f) const;
118 
119  friend std::ostream& operator<<(std::ostream& stream, const Vec2& vec);
120 
121  bool equals(const Vec2& rhs) const {
122  return x == rhs.x && y == rhs.y;
123  }
124 
125  friend bool operator==(const Vec2& lhs, const Vec2& rhs);
126 };
127 
128 bool operator==(const Vec2& lhs, const Vec2& rhs);
129 bool operator!=(const Vec2& lhs, const Vec2& rhs);
130 Vec2 operator*(float lhs, const Vec2& rhs);
131 
132 std::ostream& operator<<(std::ostream& stream, const Vec2& vec);
133 
134 }
smlt::Vec3
Definition: vec3.h:23
smlt
Definition: animation.cpp:25
smlt::Degrees
Definition: degrees.h:7
smlt::Vec4
Definition: vec4.h:11
smlt::Vec2
Definition: vec2.h:13