Sen API
Sen Libraries
Toggle main menu visibility
Loading...
Searching...
No Matches
vec3.h
Go to the documentation of this file.
1
// === vec3.h ==========================================================================================================
2
// Sen Infrastructure
3
// Released under the Apache License v2.0 (SPDX-License-Identifier Apache-2.0).
4
// See the LICENSE.txt file for more information.
5
// © Airbus SAS, Airbus Helicopters, and Airbus Defence and Space SAU/GmbH/SAS.
6
// =====================================================================================================================
7
8
#ifndef SEN_LIBS_UTIL_SRC_DR_VEC3_H
9
#define SEN_LIBS_UTIL_SRC_DR_VEC3_H
10
11
// sen
12
#include "
sen/core/base/compiler_macros.h
"
13
#include "
sen/core/base/numbers.h
"
14
15
// std
16
#include <cmath>
17
#include <initializer_list>
18
19
namespace
sen::util
20
{
22
template
<
typename
T>
23
class
Vec3
24
{
25
public
:
26
SEN_COPY_MOVE(
Vec3
)
27
28
public
:
29
Vec3
() noexcept = default;
30
31
Vec3
(T x, T y, T z) noexcept;
32
33
~
Vec3
() = default;
34
35
public:
// data
36
T*
ptr
() noexcept;
37
38
[[nodiscard]] const T*
ptr
() const noexcept;
39
40
public:
// setters
41
void
set
(T x, T y, T z) noexcept;
42
43
void
setX
(T x) noexcept;
44
45
void
setY
(T y) noexcept;
46
47
void
setZ
(T z) noexcept;
48
49
void
set
(const
Vec3
& rhs) noexcept;
50
51
public:
// getters
52
[[nodiscard]] T
getX
() const noexcept;
53
54
[[nodiscard]] T
getY
() const noexcept;
55
56
[[nodiscard]] T
getZ
() const noexcept;
57
58
public:
// comparison
59
bool
operator==(const
Vec3
& v) const noexcept;
60
61
bool
operator!=(const
Vec3
& v) const noexcept;
62
63
bool
operator<(const
Vec3
& v) const noexcept;
64
65
public:
// operators
67
T operator*(const
Vec3
& rhs) const noexcept;
68
70
Vec3
operator^(const
Vec3
& rhs) const noexcept;
71
73
Vec3
operator*(T rhs) const noexcept;
74
76
Vec3
& operator*=(T rhs) noexcept;
77
79
Vec3
operator/(T rhs) const noexcept;
80
82
Vec3
& operator/=(T rhs) noexcept;
83
85
Vec3
operator+(const
Vec3
& rhs) const noexcept;
86
88
Vec3
& operator+=(const
Vec3
& rhs) noexcept;
89
91
Vec3
operator-(const
Vec3
& rhs) const noexcept;
92
94
Vec3
& operator-=(const
Vec3
& rhs) noexcept;
95
97
Vec3
operator-() const noexcept;
98
99
public:
100
// Get the module of the vector
101
[[nodiscard]] T
length
() const noexcept;
102
103
// Get the module squared of the vector
104
[[nodiscard]] T
length2
() const noexcept;
105
108
T
normalize
() noexcept;
109
110
private:
111
T v_[3] {};
112
};
113
114
using
Vec3f
=
Vec3<f32>
;
115
using
Vec3d
=
Vec3<f64>
;
116
117
//-------------------------------------------------------------------------------------------------------------------
118
// Inline implementation
119
//-------------------------------------------------------------------------------------------------------------------
120
121
template
<
typename
T>
122
inline
Vec3<T>::Vec3
(T x, T y, T z)
noexcept
123
{
124
v_[0] = x;
125
v_[1] = y;
126
v_[2] = z;
127
}
128
129
template
<
typename
T>
130
inline
T*
Vec3<T>::ptr
() noexcept
131
{
132
return
v_;
133
}
134
135
template
<
typename
T>
136
inline
const
T*
Vec3<T>::ptr
() const noexcept
137
{
138
return
v_;
139
}
140
141
template
<
typename
T>
142
inline
void
Vec3<T>::set
(T x, T y, T z)
noexcept
143
{
144
v_[0] = x;
145
v_[1] = y;
146
v_[2] = z;
147
}
148
149
template
<
typename
T>
150
inline
void
Vec3<T>::setX
(T x)
noexcept
151
{
152
v_[0] = x;
153
}
154
155
template
<
typename
T>
156
inline
void
Vec3<T>::setY
(T y)
noexcept
157
{
158
v_[1] = y;
159
}
160
161
template
<
typename
T>
162
inline
void
Vec3<T>::setZ
(T z)
noexcept
163
{
164
v_[2] = z;
165
}
166
167
template
<
typename
T>
168
inline
void
Vec3<T>::set
(
const
Vec3
& rhs)
noexcept
169
{
170
v_[0] = rhs.v_[0];
171
v_[1] = rhs.v_[1];
172
v_[2] = rhs.v_[2];
173
}
174
175
template
<
typename
T>
176
[[nodiscard]]
inline
T
Vec3<T>::getX
() const noexcept
177
{
178
return
v_[0];
179
}
180
181
template
<
typename
T>
182
[[nodiscard]]
inline
T
Vec3<T>::getY
() const noexcept
183
{
184
return
v_[1];
185
}
186
187
template
<
typename
T>
188
[[nodiscard]]
inline
T
Vec3<T>::getZ
() const noexcept
189
{
190
return
v_[2];
191
}
192
193
template
<
typename
T>
194
inline
bool
Vec3<T>::operator==
(
const
Vec3
& v)
const
noexcept
195
{
196
return
v_[0] == v.v_[0] && v_[1] == v.v_[1] && v_[2] == v.v_[2];
197
}
198
199
template
<
typename
T>
200
inline
bool
Vec3<T>::operator!=
(
const
Vec3
& v)
const
noexcept
201
{
202
return
v_[0] != v.v_[0] || v_[1] != v.v_[1] || v_[2] != v.v_[2];
203
}
204
205
template
<
typename
T>
206
inline
bool
Vec3<T>::operator<
(
const
Vec3
& v)
const
noexcept
207
{
208
if
(v_[0] < v.v_[0])
209
{
210
return
true
;
211
}
212
if
(v_[0] > v.v_[0])
213
{
214
return
false
;
215
}
216
if
(v_[1] < v.v_[1])
217
{
218
return
true
;
219
}
220
if
(v_[1] > v.v_[1])
221
{
222
return
false
;
223
}
224
return
(v_[2] < v.v_[2]);
225
}
226
227
template
<
typename
T>
228
inline
T
Vec3<T>::operator*
(
const
Vec3
& rhs)
const
noexcept
229
{
230
return
v_[0] * rhs.v_[0] + v_[1] * rhs.v_[1] + v_[2] * rhs.v_[2];
231
}
232
233
template
<
typename
T>
234
inline
Vec3<T>
Vec3<T>::operator^
(
const
Vec3
& rhs)
const
noexcept
235
{
236
return
Vec3
(v_[1] * rhs.v_[2] - v_[2] * rhs.v_[1],
237
v_[2] * rhs.v_[0] - v_[0] * rhs.v_[2],
238
v_[0] * rhs.v_[1] - v_[1] * rhs.v_[0]);
239
}
240
241
template
<
typename
T>
242
inline
Vec3<T>
Vec3<T>::operator*
(T rhs)
const
noexcept
243
{
244
return
Vec3
(v_[0] * rhs, v_[1] * rhs, v_[2] * rhs);
245
}
246
247
template
<
typename
T>
248
inline
Vec3<T>
&
Vec3<T>::operator*=
(T rhs)
noexcept
249
{
250
v_[0] *= rhs;
251
v_[1] *= rhs;
252
v_[2] *= rhs;
253
return
*
this
;
254
}
255
256
template
<
typename
T>
257
inline
Vec3<T>
Vec3<T>::operator/
(T rhs)
const
noexcept
258
{
259
return
Vec3
(v_[0] / rhs, v_[1] / rhs, v_[2] / rhs);
260
}
261
262
template
<
typename
T>
263
inline
Vec3<T>
&
Vec3<T>::operator/=
(T rhs)
noexcept
264
{
265
v_[0] /= rhs;
266
v_[1] /= rhs;
267
v_[2] /= rhs;
268
return
*
this
;
269
}
270
271
template
<
typename
T>
272
inline
Vec3<T>
Vec3<T>::operator+
(
const
Vec3
& rhs)
const
noexcept
273
{
274
return
Vec3
(v_[0] + rhs.v_[0], v_[1] + rhs.v_[1], v_[2] + rhs.v_[2]);
275
}
276
277
template
<
typename
T>
278
inline
Vec3<T>
&
Vec3<T>::operator+=
(
const
Vec3
& rhs)
noexcept
279
{
280
v_[0] += rhs.v_[0];
281
v_[1] += rhs.v_[1];
282
v_[2] += rhs.v_[2];
283
return
*
this
;
284
}
285
286
template
<
typename
T>
287
inline
Vec3<T>
Vec3<T>::operator-
(
const
Vec3
& rhs)
const
noexcept
288
{
289
return
Vec3
(v_[0] - rhs.v_[0], v_[1] - rhs.v_[1], v_[2] - rhs.v_[2]);
290
}
291
292
template
<
typename
T>
293
inline
Vec3<T>
&
Vec3<T>::operator-=
(
const
Vec3
& rhs)
noexcept
294
{
295
v_[0] -= rhs.v_[0];
296
v_[1] -= rhs.v_[1];
297
v_[2] -= rhs.v_[2];
298
return
*
this
;
299
}
300
301
template
<
typename
T>
302
inline
Vec3<T>
Vec3<T>::operator-
() const noexcept
303
{
304
return
Vec3
(-v_[0], -v_[1], -v_[2]);
305
}
306
307
template
<
typename
T>
308
[[nodiscard]]
inline
T
Vec3<T>::length
() const noexcept
309
{
310
return
std::sqrt(v_[0] * v_[0] + v_[1] * v_[1] + v_[2] * v_[2]);
311
}
312
313
template
<
typename
T>
314
[[nodiscard]]
inline
T
Vec3<T>::length2
() const noexcept
315
{
316
return
v_[0] * v_[0] + v_[1] * v_[1] + v_[2] * v_[2];
317
}
318
319
template
<
typename
T>
320
inline
T
Vec3<T>::normalize
() noexcept
321
{
322
T norm =
Vec3::length
();
323
if
(norm > 0.0)
324
{
325
T inv = 1.0f / norm;
326
v_[0] *= inv;
327
v_[1] *= inv;
328
v_[2] *= inv;
329
}
330
return
(norm);
331
}
332
333
}
// namespace sen::util
334
335
#endif
// SEN_LIBS_UTIL_SRC_DR_VEC3_H
sen::util::Vec3
Handles all mathematical ops involving 3D Vectors.
Definition
vec3.h:24
sen::util::Vec3< f32 >::getY
f32 getY() const noexcept
sen::util::Vec3< f32 >::normalize
f32 normalize() noexcept
sen::util::Vec3::operator+
Vec3 operator+(const Vec3 &rhs) const noexcept
Binary vector addition.
Definition
vec3.h:272
sen::util::Vec3::operator<
bool operator<(const Vec3 &v) const noexcept
Definition
vec3.h:206
sen::util::Vec3::operator==
bool operator==(const Vec3 &v) const noexcept
Definition
vec3.h:194
sen::util::Vec3< f32 >::length2
f32 length2() const noexcept
sen::util::Vec3< f32 >::getX
f32 getX() const noexcept
sen::util::Vec3< f32 >::set
void set(f32 x, f32 y, f32 z) noexcept
sen::util::Vec3::operator/=
Vec3 & operator/=(T rhs) noexcept
Unary division by scalar.
Definition
vec3.h:263
sen::util::Vec3< f32 >::setX
void setX(f32 x) noexcept
sen::util::Vec3< f32 >::setY
void setY(f32 y) noexcept
sen::util::Vec3< f32 >::ptr
f32 * ptr() noexcept
sen::util::Vec3::operator+=
Vec3 & operator+=(const Vec3 &rhs) noexcept
Binary vector addition.
Definition
vec3.h:278
sen::util::Vec3< f32 >::length
f32 length() const noexcept
sen::util::Vec3::operator-=
Vec3 & operator-=(const Vec3 &rhs) noexcept
Binary vector subtraction.
Definition
vec3.h:293
sen::util::Vec3::operator!=
bool operator!=(const Vec3 &v) const noexcept
Definition
vec3.h:200
sen::util::Vec3< f32 >::getZ
f32 getZ() const noexcept
sen::util::Vec3::operator*=
Vec3 & operator*=(T rhs) noexcept
Unary scalar multiplication.
Definition
vec3.h:248
sen::util::Vec3::operator*
T operator*(const Vec3 &rhs) const noexcept
Point multiplication.
Definition
vec3.h:228
sen::util::Vec3::operator/
Vec3 operator/(T rhs) const noexcept
Division by scalar.
Definition
vec3.h:257
sen::util::Vec3::operator-
Vec3 operator-() const noexcept
Negates the internal elements of the vector.
Definition
vec3.h:302
sen::util::Vec3::Vec3
Vec3() noexcept=default
sen::util::Vec3< f32 >::setZ
void setZ(f32 z) noexcept
sen::util::Vec3::operator^
Vec3 operator^(const Vec3 &rhs) const noexcept
Cross product.
Definition
vec3.h:234
compiler_macros.h
sen::util
Definition
iterator_adapters.h:16
sen::util::Vec3d
Vec3< f64 > Vec3d
Definition
vec3.h:115
sen::util::Vec3f
Vec3< f32 > Vec3f
Definition
vec3.h:114
numbers.h
libs
util
src
dr
vec3.h
Generated by
1.17.0