Switched to deque to avoid invalid iterator
[clinton/Smoothieware.git] / src / libs / Vector3.cpp
1 #include "Vector3.h"
2
3 #include <fastmath.h>
4 #include <cstddef>
5
6 float Vector3::nan = NAN;
7
8 Vector3::Vector3()
9 {
10 elem[0] = elem[1] = elem[2] = 0.0F;
11 }
12
13 Vector3::Vector3(float a, float b, float c)
14 {
15 elem[0] = a;
16 elem[1] = b;
17 elem[2] = c;
18 }
19
20 Vector3::Vector3(const Vector3 &to_copy)
21 {
22 elem[0] = to_copy.elem[0];
23 elem[1] = to_copy.elem[1];
24 elem[2] = to_copy.elem[2];
25 }
26
27 Vector3& Vector3::operator= (const Vector3 &to_copy)
28 {
29 if( this != &to_copy ) {
30 elem[0] = to_copy.elem[0];
31 elem[1] = to_copy.elem[1];
32 elem[2] = to_copy.elem[2];
33 }
34 return *this;
35 }
36
37 float Vector3::operator[](int i) const
38 {
39 if (i >= 0 && i <= 2)
40 return elem[i];
41 return nan;
42 }
43
44 void Vector3::set(float a, float b, float c)
45 {
46 elem[0] = a;
47 elem[1] = b;
48 elem[2] = c;
49 }
50
51 Vector3 Vector3::cross(const Vector3 &vec) const
52 {
53 Vector3 out;
54
55 out.elem[0] = elem[1] * vec.elem[2] - elem[2] * vec.elem[1];
56 out.elem[1] = elem[2] * vec.elem[0] - elem[0] * vec.elem[2];
57 out.elem[2] = elem[0] * vec.elem[1] - elem[1] * vec.elem[0];
58
59 return out;
60 }
61
62 float Vector3::dot(const Vector3 &vec) const
63 {
64 return elem[0] * vec.elem[0] +
65 elem[1] * vec.elem[1] +
66 elem[2] * vec.elem[2];
67 }
68
69 float Vector3::magsq() const
70 {
71 return powf(elem[0], 2) +
72 powf(elem[1], 2) +
73 powf(elem[2], 2);
74 }
75
76 float Vector3::mag() const
77 {
78 return sqrtf(magsq());
79 }
80
81 Vector3 Vector3::add(const Vector3 &vec) const
82 {
83 Vector3 out;
84
85 out.elem[0] = elem[0] + vec.elem[0];
86 out.elem[1] = elem[1] + vec.elem[1];
87 out.elem[2] = elem[2] + vec.elem[2];
88
89 return out;
90 }
91
92 Vector3 Vector3::sub(const Vector3 &vec) const
93 {
94 Vector3 out;
95
96 out.elem[0] = elem[0] - vec.elem[0];
97 out.elem[1] = elem[1] - vec.elem[1];
98 out.elem[2] = elem[2] - vec.elem[2];
99
100 return out;
101 }
102
103 Vector3 Vector3::mul(float scalar) const
104 {
105 Vector3 out;
106
107 out.elem[0] = elem[0] * scalar;
108 out.elem[1] = elem[1] * scalar;
109 out.elem[2] = elem[2] * scalar;
110
111 return out;
112 }
113
114 Vector3 Vector3::mul(const Vector3& v) const
115 {
116 Vector3 out;
117
118 out.elem[0] = elem[0] * v[0];
119 out.elem[1] = elem[1] * v[1];
120 out.elem[2] = elem[2] * v[2];
121
122 return out;
123 }
124
125 Vector3 Vector3::unit() const
126 {
127 Vector3 out;
128
129 float denom = mag();
130
131 out.elem[0] = elem[0] / denom;
132 out.elem[1] = elem[1] / denom;
133 out.elem[2] = elem[2] / denom;
134
135 return out;
136 }