Merge remote-tracking branch 'upstream/edge' into upstream-master
[clinton/Smoothieware.git] / src / libs / Vector3.cpp
1 #include "Vector3.h"
2
3 #include <fastmath.h>
4 #include <cstddef>
5
6 float Vector3::operator[](int i) const
7 {
8 if (i >= 0 && i <= 2)
9 return elem[i];
10 return NAN;
11 }
12
13 Vector3 Vector3::cross(const Vector3 &vec) const
14 {
15 Vector3 out;
16
17 out.elem[0] = elem[1] * vec.elem[2] - elem[2] * vec.elem[1];
18 out.elem[1] = elem[2] * vec.elem[0] - elem[0] * vec.elem[2];
19 out.elem[2] = elem[0] * vec.elem[1] - elem[1] * vec.elem[0];
20
21 return out;
22 }
23
24 float Vector3::dot(const Vector3 &vec) const
25 {
26 return elem[0] * vec.elem[0] +
27 elem[1] * vec.elem[1] +
28 elem[2] * vec.elem[2];
29 }
30
31 float Vector3::magsq() const
32 {
33 return powf(elem[0], 2) +
34 powf(elem[1], 2) +
35 powf(elem[2], 2);
36 }
37
38 float Vector3::mag() const
39 {
40 return sqrtf(magsq());
41 }
42
43 Vector3 Vector3::add(const Vector3 &vec) const
44 {
45 Vector3 out;
46
47 out.elem[0] = elem[0] + vec.elem[0];
48 out.elem[1] = elem[1] + vec.elem[1];
49 out.elem[2] = elem[2] + vec.elem[2];
50
51 return out;
52 }
53
54 Vector3 Vector3::sub(const Vector3 &vec) const
55 {
56 Vector3 out;
57
58 out.elem[0] = elem[0] - vec.elem[0];
59 out.elem[1] = elem[1] - vec.elem[1];
60 out.elem[2] = elem[2] - vec.elem[2];
61
62 return out;
63 }
64
65 Vector3 Vector3::mul(float scalar) const
66 {
67 Vector3 out;
68
69 out.elem[0] = elem[0] * scalar;
70 out.elem[1] = elem[1] * scalar;
71 out.elem[2] = elem[2] * scalar;
72
73 return out;
74 }
75
76 Vector3 Vector3::unit() const
77 {
78 Vector3 out;
79
80 float denom = mag();
81
82 out.elem[0] = elem[0] / denom;
83 out.elem[1] = elem[1] / denom;
84 out.elem[2] = elem[2] / denom;
85
86 return out;
87 }