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)) );