20 template<std::
floating_po
int T>
27 requires std::is_arithmetic_v<T>
34 requires std::is_arithmetic_v<T>
37 return (a.
w*b.
w + a.
x*b.
x) + (a.
y*b.
y + a.
z*b.
z);
41 requires std::is_arithmetic_v<T>
54 template<std::
floating_po
int T>
59 if (len <=
static_cast<T>(0)) {
68 const T one_over_len =
static_cast<T>(1) / len;
69 return Qua<T>::wxyz(q.
w * one_over_len, q.
x * one_over_len, q.
y * one_over_len, q.
z * one_over_len);
75 const T four_x_squared_minus_1 = m[0][0] - m[1][1] - m[2][2];
76 const T four_y_squared_minus_1 = m[1][1] - m[0][0] - m[2][2];
77 const T four_z_squared_minus_1 = m[2][2] - m[0][0] - m[1][1];
78 const T four_w_squared_minus_1 = m[0][0] + m[1][1] + m[2][2];
80 int biggest_index = 0;
81 T four_biggest_squared_minus_1 = four_w_squared_minus_1;
82 if (four_x_squared_minus_1 > four_biggest_squared_minus_1) {
83 four_biggest_squared_minus_1 = four_x_squared_minus_1;
86 if (four_y_squared_minus_1 > four_biggest_squared_minus_1) {
87 four_biggest_squared_minus_1 = four_y_squared_minus_1;
90 if (four_z_squared_minus_1 > four_biggest_squared_minus_1) {
91 four_biggest_squared_minus_1 = four_z_squared_minus_1;
95 const T biggest_val =
sqrt(four_biggest_squared_minus_1 +
static_cast<T>(1)) *
static_cast<T>(0.5);
96 const T mult =
static_cast<T>(0.25) / biggest_val;
98 switch(biggest_index) {
100 return Qua<T>::wxyz(biggest_val, (m[1][2] - m[2][1]) * mult, (m[2][0] - m[0][2]) * mult, (m[0][1] - m[1][0]) * mult);
102 return Qua<T>::wxyz((m[1][2] - m[2][1]) * mult, biggest_val, (m[0][1] + m[1][0]) * mult, (m[2][0] + m[0][2]) * mult);
104 return Qua<T>::wxyz((m[2][0] - m[0][2]) * mult, (m[0][1] + m[1][0]) * mult, biggest_val, (m[1][2] + m[2][1]) * mult);
106 return Qua<T>::wxyz((m[0][1] - m[1][0]) * mult, (m[2][0] + m[0][2]) * mult, (m[1][2] + m[2][1]) * mult, biggest_val);
121 const T qxx(q.
x * q.
x);
122 const T qyy(q.
y * q.
y);
123 const T qzz(q.
z * q.
z);
124 const T qxz(q.
x * q.
z);
125 const T qxy(q.
x * q.
y);
126 const T qyz(q.
y * q.
z);
127 const T qwx(q.
w * q.
x);
128 const T qwy(q.
w * q.
y);
129 const T qwz(q.
w * q.
z);
133 rv[0][0] =
T(1) -
T(2) * (qyy + qzz);
134 rv[0][1] =
T(2) * (qxy + qwz);
135 rv[0][2] =
T(2) * (qxz - qwy);
137 rv[1][0] =
T(2) * (qxy - qwz);
138 rv[1][1] =
T(1) -
T(2) * (qxx + qzz);
139 rv[1][2] =
T(2) * (qyz + qwx);
141 rv[2][0] =
T(2) * (qxz + qwy);
142 rv[2][1] =
T(2) * (qyz - qwx);
143 rv[2][2] =
T(1) -
T(2) * (qxx + qyy);
166 std::floating_point
T,
167 AngularUnitTraits Units,
168 std::convertible_to<const Vector<T, 3>&> VectorLike
172 const T s =
sin(angle *
static_cast<T>(0.5));
177 std::floating_point
T,
178 AngularUnitTraits Units
189 const T cos_theta =
dot(origin, destination);
190 if (cos_theta >=
static_cast<T>(1) - epsilon_v<T>) {
192 return quaternion_identity<T>();
196 if (cos_theta <
static_cast<T>(-1) + epsilon_v<T>) {
203 if (
length2(rotation_axis) < epsilon_v<T>) {
207 rotation_axis =
normalize(rotation_axis);
212 rotation_axis =
cross(origin, destination);
214 const T s =
sqrt((
T(1) + cos_theta) *
static_cast<T>(2));
215 const T invs =
static_cast<T>(1) / s;
218 s *
static_cast<T>(0.5f),
219 rotation_axis.
x() * invs,
220 rotation_axis.
y() * invs,
221 rotation_axis.
z() * invs
237 const T y =
static_cast<T>(2) * (q.
y * q.
z + q.
w * q.
x);
238 const T x = q.
w * q.
w - q.
x * q.
x - q.
y * q.
y + q.
z * q.
z;
242 return static_cast<T>(2) *
atan2(q.
x, q.
w);
251 return asin(
clamp(
static_cast<T>(-2) * (q.
x * q.
z - q.
w * q.
y),
static_cast<T>(-1),
static_cast<T>(1)));
257 const T y =
static_cast<T>(2) * (q.
x * q.
y + q.
w * q.
z);
258 const T x = q.
w * q.
w + q.
x * q.
x - q.
y * q.
y - q.
z * q.
z;
Definition coordinate_direction.h:16
constexpr Vector< T, 3 > direction_vector() const
Definition coordinate_direction.h:90
constexpr reference x()
Returns (*this)[0]
Definition vector.h:157
constexpr reference z()
Returns (*this)[2]
Definition vector.h:167
constexpr reference y()
Returns (*this)[1]
Definition vector.h:162
Definition custom_decoration_generator.h:5
bool equal_within_epsilon(T x, T y)
Definition common_functions.h:265
RadiansT< T > pitch(const Qua< T > &q)
Definition quaternion_functions.h:235
constexpr Angle< Rep, Units > clamp(const Angle< Rep, Units > &v, const AngleMin &min, const AngleMax &max)
Definition angle.h:320
Qua< T > quaternion_from_xyz(const Vector< T, 3 > &x, const Vector< T, 3 > &y, const Vector< T, 3 > &z)
Definition quaternion_functions.h:226
GenType cos(GenType v)
Definition trigonometric_functions.h:37
RadiansT< T > roll(const Qua< T > &q)
Definition quaternion_functions.h:255
constexpr Matrix< T, 4, 4 > matrix4x4_cast(const Qua< T > &q)
Definition quaternion_functions.h:149
T length(const Vector< T, N > &v)
Definition geometric_functions.h:62
Qua< T > quaternion_cast(const Matrix< T, 3, 3 > &m)
Definition quaternion_functions.h:73
Vector< RadiansT< T >, 3 > to_euler_angles(const Qua< T > &x)
Definition quaternion_functions.h:269
constexpr T dot(T x, T y)
Definition geometric_functions.h:31
constexpr Matrix< T, 3, 3 > matrix3x3_cast(const Qua< T > &q)
Definition quaternion_functions.h:119
constexpr T length2(const Vector< T, N > &v)
Definition geometric_functions.h:69
Qua< T > rotation(const Vector< T, 3 > &origin, const Vector< T, 3 > &destination)
Definition quaternion_functions.h:187
RadiansT< T > yaw(const Qua< T > &q)
Definition quaternion_functions.h:249
GenType sin(GenType v)
Definition trigonometric_functions.h:13
constexpr Qua< T > quaternion_identity()
Definition quaternion_functions.h:155
T inverse(const Matrix< T, 3, 3 > &m)
Definition matrix_functions.h:158
constexpr Qua< T > conjugate(const Qua< T > &q)
Definition quaternion_functions.h:28
constexpr bool all_of(const Vector< bool, N > &v)
Definition functors.h:48
Vector< T, N > normalize(const Vector< T, N > &v)
Definition geometric_functions.h:76
bool isnan(T num)
Definition common_functions.h:319
Qua< T > angle_axis(Angle< T, Units > angle, VectorLike &&axis)
Definition quaternion_functions.h:170
RadiansT< Rep > atan2(Rep x, Rep y)
Definition trigonometric_functions.h:103
T sqrt(T num)
Definition geometric_functions.h:16
RadiansT< Rep > asin(Rep num)
Definition trigonometric_functions.h:97
constexpr CoordinateDirection cross(CoordinateDirection x, CoordinateDirection y)
Definition coordinate_direction.h:124
static constexpr Qua< T > wxyz(T w, T x, T y, T z)
Definition qua.h:34