enabled specifying numeric config values using all strtof capabilities
[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 float& Vector3::operator[](int i)
21 {
22 if (i >= 0 && i <= 2)
23 return elem[i];
24 return nan;
25 }
26
27 Vector3 Vector3::cross(const Vector3 vec)
28 {
29 Vector3 out;
30
31 out.elem[0] = elem[1] * vec.elem[2] - elem[2] * vec.elem[1];
32 out.elem[1] = elem[2] * vec.elem[0] - elem[0] * vec.elem[2];
33 out.elem[2] = elem[0] * vec.elem[1] - elem[1] * vec.elem[0];
34
35 return out;
36 }
37
38 float Vector3::dot(const Vector3 vec)
39 {
40 return elem[0] * vec.elem[0] +
41 elem[1] * vec.elem[1] +
42 elem[2] * vec.elem[2];
43 }
44
45 float Vector3::magsq()
46 {
47 return powf(elem[0], 2) +
48 powf(elem[1], 2) +
49 powf(elem[2], 2);
50 }
51
52 float Vector3::mag()
53 {
54 return sqrtf(magsq());
55 }
56
57 Vector3 Vector3::add(const Vector3 vec)
58 {
59 Vector3 out;
60
61 out.elem[0] = elem[0] + vec.elem[0];
62 out.elem[1] = elem[1] + vec.elem[1];
63 out.elem[2] = elem[2] + vec.elem[2];
64
65 return out;
66 }
67
68 Vector3 Vector3::sub(const Vector3 vec)
69 {
70 Vector3 out;
71
72 out.elem[0] = elem[0] - vec.elem[0];
73 out.elem[1] = elem[1] - vec.elem[1];
74 out.elem[2] = elem[2] - vec.elem[2];
75
76 return out;
77 }
78
79 Vector3 Vector3::mul(float scalar)
80 {
81 Vector3 out;
82
83 out.elem[0] = elem[0] * scalar;
84 out.elem[1] = elem[1] * scalar;
85 out.elem[2] = elem[2] * scalar;
86
87 return out;
88 }
89
90 Vector3 Vector3::unit()
91 {
92 Vector3 out;
93
94 float denom = mag();
95
96 out.elem[0] = elem[0] / denom;
97 out.elem[1] = elem[1] / denom;
98 out.elem[2] = elem[2] / denom;
99
100 return out;
101 }