17#ifndef GZ_MATH_VECTOR3_HH_
18#define GZ_MATH_VECTOR3_HH_
27#include <gz/math/config.hh>
34 inline namespace GZ_MATH_VERSION_NAMESPACE {
71 public:
constexpr Vector3(
const T &_x,
const T &_y,
const T &_z)
87 return this->data[0] + this->data[1] + this->data[2];
95 return static_cast<T
>(sqrt(
96 (this->data[0]-_pt[0])*(this->data[0]-_pt[0]) +
97 (this->data[1]-_pt[1])*(this->data[1]-_pt[1]) +
98 (this->data[2]-_pt[2])*(this->data[2]-_pt[2])));
108 return this->Distance(
Vector3(_x, _y, _z));
115 return static_cast<T
>(sqrt(this->SquaredLength()));
123 this->data[0] * this->data[0] +
124 this->data[1] * this->data[1] +
125 this->data[2] * this->data[2];
132 T d = this->Length();
134 if (!equal<T>(d,
static_cast<T
>(0.0)))
176 public:
inline void Set(T _x = 0, T _y = 0, T _z = 0)
188 return Vector3(this->data[1] * _v[2] - this->data[2] * _v[1],
189 this->data[2] * _v[0] - this->data[0] * _v[2],
190 this->data[0] * _v[1] - this->data[1] * _v[0]);
198 return this->data[0] * _v[0] +
199 this->data[1] * _v[1] +
200 this->data[2] * _v[2];
213 return std::abs(this->data[0] * _v[0]) +
214 std::abs(this->data[1] * _v[1]) +
215 std::abs(this->data[2] * _v[2]);
222 return Vector3(std::abs(this->data[0]),
223 std::abs(this->data[1]),
224 std::abs(this->data[2]));
231 static const T sqrZero =
static_cast<T
>(1e-06 * 1e-06);
238 perp = this->Cross(
Vector3(0, 1, 0));
264 T d = ((*this) - _pt1).Cross((*
this) - _pt2).Length();
265 d = d / (_pt2 - _pt1).Length();
274 if (_v[0] > this->data[0])
275 this->data[0] = _v[0];
276 if (_v[1] > this->data[1])
277 this->data[1] = _v[1];
278 if (_v[2] > this->data[2])
279 this->data[2] = _v[2];
287 if (_v[0] < this->data[0])
288 this->data[0] = _v[0];
289 if (_v[1] < this->data[1])
290 this->data[1] = _v[1];
291 if (_v[2] < this->data[2])
292 this->data[2] = _v[2];
313 T max =
std::max(std::abs(this->data[0]), std::abs(this->data[1]));
314 max =
std::max(max, std::abs(this->data[2]));
322 T min =
std::min(std::abs(this->data[0]), std::abs(this->data[1]));
323 min =
std::min(min, std::abs(this->data[2]));
349 return Vector3(this->data[0] + _v[0],
350 this->data[1] + _v[1],
351 this->data[2] + _v[2]);
359 this->data[0] += _v[0];
360 this->data[1] += _v[1];
361 this->data[2] += _v[2];
383 return {_v.
X() + _s, _v.
Y() + _s, _v.
Z() + _s};
402 return Vector3(-this->data[0], -this->data[1], -this->data[2]);
410 return Vector3(this->data[0] - _pt[0],
411 this->data[1] - _pt[1],
412 this->data[2] - _pt[2]);
420 this->data[0] -= _pt[0];
421 this->data[1] -= _pt[1];
422 this->data[2] -= _pt[2];
444 return {_s - _v.
X(), _s - _v.
Y(), _s - _v.
Z()};
465 return Vector3(this->data[0] / _pt[0],
466 this->data[1] / _pt[1],
467 this->data[2] / _pt[2]);
476 this->data[0] /= _pt[0];
477 this->data[1] /= _pt[1];
478 this->data[2] /= _pt[2];
489 return Vector3(this->data[0] / _v,
513 return Vector3(this->data[0] * _p[0],
514 this->data[1] * _p[1],
515 this->data[2] * _p[2]);
524 this->data[0] *= _v[0];
525 this->data[1] *= _v[1];
526 this->data[2] *= _v[2];
547 return {_v.
X() * _s, _v.
Y() * _s, _v.
Z() * _s};
569 return equal<T>(this->data[0], _v[0], _tol)
570 && equal<T>(this->data[1], _v[1], _tol)
571 && equal<T>(this->data[2], _v[2], _tol);
580 return this->Equal(_v,
static_cast<T
>(1e-3));
589 return !(*
this == _v);
622 return this->data[
clamp(_index, GZ_ZERO_SIZE_T, GZ_TWO_SIZE_T)];
631 return this->data[
clamp(_index, GZ_ZERO_SIZE_T, GZ_TWO_SIZE_T)];
638 this->data[0] =
precision(this->data[0], _precision);
639 this->data[1] =
precision(this->data[1], _precision);
640 this->data[2] =
precision(this->data[2], _precision);
649 return equal<T>(this->data[0], _v[0]) &&
650 equal<T>(this->data[1], _v[1]) &&
651 equal<T>(this->data[2], _v[2]);
656 public:
inline T
X()
const
658 return this->data[0];
663 public:
inline T
Y()
const
665 return this->data[1];
670 public:
inline T
Z()
const
672 return this->data[2];
677 public:
inline T &
X()
679 return this->data[0];
684 public:
inline T &
Y()
686 return this->data[1];
691 public:
inline T &
Z()
693 return this->data[2];
698 public:
inline void X(
const T &_v)
705 public:
inline void Y(
const T &_v)
712 public:
inline void Z(
const T &_v)
723 return this->data[0] < _pt[0] || this->data[1] < _pt[1] ||
724 this->data[2] < _pt[2];
734 for (
auto i : {0, 1, 2})
753 _in.
setf(std::ios_base::skipws);
770 constexpr Vector3<T> gVector3Zero(0, 0, 0);
772 constexpr Vector3<T> gVector3One(1, 1, 1);
774 constexpr Vector3<T> gVector3UnitX(1, 0, 0);
776 constexpr Vector3<T> gVector3UnitY(0, 1, 0);
778 constexpr Vector3<T> gVector3UnitZ(0, 0, 1);
780 constexpr Vector3<T> gVector3NaN(
787 const Vector3<T> &Vector3<T>::Zero = detail::gVector3Zero<T>;
789 const Vector3<T> &Vector3<T>::One = detail::gVector3One<T>;
791 const Vector3<T> &Vector3<T>::UnitX = detail::gVector3UnitX<T>;
793 const Vector3<T> &Vector3<T>::UnitY = detail::gVector3UnitY<T>;
795 const Vector3<T> &Vector3<T>::UnitZ = detail::gVector3UnitZ<T>;
797 const Vector3<T> &Vector3<T>::NaN = detail::gVector3NaN<T>;