vec3.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00027 #ifndef MESH3D__VEC3__H
00028 #define MESH3D__VEC3__H
00029
00030 #include <cmath>
00031
00032 namespace mesh3d {
00033
00035 class vec3
00036 {
00037 public:
00038 vec3(float _x = 0, float _y = 0, float _z = 0)
00039 : x(_x)
00040 , y(_y)
00041 , z(_z)
00042 {
00043 }
00044
00045 vec3 operator+(vec3 const &v) const
00046 {
00047 return vec3(x + v.x, y + v.y, z + v.z);
00048 }
00049
00050 vec3 &operator+=(vec3 const &v)
00051 {
00052 x += v.x;
00053 y += v.y;
00054 z += v.z;
00055 return *this;
00056 }
00057
00058 vec3 operator-(vec3 const &v) const
00059 {
00060 return vec3(x - v.x, y - v.y, z - v.z);
00061 }
00062
00063 vec3 &operator-=(vec3 const &v)
00064 {
00065 x -= v.x;
00066 y -= v.y;
00067 z -= v.z;
00068 return *this;
00069 }
00070
00071 bool operator==(vec3 const &v) const
00072 {
00073 return
00074 (x == v.x) &&
00075 (y == v.y) &&
00076 (z == v.z);
00077 }
00078 vec3 operator*(float f) const
00079 {
00080 return vec3(f * x, f * y, f * z);
00081 }
00082
00083 vec3 &operator*=(float f)
00084 {
00085 x *= f;
00086 y *= f;
00087 z *= f;
00088 return *this;
00089 }
00090
00091 vec3 operator/(float f) const
00092 {
00093 float inv = 1.0f / f;
00094 return vec3(x * inv, y * inv, z * inv);
00095 }
00096
00097 vec3 &operator/=(float f)
00098 {
00099 float inv = 1.f / f;
00100 x *= inv;
00101 y *= inv;
00102 z *= inv;
00103 return *this;
00104 }
00105
00106 vec3 operator-() const
00107 {
00108 return vec3(-x, -y, -z);
00109 }
00110
00111 float operator[](int i) const
00112 {
00113 return (&x)[i];
00114 }
00115
00116 float &operator[](int i)
00117 {
00118 return (&x)[i];
00119 }
00120
00121 float length_squared() const { return x * x + y * y + z * z; }
00122 float length() const { return std::sqrt(length_squared()); }
00123
00124 float x;
00125 float y;
00126 float z;
00127 };
00128
00129 inline float dot(vec3 const &v1, vec3 const &v2)
00130 {
00131 return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
00132 }
00133
00134 inline vec3 cross(vec3 const &v1, vec3 const &v2)
00135 {
00136 return vec3(
00137 (v1.y * v2.z) - (v1.z * v2.y),
00138 (v1.z * v2.x) - (v1.x * v2.z),
00139 (v1.x * v2.y) - (v1.y * v2.x)
00140 );
00141 }
00142
00143 inline vec3 normalize(vec3 const &v)
00144 {
00145 return v / v.length();
00146 }
00147
00148 }
00149
00150 #endif
00151