00001 #include "vec3.h"
00002
00003 #include <iostream>
00004
00005 vec3::vec3()
00006 {
00007 v[0] = 0.0f;
00008 v[1] = 0.0f;
00009 v[2] = 0.0f;
00010 }
00011
00012 vec3::vec3(float x, float y, float z)
00013 {
00014 v[0] = x;
00015 v[1] = y;
00016 v[2] = z;
00017 }
00018
00019 vec3::vec3(const float* u)
00020 {
00021 v[0] = u[0];
00022 v[1] = u[1];
00023 v[2] = u[2];
00024 }
00025
00026
00027 vec3::vec3(const vec3& u)
00028 {
00029 v[0] = u.v[0];
00030 v[1] = u.v[1];
00031 v[2] = u.v[2];
00032 }
00033
00034 float& vec3::operator[](unsigned i)
00035 {
00036 return v[i];
00037 }
00038
00039 vec3& vec3::operator=(const vec3& u)
00040 {
00041 if (this != &u)
00042 {
00043 v[0] = u.v[0];
00044 v[1] = u.v[1];
00045 v[2] = u.v[2];
00046 }
00047 return *this;
00048 }
00049
00050 vec3& vec3::operator+=(const vec3& u)
00051 {
00052 v[0] += u.v[0];
00053 v[1] += u.v[1];
00054 v[2] += u.v[2];
00055 return *this;
00056 }
00057
00058 vec3& vec3::operator-=(const vec3& u)
00059 {
00060 v[0] -= u.v[0];
00061 v[1] -= u.v[1];
00062 v[2] -= u.v[2];
00063 return *this;
00064 }
00065
00066 vec3& vec3::operator*=(float t)
00067 {
00068 v[0] *= t;
00069 v[1] *= t;
00070 v[2] *= t;
00071 return *this;
00072 }
00073
00074 vec3& vec3::operator/=(float t)
00075 {
00076 return *this *= (1/t);
00077 }
00078
00079
00080 const vec3 vec3::operator+(const vec3& u) const
00081 {
00082 return vec3(*this) += u;
00083 }
00084
00085 const vec3 vec3::operator-(const vec3& u) const
00086 {
00087 return vec3(*this) -= u;
00088 }
00089
00090 const vec3 vec3::operator*(float t) const
00091 {
00092 return vec3(*this) *= t;
00093 }
00094
00095 const vec3 vec3::operator/(float t) const
00096 {
00097 return vec3(*this) *= (1/t);
00098 }
00099
00100 vec3& vec3::operator-()
00101 {
00102 return (*this) *= -1.0f;
00103 }
00104
00105 inline float vec3::norm() const
00106 {
00107 return v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
00108 }
00109
00110 inline float vec3::length() const
00111 {
00112 return sqrt(norm());
00113 }
00114
00115 vec3& vec3::operator!()
00116 {
00117 return *this /= length();
00118 }
00119
00120 float vec3::dist2(const vec3& u)
00121 {
00122 return (*this - u).norm();
00123 }
00124
00125 float vec3::dist(const vec3& u)
00126 {
00127 return (*this - u).length();
00128 }
00129
00130 inline float vec3::operator*(const vec3& u) const
00131 {
00132 return v[0]*u.v[0] + v[1]*u.v[1] + v[2]*u.v[2];
00133 }
00134
00135 const vec3 vec3::operator^(const vec3& u) const
00136 {
00137 return vec3(v[1]*u.v[2] - v[2]*u.v[1], v[2]*u.v[0] - v[0]*u.v[2], v[0]*u.v[1] - v[1]*u.v[0]);
00138 }
00139
00140 bool vec3::operator==(const vec3 &u) const
00141 {
00142 return (v[0] == u.v[0])&&(v[1] == u.v[1])&&(v[2] == u.v[2]);
00143 }
00144
00145 bool vec3::operator!=(const vec3 &u) const
00146 {
00147 return (v[0] != u.v[0])||(v[1] != u.v[1])||(v[2] != u.v[2]);
00148 }
00149
00150 void vec3::print()
00151 {
00152 std::cout << *this << std::endl;
00153 }
00154
00155 std::ostream& operator<<(std::ostream& os, const vec3& u)
00156 {
00157 os << u.v[0] << ", " << u.v[1] << ", " << u.v[2];
00158 return os;
00159 }