26 #ifndef UTIL_MATH_VECTOR3_INL_H__ 27 #define UTIL_MATH_VECTOR3_INL_H__ 29 #include "util/math/vector3.h" 38 #include "base/integral_types.h" 40 #include "base/type_traits.h" 41 #include "util/math/mathutil.h" 42 #include "util/math/vector2.h" 43 #include "util/math/vector4.h" 45 template <
typename VType>
50 template <
typename VType>
57 template <
typename VType>
64 template <
typename VType>
71 template <
typename VType>
78 template <
typename VType>
template <
typename VType2>
80 return Self(VType(vb[0]),
85 template <
typename VType>
87 return (c_[0] == vb.c_[0]) && (c_[1] == vb.c_[1]) && (c_[2] == vb.c_[2]);
90 template <
typename VType>
92 return (c_[0] != vb.c_[0]) || (c_[1] != vb.c_[1]) || (c_[2] != vb.c_[2]);
95 template <
typename VType>
97 return (fabs(c_[0] - vb.c_[0]) < margin)
98 && (fabs(c_[1] - vb.c_[1]) < margin)
99 && (fabs(c_[2] - vb.c_[2]) < margin);
102 template <
typename VType>
104 if ( c_[0] < vb.c_[0] )
return true;
105 if ( vb.c_[0] < c_[0] )
return false;
106 if ( c_[1] < vb.c_[1] )
return true;
107 if ( vb.c_[1] < c_[1] )
return false;
108 if ( c_[2] < vb.c_[2] )
return true;
112 template <
typename VType>
114 return vb.operator<(*this);
117 template <
typename VType>
119 return !operator>(vb);
122 template <
typename VType>
124 return !operator<(vb);
127 template <
typename VType>
134 template <
typename VType>
142 template <
typename VType>
150 template <
typename VType>
158 template <
typename VType>
166 template <
typename VType>
174 template <
typename VType>
176 return Self(c_[0] * vb.c_[0], c_[1] * vb.c_[1], c_[2] * vb.c_[2]);
179 template <
typename VType>
181 return Self(c_[0] / vb.c_[0], c_[1] / vb.c_[1], c_[2] / vb.c_[2]);
184 template <
typename VType>
186 return Self(*
this) += vb;
189 template <
typename VType>
191 return Self(*
this) -= vb;
194 template <
typename VType>
196 return c_[0]*vb.c_[0] + c_[1]*vb.c_[1] + c_[2]*vb.c_[2];
199 template <
typename VType>
201 return Self(*
this) *= k;
204 template <
typename VType>
206 return Self(*
this) /= k;
209 template <
typename VType>
211 return Self( c_[1] * vb.c_[2] - c_[2] * vb.c_[1],
212 c_[2] * vb.c_[0] - c_[0] * vb.c_[2],
213 c_[0] * vb.c_[1] - c_[1] * vb.c_[0]);
216 template <
typename VType>
223 template <
typename VType>
230 template <
typename VType>
235 template <
typename VType>
240 template <
typename VType>
245 template <
typename VType>
250 template <
typename VType>
255 template <
typename VType>
260 template <
typename VType>
262 return reinterpret_cast<VType*>(c_);
265 template <
typename VType>
267 return reinterpret_cast<const VType*>(c_);
270 template <
typename VType>
272 return c_[0]*c_[0] + c_[1]*c_[1] + c_[2]*c_[2];
275 template <
typename VType>
277 return sqrt(Norm2());
280 template <
typename VType>
282 COMPILE_ASSERT(!std::is_integral<VType>::value, must_be_floating_point);
287 return Self(*
this) *= n;
290 template <
typename VType>
292 int k = LargestAbsComponent() - 1;
296 return (this->CrossProd(temp)).Normalize();
299 template <
typename VType>
302 if (temp[0] > temp[1]) {
303 if (temp[0] > temp[2]) {
309 if (temp[1] > temp[2]) {
317 template <
typename VType>
320 if (c_[temp[0]] > c_[temp[1]]) swap(temp[0], temp[1]);
321 if (c_[temp[1]] > c_[temp[2]]) swap(temp[1], temp[2]);
322 if (c_[temp[0]] > c_[temp[1]]) swap(temp[0], temp[1]);
326 template <
typename VType>
328 return atan2(this->CrossProd(va).Norm(), this->DotProd(va));
331 template <
typename VType>
333 return Self(sqrt(c_[0]), sqrt(c_[1]), sqrt(c_[2]));
336 template <
typename VType>
338 return Self(fabs(c_[0]), fabs(c_[1]), fabs(c_[2]));
341 template <
typename VType>
343 COMPILE_ASSERT(std::is_integral<VType>::value, use_Fabs_for_float_types);
344 COMPILE_ASSERT(static_cast<VType>(-1) == -1, type_must_be_signed);
345 COMPILE_ASSERT(
sizeof(VType) <=
sizeof(
int), Abs_truncates_to_int);
346 return Self(abs(c_[0]), abs(c_[1]), abs(c_[2]));
349 template <
typename VType>
351 return Self(floor(c_[0]), floor(c_[1]), floor(c_[2]));
354 template <
typename VType>
356 return Self(ceil(c_[0]), ceil(c_[1]), ceil(c_[2]));
359 template <
typename VType>
361 return Self(rint(c_[0]), rint(c_[1]), rint(c_[2]));
364 template <
typename VType>
366 return Vector3<int>(lrint(c_[0]), lrint(c_[1]), lrint(c_[2]));
369 template <
typename VType>
371 c_[2] = c_[1] = c_[0] = VType();
374 template <
typename VType>
376 return isnan(c_[0]) || isnan(c_[1]) || isnan(c_[2]);
379 template <
typename VType>
381 return Self(MathUtil::NaN(), MathUtil::NaN(), MathUtil::NaN());
384 template <
typename VType>
389 template <
typename ScalarType,
typename VType>
394 template <
typename ScalarType,
typename VType>
399 template <
typename VType>
406 template <
typename VType>
413 template <
typename VType>
414 std::ostream &operator <<(std::ostream &out,
const Vector3<VType> &va) {
425 PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT(
Vector3);
427 #endif // UTIL_MATH_VECTOR3_INL_H__