Merge remote-tracking branch 'upstream/edge' into upstreamedge
[clinton/Smoothieware.git] / src / libs / Vector3.cpp
... / ...
CommitLineData
1#include "Vector3.h"
2
3#include <fastmath.h>
4#include <cstddef>
5
6float Vector3::nan = NAN;
7
8Vector3::Vector3()
9{
10 elem[0] = elem[1] = elem[2] = 0.0F;
11}
12
13Vector3::Vector3(float a, float b, float c)
14{
15 elem[0] = a;
16 elem[1] = b;
17 elem[2] = c;
18}
19
20float& Vector3::operator[](int i)
21{
22 if (i >= 0 && i <= 2)
23 return elem[i];
24 return nan;
25}
26
27Vector3 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
38float 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
45float Vector3::magsq()
46{
47 return powf(elem[0], 2) +
48 powf(elem[1], 2) +
49 powf(elem[2], 2);
50}
51
52float Vector3::mag()
53{
54 return sqrtf(magsq());
55}
56
57Vector3 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
68Vector3 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
79Vector3 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
90Vector3 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}