Merge remote-tracking branch 'upstream/edge' into upstreamedge
[clinton/Smoothieware.git] / src / libs / Vector3.cpp
CommitLineData
b00bb4b5
MM
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
614b5947 27Vector3 Vector3::cross(const Vector3 vec)
b00bb4b5 28{
614b5947 29 Vector3 out;
b00bb4b5 30
614b5947
MM
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];
b00bb4b5
MM
34
35 return out;
36}
37
614b5947 38float Vector3::dot(const Vector3 vec)
b00bb4b5 39{
614b5947
MM
40 return elem[0] * vec.elem[0] +
41 elem[1] * vec.elem[1] +
42 elem[2] * vec.elem[2];
b00bb4b5
MM
43}
44
45float Vector3::magsq()
46{
47 return powf(elem[0], 2) +
614b5947
MM
48 powf(elem[1], 2) +
49 powf(elem[2], 2);
b00bb4b5
MM
50}
51
52float Vector3::mag()
53{
54 return sqrtf(magsq());
55}
56
614b5947 57Vector3 Vector3::add(const Vector3 vec)
b00bb4b5 58{
614b5947 59 Vector3 out;
b00bb4b5 60
614b5947
MM
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];
b00bb4b5
MM
64
65 return out;
66}
67
614b5947 68Vector3 Vector3::sub(const Vector3 vec)
b00bb4b5 69{
614b5947 70 Vector3 out;
b00bb4b5 71
614b5947
MM
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];
b00bb4b5
MM
75
76 return out;
77}
78
614b5947 79Vector3 Vector3::mul(float scalar)
b00bb4b5 80{
614b5947 81 Vector3 out;
b00bb4b5 82
614b5947
MM
83 out.elem[0] = elem[0] * scalar;
84 out.elem[1] = elem[1] * scalar;
85 out.elem[2] = elem[2] * scalar;
b00bb4b5
MM
86
87 return out;
88}
89
614b5947 90Vector3 Vector3::unit()
b00bb4b5 91{
614b5947 92 Vector3 out;
b00bb4b5
MM
93
94 float denom = mag();
95
614b5947
MM
96 out.elem[0] = elem[0] / denom;
97 out.elem[1] = elem[1] / denom;
98 out.elem[2] = elem[2] / denom;
b00bb4b5
MM
99
100 return out;
101}