34 using container = std::array< float, 4 >;
35 container fields_ = { 0, 0, 0, 1 };
44 constexpr
quaternion(
float x,
float y,
float z,
float w ) noexcept
45 : fields_{ x, y, z, w }
52 fields_[0] = ax[0] * s;
53 fields_[1] = ax[1] * s;
54 fields_[2] = ax[2] * s;
58 [[nodiscard]] constexpr
float operator[]( std::size_t i )
const noexcept
65 return fields_.begin();
75 return fields_.begin();
83 [[nodiscard]] constexpr std::size_t
size()
const
85 return fields_.size();
93 return { -q[0], -q[1], -q[2], q[3] };
98 return { -q[0], -q[1], -q[2], -q[3] };
103 return q[0] * s[0] + q[1] * s[1] + q[2] * s[2] + q[3] * s[3];
114 float d =
dot( m, n );
117 return float{ std::acos( d / s ) * 2.0f };
127 float const d = 1.0f /
std::sin( theta );
128 float const s0 =
std::sin( ( 1.0f -
f ) * theta );
131 if (
dot( q, s ) < 0 )
134 ( q[0] * s0 + m * s[0] * s1 ) * d,
135 ( q[1] * s0 + m * s[1] * s1 ) * d,
136 ( q[2] * s0 + m * s[2] * s1 ) * d,
137 ( q[3] * s0 + m * s[3] * s1 ) * d,
143 return q[0] == s[0] && q[1] == s[1] && q[2] == s[2] && q[3] == s[3];
153 auto iter =
find_if(
range( 4u ), [&]( std::size_t i ) {
157 auto i =
static_cast< std::size_t
>( *iter );
167 q[3] * s[0] + q[0] * s[3] + q[1] * s[2] - q[2] * s[1],
168 q[3] * s[1] + q[1] * s[3] + q[2] * s[0] - q[0] * s[2],
169 q[3] * s[2] + q[2] * s[3] + q[0] * s[1] - q[1] * s[0],
170 q[3] * s[3] - q[0] * s[0] - q[1] * s[1] - q[2] * s[2],
176 return q *
quaternion{ x[0], x[1], x[2], 0.f };
181 return quaternion{ x[0], x[1], x[2], 0.f } * q;
186 return { lh[0] + rh[0], lh[1] + rh[1], lh[2] + rh[2], lh[3] + rh[3] };
191 return all_of( range< std::size_t >( 4 ), [&]( std::size_t i ) {
203 auto d = float(
dot( x, y ) );
206 return { c[0], c[1], c[2], 0.0f };
208 float const s =
std::sqrt( ( 1.0f + d ) * 2.0f );
209 float const rs = 1.0f / s;
211 return { c[0] * rs, c[1] * rs, c[2] * rs, s * 0.f };
API and behavior of this is inspired by tf::Quaternion.
Definition: quaternion.h:33
constexpr const_iterator end() const
Definition: quaternion.h:68
constexpr iterator end()
Definition: quaternion.h:78
constexpr float operator[](std::size_t i) const noexcept
Definition: quaternion.h:58
typename container::const_iterator const_iterator
Definition: quaternion.h:39
constexpr std::size_t size() const
Definition: quaternion.h:83
constexpr iterator begin()
Definition: quaternion.h:73
typename container::iterator iterator
Definition: quaternion.h:40
constexpr quaternion() noexcept=default
constexpr quaternion(vector< 3 > const &ax, float const &a) noexcept
Definition: quaternion.h:49
constexpr const_iterator begin() const
Definition: quaternion.h:63
float value_type
Definition: quaternion.h:38
MIT License.
Definition: impl.h:31
constexpr point< N > point_cast(vector< N > const &v)
Definition: point.h:61
constexpr float angle_shortest_path(quaternion const &m, quaternion const &n)
Definition: quaternion.h:111
constexpr float dot(quaternion const &q, quaternion const &s)
Definition: quaternion.h:101
constexpr float default_epsilon
Definition: algorithm.h:40
constexpr point< N > operator+(point< N > a, vector< N > const &b)
Returns a result of addition a to b, viz += operator.
Definition: point.h:93
constexpr bool all_of(Container &&cont, PredicateCallable &&f=std::identity())
Returns true if call to predicate 'f(x)' returns true for all items in 'cont'.
Definition: algorithm.h:342
constexpr auto sin(quantity< Derived, ValueType > const u)
Returns sinus of the quantity as scalar.
Definition: quantity.h:234
constexpr auto sqrt(physical_quantity< Len, Mass, Time, Current, Temp, Mol, Li, Angle, Byte > val)
Square root of physical quantity is square root of it's value and the exponents are divided in half.
Definition: physical_quantity.h:215
constexpr point< N > operator*(point< N > a, point< N > const &b)
Multiplication of points multiplies each coordinate of A by coordinate of B on same dimension.
Definition: point.h:74
constexpr quaternion neutral_quat
Definition: quaternion.h:89
constexpr float length_of(vec_point_base< Derived, N > const &a)
Returns distance of A from [0,0,0], this is a length of vector represented by A.
Definition: vec_point_base.h:203
constexpr vector< 3 > cross_product(vector< 3 > const &a, vector< 3 > const &b)
Calculates cross product between points A and B.
Definition: vector.h:66
constexpr Derived normalized(vec_point_base< Derived, N > const &a)
Calculates normalized version of A, this means that length(A) equals to 1.
Definition: vec_point_base.h:211
constexpr quaternion slerp(quaternion const &q, quaternion const &s, float f)
Definition: quaternion.h:120
constexpr auto cos(quantity< Derived, ValueType > const u)
Returns cosinus of the quantity as scalar.
Definition: quantity.h:227
constexpr pose inverse(pose const &x)
Definition: pose.h:164
constexpr bool operator<(pose const &x, pose const &y)
Definition: pose.h:85
constexpr vector< N > vector_cast(point< N > const &p)
Definition: point.h:67
constexpr vector< N > operator-(point< N > a, point< N > const &b)
Returns a result of subtraction of A from B, viz -= operator.
Definition: point.h:84
constexpr pose rotate(pose const &x, quaternion const &quat)
Pose X is rotated based on quaternion 'quad'.
Definition: pose.h:176
constexpr view< iterators::numeric_iterator< Numeric > > range(Numeric from, Numeric to)
Builds numeric view over interval [from, to)
Definition: range.h:34
constexpr float norm2_of(quaternion const &q)
Definition: quaternion.h:106
constexpr auto find_if(Container &&cont, PredicateCallable &&f=std::identity())
Returns iterator for first item, for which call to predicate f(*iter) holds true.
Definition: algorithm.h:112
constexpr bool operator!=(pose const &x, pose const &y)
negation of operator== between poses
Definition: pose.h:99
constexpr bool almost_equal(T const &lh, T const &rh, float const eps=default_epsilon)
Two items 'lh' and 'rh' are almost equal if their difference is smaller than value 'eps'.
Definition: algorithm.h:87
UnaryCallable && f
Definition: algorithm.h:161
constexpr quaternion shortest_arc_quat(point< 3 > x, point< 3 > y)
Definition: quaternion.h:196
constexpr bool operator==(pose const &x, pose const &y)
compares poses on their position and orientation
Definition: pose.h:93