Pioneer
Loading...
Searching...
No Matches
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
12template <typename T>
14template <>
15struct other_floating_type<float> {
16 typedef double type;
17};
18template <>
19struct other_floating_type<double> {
20 typedef float type;
21};
22
23template <typename T>
24class vector2 {
25public:
26 T x, y;
27
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
116template <>
118 x(0.f),
119 y(0.f) {}
120template <>
122 x(0.),
123 y(0.) {}
124template <>
126 x(float(v.x)),
127 y(float(v.y)) {}
128template <>
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
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 T &a)
Definition vector2.h:65
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
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)
Definition vector2.h:53
vector2 operator+(const vector2 &v) const
Definition vector2.h:51
vector2(const T v[2])
Definition vector2.h:43
T & operator[](unsigned int idx)
Definition vector2.h:82
vector2 Normalized() const
Definition vector2.h:93
vector2 & operator-=(const vector2 &v)
Definition vector2.h:59
T LengthSqr() const
Definition vector2.h:92
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