53 vec3 vec3::zero(0,0,0);
    54 vec3 vec3::unitX(1,0,0);
    55 vec3 vec3::unitY(0,1,0);
    56 vec3 vec3::unitZ(0,0,1);
    58 vec3::vec3() : x(0), y(0), z(0)
    63 vec3::vec3(
double x, 
double  y, 
double z) : x(x), y(y), z(z)
    68 vec3::vec3(
const vec3 &x) : x(x.x), y(x.y), z(x.z)
    72 bool vec3::operator!=(
const vec3 &a)
 const    82 bool vec3::operator==(
const vec3 &a)
 const    84     return(this->x == a.x &&
    89 bool vec3::operator<=(
const vec3 &a)
 const    91     return ((this->x <= a.x) &&
    96 bool vec3::operator>=(
const vec3 &a)
 const    98     return ((this->x >= a.x) &&
   103 bool vec3::operator<(
const vec3 &a)
 const   105     return ((this->x < a.x) &&
   110 bool vec3::operator>(
const vec3 &a)
 const   112     return ((this->x > a.x) &&
   118 vec3& vec3::operator=(
const vec3 &a)
   127 vec3& vec3::operator+=(
const vec3 &a)
   136 vec3& vec3::operator*=(
double c)
   145 vec3& vec3::operator/=(
double c)
   153 double& vec3::operator[](
const size_t idx)
   157         case 0: 
return this->x;
   158         case 1: 
return this->y;
   159         case 2: 
return this->z;
   165 double vec3::operator[](
const size_t idx)
 const   169         case 0: 
return this->x;
   170         case 1: 
return this->y;
   171         case 2: 
return this->z;
   176 double vec3::dot(
const vec3 &b)
 const   178     return this->x*b.x + this->y*b.y + this->z*b.z;
   181 vec3 vec3::cross(
const vec3 &b)
   183     return vec3(this->y*b.z - this->z*b.y, this->z*b.x - this->x*b.z, this->x*b.y - this->y*b.x);
   186 vec3 cross(
const vec3 &a, 
const vec3 &b)
   188     return vec3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x);
   191 double dot(
const vec3 &a, 
const vec3 &b)
   193     return a.x*b.x + a.y*b.y + a.z*b.z;
   196 double L1(
const vec3 &a)
   198      return a.x + a.y + a.z;
   201 double L2(
const vec3 &a)
   203      return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
   206 double length(
const vec3 &a)
   208     return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
   213 vec3 normalize(
const vec3 &v1)
   215     return v1 / length(v1);
   218 double vec2polar(
const vec3 &a)
   222             return atan(a.y / a.x);
   224             return atan(a.y / a.x) + 2*PI;
   227         return atan(a.y/a.x) + PI;
   239 vec3 operator+(
const vec3 &a, 
const vec3 &b)
   241     return vec3(a.x+b.x, a.y+b.y, a.z+b.z);
   244 vec3 operator-(
const vec3 &a, 
const vec3 &b)
   246     return vec3(a.x-b.x, a.y-b.y, a.z-b.z);
   249 vec3 operator*(
const vec3 &a, 
double s)
   251     return vec3(s*a.x, s*a.y, s*a.z);
   254 vec3 operator*(
double s, 
const vec3 &a)
   256     return vec3(s*a.x, s*a.y, s*a.z);
   259 vec3 operator/(
const vec3 &a, 
double s)
   261     return vec3(a.x/s, a.y/s, a.z/s);
   264 std::ostream &operator<<(std::ostream &stream, 
const vec3 &v)
   266     stream << std::fixed;
   268     return stream << std::setprecision(3) << v.x << 
" " << v.y << 
" " << v.z;
   271 double clamp(
double value, 
double min, 
double max)
   281 int clamp(
int value, 
int min, 
int max)
   291 std::string vec3::toString()
 const   293     std::stringstream ss;
   294     ss << 
"[" << std::setprecision(5) << this->x << 
", " << this->y << 
", " << this->z << 
"]";
   299 vec3 vec3::min(
const vec3 &a, 
const vec3 &b)
   301     return vec3((a.x < b.x) ? a.x : b.x,
   302                 (a.y < b.y) ? a.y : b.y,
   303                 (a.z < b.z) ? a.z : b.z);
   306 vec3 vec3::max(
const vec3 &a, 
const vec3 &b)
   308     return vec3((a.x > b.x) ? a.x : b.x,
   309                 (a.y > b.y) ? a.y : b.y,
   310                 (a.z > b.z) ? a.z : b.z);
   313 double angleBetween(
const vec3 &a, 
const vec3 &b)
   315     return acos( dot(a,b) / (L2(a)*L2(b)) );