41 #include <mt/util/assert/assert_template.h>
105 explicit Vector3(
const Scalar* v);
142 bool operator!=(
const Vector3& v)
const;
202 Scalar&
at(
size_t n);
205 const Scalar&
at(
size_t n)
const;
250 Vector3 operator*(
const Scalar& s,
259 std::ostream& operator<<(std::ostream& os,
266 Scalar length2(
const Vector3& v);
269 Scalar length(
const Vector3& v);
275 Scalar distance2(
const Vector3& v1,
279 Scalar distance(
const Vector3& v1,
283 Scalar angleCos(
const Vector3& v1,
287 Scalar angleSin(
const Vector3& v1,
291 Scalar angle(
const Vector3& v1,
306 Scalar triple(
const Vector3& v1,
365 inline Vector3& Vector3::operator-=(
const Vector3& v)
412 if (this->
length2() == Scalar(0.0) ||
415 return (
distance(v) == Scalar(0.0));
419 return (
distance(v) == Scalar(0.0)) && (
angle(v) == Scalar(0.0));
424 inline bool Vector3::operator!=(
const Vector3& v)
const
426 return !(*
this == v);
434 return (m_co[0] + m_co[1] + m_co[2]);
440 return (m_co[0] * v[0]) + (m_co[1] * v[1]) + (m_co[2] * v[2]);
446 return Vector3(m_co[1] * v[2] - m_co[2] * v[1],
447 m_co[2] * v[0] - m_co[0] * v[2],
448 m_co[0] * v[1] - m_co[1] * v[0]);
475 const Scalar d2 = diff.
length2();
484 const Scalar d = diff.
length();
491 const Scalar num(
dot(v));
494 #ifdef MT_USE_BASIC_SCALAR
495 util::Assert((den != Scalar(0.0)),
496 Exception(
"Angles with respect to the null vector are undefined."));
499 Scalar ang_cos(num / den);
507 const Scalar num(cross.
length());
510 Scalar ang_sin(num / den);
518 return acos(ang_cos);
524 return m_co[0] < m_co[1] ? (m_co[0] < m_co[2] ? 0 : 2)
525 : (m_co[1] < m_co[2] ? 1 : 2);
531 return m_co[0] < m_co[1] ? (m_co[1] < m_co[2] ? 2 : 1)
532 : (m_co[0] < m_co[2] ? 2 : 0);
538 return abs(*this).minAxis();
544 return abs(*this).maxAxis();
566 util::Assert(n < 3, std::range_error(
"Index out of range"));
573 util::Assert(n < 3, std::range_error(
"Index out of range"));
606 inline Vector3 operator-(
const Vector3& v)
608 const Vector3 v1(-v[0],
615 inline Vector3 operator+(
const Vector3& v1,
623 inline Vector3 operator-(
const Vector3& v1,
631 inline Vector3 operator*(
const Vector3& v1,
639 inline Vector3 operator/(
const Vector3& v1,
647 inline Vector3 operator*(
const Scalar& s,
655 inline Vector3 operator*(
const Vector3& v,
663 inline Vector3 operator/(
const Vector3& v,
671 inline std::ostream& operator<<(std::ostream& os,
674 return os <<
'[' << v[0] <<
' '
682 inline Scalar length2(
const Vector3& v)
688 inline Scalar length(
const Vector3& v)
694 inline Vector3 normalize(
const Vector3& v)
702 inline Scalar distance2(
const Vector3& v1,
705 return v1.distance2(v2);
709 inline Scalar distance(
const Vector3& v1,
712 return v1.distance(v2);
716 inline Scalar angleCos(
const Vector3& v1,
719 return v1.angleCos(v2);
723 inline Scalar angleSin(
const Vector3& v1,
726 return v1.angleSin(v2);
730 inline Scalar angle(
const Vector3& v1,
737 inline Vector3 abs(
const Vector3& v)
740 v_abs[0] = abs(v_abs[0]);
741 v_abs[1] = abs(v_abs[1]);
742 v_abs[2] = abs(v_abs[2]);
747 inline Scalar dot(
const Vector3& v1,
754 inline Vector3 cross(
const Vector3& v1,
757 const Vector3 v_cross(v1.cross(v2));
762 inline Scalar triple(
const Vector3& v1,
766 return v1[0] * (v2[1] * v3[2] - v2[2] * v3[1]) +
767 v1[1] * (v2[2] * v3[0] - v2[0] * v3[2]) +
768 v1[2] * (v2[0] * v3[1] - v2[1] * v3[0]);
772 inline Vector3 lerp(
const Vector3& v1,
776 const Vector3 v_in(v1[0] + (v2[0] - v1[0]) * s,
777 v1[1] + (v2[1] - v1[1]) * s,
778 v1[2] + (v2[2] - v1[2]) * s);
785 #endif // MT_VECTOR3_H