Pioneer
vector2.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #pragma once
5 
6 #ifndef _VECTOR2_H
7 #define _VECTOR2_H
8 
9 #include "FloatComparison.h"
10 #include <math.h>
11 
12 template <typename T>
14 template <>
15 struct other_floating_type<float> {
16  typedef double type;
17 };
18 template <>
19 struct other_floating_type<double> {
20  typedef float type;
21 };
22 
23 template <typename T>
24 class vector2 {
25 public:
26  T x, y;
27 
28  vector2() :
29  x(0.0f),
30  y(0.0f) {}
31  vector2(T _x, T _y) :
32  x(_x),
33  y(_y) {}
34  explicit vector2(int v) :
35  x(T(v)),
36  y(T(v)) {}
37  explicit vector2(unsigned int v) :
38  x(T(v)),
39  y(T(v)) {}
40  explicit vector2(T v) :
41  x(v),
42  y(v) {}
43  explicit vector2(const T v[2]) :
44  x(v[0]),
45  y(v[1]) {}
46 
47  // disallow implicit conversion between floating point sizes
48  explicit vector2(const vector2<typename other_floating_type<T>::type> &v);
49  explicit vector2(const typename other_floating_type<T>::type vals[2]);
50 
51  vector2 operator+(const vector2 &v) const { return vector2(x + v.x, y + v.y); }
52  vector2 operator-(const vector2 &v) const { return vector2(x - v.x, y - v.y); }
54  {
55  x += v.x;
56  y += v.y;
57  return *this;
58  }
60  {
61  x -= v.x;
62  y -= v.y;
63  return *this;
64  }
65  vector2 &operator*=(const T &a)
66  {
67  x *= a;
68  y *= a;
69  return *this;
70  }
71  vector2 operator-() const { return vector2(-x, -y); }
72 
73  bool operator==(const vector2 &a) const
74  {
75  return is_equal_exact(a.x, x) && is_equal_exact(a.y, y);
76  }
77  bool ExactlyEqual(const vector2 &a) const
78  {
79  return is_equal_exact(a.x, x) && is_equal_exact(a.y, y);
80  }
81 
82  inline T &operator[](unsigned int idx) { return (&x)[idx]; }
83 
84  friend vector2 operator*(const vector2 &v, const T &a) { return vector2(v.x * a, v.y * a); }
85  friend vector2 operator*(const T &a, const vector2 &v) { return v * a; }
86  friend vector2 operator*(const vector2 &va, const vector2 &vb) { return vector2(va.x * vb.x, va.y * vb.y); }
87  friend vector2 operator/(const vector2 &v, const T &a) { return vector2(v.x / a, v.y / a); }
88  friend vector2 operator/(const vector2 &va, const vector2 &vb) { return vector2(va.x / vb.x, va.y / vb.y); }
89  friend bool operator<(const vector2 &va, const vector2 &vb) { return va.LengthSqr() < vb.LengthSqr(); }
90 
91  T Length() const { return sqrt(x * x + y * y); }
92  T LengthSqr() const { return x * x + y * y; }
94  {
95  const T invlen = 1.0f / sqrt(x * x + y * y);
96  return vector2(x * invlen, y * invlen);
97  }
99  {
100  const T lenSqr = x * x + y * y;
101  if (lenSqr < 1e-18) // sqrt(lenSqr) < 1e-9
102  return vector2(1, 0);
103  else {
104  const T invlen = sqrt(lenSqr);
105  return vector2(x / invlen, y / invlen);
106  }
107  }
108  vector2 Rotate(T alpha) // Rotate around center
109  {
110  return vector2(x * cos(alpha) - y * sin(alpha), y * cos(alpha) + x * sin(alpha));
111  }
112 
113  void Print() const { printf("v(%f,%f)\n", x, y); }
114 };
115 
116 template <>
117 inline vector2<float>::vector2() :
118  x(0.f),
119  y(0.f) {}
120 template <>
121 inline vector2<double>::vector2() :
122  x(0.),
123  y(0.) {}
124 template <>
125 inline vector2<float>::vector2(const vector2<double> &v) :
126  x(float(v.x)),
127  y(float(v.y)) {}
128 template <>
129 inline vector2<double>::vector2(const vector2<float> &v) :
130  x(v.x),
131  y(v.y) {}
132 
135 
136 #endif
bool is_equal_exact(float a, float b)
Definition: FloatComparison.h:112
Definition: vector2.h:24
vector2 Rotate(T alpha)
Definition: vector2.h:108
T y
Definition: vector2.h:26
void Print() const
Definition: vector2.h:113
friend vector2 operator*(const vector2 &va, const vector2 &vb)
Definition: vector2.h:86
bool operator==(const vector2 &a) const
Definition: vector2.h:73
friend vector2 operator/(const vector2 &va, const vector2 &vb)
Definition: vector2.h:88
vector2 NormalizedSafe() const
Definition: vector2.h:98
vector2(int v)
Definition: vector2.h:34
T x
Definition: vector2.h:26
T & operator[](unsigned int idx)
Definition: vector2.h:82
vector2 operator-() const
Definition: vector2.h:71
friend vector2 operator/(const vector2 &v, const T &a)
Definition: vector2.h:87
vector2 operator-(const vector2 &v) const
Definition: vector2.h:52
vector2 & operator+=(const vector2 &v)
Definition: vector2.h:53
friend vector2 operator*(const T &a, const vector2 &v)
Definition: vector2.h:85
friend bool operator<(const vector2 &va, const vector2 &vb)
Definition: vector2.h:89
vector2 & operator-=(const vector2 &v)
Definition: vector2.h:59
T Length() const
Definition: vector2.h:91
vector2()
Definition: vector2.h:28
bool ExactlyEqual(const vector2 &a) const
Definition: vector2.h:77
friend vector2 operator*(const vector2 &v, const T &a)
Definition: vector2.h:84
vector2(T _x, T _y)
Definition: vector2.h:31
vector2(unsigned int v)
Definition: vector2.h:37
vector2(const vector2< typename other_floating_type< T >::type > &v)
vector2(T v)
Definition: vector2.h:40
vector2 operator+(const vector2 &v) const
Definition: vector2.h:51
vector2(const T v[2])
Definition: vector2.h:43
vector2 Normalized() const
Definition: vector2.h:93
T LengthSqr() const
Definition: vector2.h:92
vector2 & operator*=(const T &a)
Definition: vector2.h:65
vector2(const typename other_floating_type< T >::type vals[2])
float type
Definition: vector2.h:20
double type
Definition: vector2.h:16
Definition: vector2.h:13
vector2< float > vector2f
Definition: vector2.h:133
vector2< double > vector2d
Definition: vector2.h:134