Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Vector3.cpp Source File

Vector3.cpp

00001 #include "Vector3.h"
00002 
00003 #include <fastmath.h>
00004 #include <cstddef>
00005 
00006 float Vector3::nan = NAN;
00007 
00008 Vector3::Vector3()
00009 {
00010     elem[0] = elem[1] = elem[2] = 0.0F;
00011 }
00012 
00013 Vector3::Vector3(float a, float b, float c)
00014 {
00015     elem[0] = a;
00016     elem[1] = b;
00017     elem[2] = c;
00018 }
00019 
00020 float& Vector3::operator[](int i)
00021 {
00022     if (i >= 0 && i <= 2)
00023         return elem[i];
00024     return nan;
00025 }
00026 
00027 Vector3 Vector3::cross(const Vector3 vec)
00028 {
00029     Vector3 out;
00030 
00031     out.elem[0] = elem[1] * vec.elem[2] - elem[2] * vec.elem[1];
00032     out.elem[1] = elem[2] * vec.elem[0] - elem[0] * vec.elem[2];
00033     out.elem[2] = elem[0] * vec.elem[1] - elem[1] * vec.elem[0];
00034 
00035     return out;
00036 }
00037 
00038 float Vector3::dot(const Vector3 vec)
00039 {
00040     return  elem[0] * vec.elem[0] +
00041     elem[1] * vec.elem[1] +
00042     elem[2] * vec.elem[2];
00043 }
00044 
00045 float Vector3::magsq()
00046 {
00047     return  powf(elem[0], 2) +
00048     powf(elem[1], 2) +
00049     powf(elem[2], 2);
00050 }
00051 
00052 float Vector3::mag()
00053 {
00054     return sqrtf(magsq());
00055 }
00056 
00057 Vector3 Vector3::add(const Vector3 vec)
00058 {
00059     Vector3 out;
00060 
00061     out.elem[0] = elem[0] + vec.elem[0];
00062     out.elem[1] = elem[1] + vec.elem[1];
00063     out.elem[2] = elem[2] + vec.elem[2];
00064 
00065     return out;
00066 }
00067 
00068 Vector3 Vector3::sub(const Vector3 vec)
00069 {
00070     Vector3 out;
00071 
00072     out.elem[0] = elem[0] - vec.elem[0];
00073     out.elem[1] = elem[1] - vec.elem[1];
00074     out.elem[2] = elem[2] - vec.elem[2];
00075 
00076     return out;
00077 }
00078 
00079 Vector3 Vector3::mul(float scalar)
00080 {
00081     Vector3 out;
00082 
00083     out.elem[0] = elem[0] * scalar;
00084     out.elem[1] = elem[1] * scalar;
00085     out.elem[2] = elem[2] * scalar;
00086 
00087     return out;
00088 }
00089 
00090 Vector3 Vector3::unit()
00091 {
00092     Vector3 out;
00093 
00094     float denom = mag();
00095 
00096     out.elem[0] = elem[0] / denom;
00097     out.elem[1] = elem[1] / denom;
00098     out.elem[2] = elem[2] / denom;
00099 
00100     return out;
00101 }