Itasca C++ Interface
Loading...
Searching...
No Matches
quat.h
Go to the documentation of this file.
1#pragma once
8#include "avect.h"
9#include "matrix.h"
10#include "vect.h"
11#include <cmath>
12#include <cassert>
13
20class Quat2 {
21public:
23 Quat2(): ang_(0) { }
25 Quat2(const double &a): ang_(a) { }
27 ~Quat2() { }
29 Quat2(const Quat2 &q): ang_(q.ang_) { }
31 constexpr Quat2 &operator=(const Quat2 &in) { ang_ = in.ang_; return *this; }
32 constexpr auto operator<=>(const Quat2 &in) const { return ang_ <=> in.ang_; }
33
35 void setQuat(const double &a){ ang_ = a; }
36
38 const double &ang() const { return ang_; }
39
41 double &rang() { return ang_; }
42
44 void reset() { ang_=0.0; }
46 void ident() { ang_ = 0.0; }
48 static BASE_EXPORT Quat2 identity() { Quat2 ret(0.0); return ret;}
49
53 static BASE_EXPORT Quat2 fromVect(const DVect2 &v);
58 BASE_EXPORT void fromAxisAngle(const DVect2 &,const double &);
59 BASE_EXPORT void fromEuler(const DAVect2 &v) { *this = Quat2(v.z()) * dDegrad; }
60 BASE_EXPORT void fromEulerZXZ(const DAVect2& v) { *this = Quat2(v.z()) * dDegrad; }
62 BASE_EXPORT void incrementAxisAngle(const DVect2 &,const double &);
64 BASE_EXPORT void spinAboutZ(const double &);
66 BASE_EXPORT DVect2 rotate(const DVect2 &v) const;
69 BASE_EXPORT void fromUnitAxes(const DVect2 &,const DVect2 &);
71 BASE_EXPORT void increment(const DAVect2 &);
72
74 void conj() { ang_*=-1; }
76 Quat2 getConj() const { Quat2 q(-ang_); return q; }
78 void normalize() { }
79
81 Quat2 operator *(const double &d) const { Quat2 q(ang_*d); return q; }
83 Quat2 operator /(const double &d) const { Quat2 q(ang_/d); return q; }
85 friend Quat2 operator *(const double &d,const Quat2 &p2) { Quat2 q(p2*d); return q;}
88 Quat2 operator *(const Quat2 &v) const { Quat2 q(ang_+v.ang_); return q; }
90 Quat2 operator +(const Quat2 &v) const { Quat2 q(ang_+v.ang_); return q; }
91
93 const Quat2 & operator *=(const double &d) { ang_ *= d; return *this; }
95 const Quat2 & operator /=(const double &d) { ang_ /= d; return *this; }
98 const Quat2 & operator *=(const Quat2 &v) { ang_ += v.ang_; return *this; }
101 const Quat2 & operator +=(const Quat2 &v) { ang_ += v.ang_; return *this; }
103 bool operator ==(const Quat2 &v) const { return (ang_ == v.ang_); }
104
105private:
106 double ang_; //the angle of rotation
107};
108
111class Quat3 {
112public:
114 Quat3(): w_(0), i_(0), j_(0), k_(0) { }
117 Quat3(const double &w1,const double &x,const double &y,const double &z) { w_ = w1; i_ = x; j_ = y; k_ = z; }
119 ~Quat3() { }
121 Quat3(const Quat3 &q) { w_ = q.w_; i_ = q.i_; j_ = q.j_; k_ = q.k_; }
122 inline constexpr std::partial_ordering operator<=>(const Quat3 &in) const;
124 constexpr const Quat3 &operator=(const Quat3 &q) { w_ = q.w_; i_ = q.i_; j_ = q.j_; k_ = q.k_; return *this; }
126 void setQuat(const double &w1,const double &x,const double &y,const double &z){ w_ = w1; i_ = x; j_ = y; k_ = z; }
127
129 const double &w() const { return w_; }
131 const double &i() const { return i_; }
133 const double &j() const { return j_; }
135 const double &k() const { return k_; }
136
138 double &rw() { return w_; }
140 double &ri() { return i_; }
142 double &rj() { return j_; }
144 double &rk() { return k_; }
145
147 void reset() { w_=0.0; i_=0.0; j_=0.0; k_=0.0; }
149 void ident() { w_=1.0; i_=0.0; j_=0.0; k_=0.0; }
151 static BASE_EXPORT Quat3 identity() { Quat3 ret(1.0,0.0,0.0,0.0); return ret;}
153 BASE_EXPORT bool isNull() const { return (abs(w_) > std::numeric_limits<double>::epsilon() || abs(i_) > std::numeric_limits<double>::epsilon() || abs(j_) > std::numeric_limits<double>::epsilon() || abs(k_) > std::numeric_limits<double>::epsilon()) ? false : true; }
157 BASE_EXPORT DVect3 quatToAAngle() const;
159 static BASE_EXPORT Quat3 fromVect(const DVect3 &v);
161 BASE_EXPORT void fromMatrix(const DMatrix<3,3> &);
163 BASE_EXPORT void fromAxisAngle(const DVect3 &,const double &);
166 BASE_EXPORT void fromEuler(const DVect3 &);
169 BASE_EXPORT void fromEulerZXZ(const DVect3 &);
171 BASE_EXPORT void incrementAxisAngle(const DVect3 &,const double &);
173 BASE_EXPORT void spinAboutX(const double &);
175 BASE_EXPORT void spinAboutY(const double &);
177 BASE_EXPORT void spinAboutZ(const double &);
179 BASE_EXPORT DVect3 rotate(const DVect3 &v) const;
181 BASE_EXPORT DVect3 real() const { return DVect3(i_,j_,k_); }
182
184 BASE_EXPORT void fromUnitAxes(const DVect3 &,const DVect3 &);
186 BASE_EXPORT void increment(const DAVect3 &);
188 BASE_EXPORT DVect3 e1() const;
190 BASE_EXPORT DVect3 e2() const;
192 BASE_EXPORT DVect3 e3() const;
195 BASE_EXPORT DVect3 quatToEuler() const;
196
198 void conj() { i_=-i_; j_=-j_; k_=-k_; }
200 Quat3 getConj() const { Quat3 q(w_,-i_,-j_,-k_); return q; }
202 BASE_EXPORT void normalize() { double m=1.0/std::sqrt(w_*w_+i_*i_+j_*j_+k_*k_); w_*=m; i_*=m; j_*=m; k_*=m; }
203
205 Quat3 operator *(const double &d) const { Quat3 q(w_*d,i_*d,j_*d,k_*d); return q; }
207 Quat3 operator /(const double &d) const { Quat3 q(w_/d,i_/d,j_/d,k_/d); return q; }
209 friend Quat3 operator *(const double &d,const Quat3 &p2) {Quat3 q(p2*d); return q;}
211 Quat3 operator *(const Quat3 &v) const { Quat3 q(w_*v.w_-i_*v.i_-j_*v.j_-k_*v.k_,w_*v.i_+i_*v.w_+j_*v.k_-k_*v.j_,w_*v.j_-i_*v.k_+j_*v.w_+k_*v.i_,w_*v.k_+i_*v.j_-j_*v.i_+k_*v.w_); return q; }
213 Quat3 operator +(const Quat3 &v) const { Quat3 q(w_+v.w_,i_+v.i_,j_+v.j_,k_+v.k_); return q; }
215 Quat3 friend operator *(const DVect3 &v,const Quat3 &q) {Quat3 q2(0.0,v.x(),v.y(),v.z()); return q2*q;}
217 Quat3 operator *(const DVect3 &v) const {Quat3 q2(0.0,v.x(),v.y(),v.z()); return *this*q2;}
218
220 const Quat3 & operator *=(const double &d) { w_ *= d; i_ *= d; j_ *= d; k_ *= d; return *this; }
222 const Quat3 & operator /=(const double &d) { w_ /= d; i_ /= d; j_ /= d; k_ /= d; return *this; }
224 const Quat3 & operator *=(const Quat3 &v) { double tw(w_*v.w_-i_*v.i_-j_*v.j_-k_*v.k_);
225 double ti(w_*v.i_+i_*v.w_+j_*v.k_-k_*v.j_);
226 double tj(w_*v.j_-i_*v.k_+j_*v.w_+k_*v.i_);
227 double tk(w_*v.k_+i_*v.j_-j_*v.i_+k_*v.w_);
228 //double tw(v.w_*w_-v.i_*i_-v.j_*j_-v.k_*k_);
229 //double ti(v.w_*i_+v.i_*w_+v.j_*k_-v.k_*j_);
230 //double tj(v.w_*j_-v.i_*k_+v.j_*w_+v.k_*i_);
231 //double tk(v.w_*k_+v.i_*j_-v.j_*i_+v.k_*w_);
232 w_ = tw; i_ = ti; j_ = tj; k_ = tk;
233 return *this; }
235 const Quat3 & operator +=(const Quat3 &v) { w_ += v.w_; i_ += v.i_; j_ += v.j_; k_ += v.k_; return *this; }
237 bool operator ==(const Quat3 &v) const { return (w_ == v.w_ && i_==v.i_ && j_==v.j_ && k_==v.k_); }
238
239private:
240 double w_; //the real amplitude part
241 double i_,j_,k_; //the imaginary parts
242};
243
244constexpr std::partial_ordering Quat3::operator<=>(const Quat3 &in) const {
245 auto i = w_ <=> in.w_;
246 if (i!=std::partial_ordering::equivalent) return i;
247 i = i_ <=> in.i_;
248 if (i!=std::partial_ordering::equivalent) return i;
249 i = j_ <=> in.j_;
250 if (i!=std::partial_ordering::equivalent) return i;
251 return k_ <=> in.k_;
252}
253
254namespace base {
255 BASE_EXPORT string ts(const Quat2 &q, int width=0, char notation = '\0', int precision = -1, char fill = ' ');
256
257 BASE_EXPORT string ts(const Quat3 &q, int width=0, char notation = '\0', int precision = -1, char fill = ' ');
258}
259
Angular Vectors.
A template-based matrix class, size fixed at compile time. Defaults to symmetric sized matrix.
Definition matrix.h:22
2D quaternion-like utility class. In this case only the angle (in radians) is stored as opposed to th...
Definition quat.h:20
Quat2 operator+(const Quat2 &v) const
Addition of quaterions. This is also the composition of rotations in 2D.
Definition quat.h:90
friend Quat2 operator*(const double &d, const Quat2 &p2)
Multiplication of a double times a quaternion.
Definition quat.h:85
BASE_EXPORT void fromUnitAxes(const DVect2 &, const DVect2 &)
Definition quat.cpp:62
double & rang()
Access a reference to the angle.
Definition quat.h:41
BASE_EXPORT void incrementAxisAngle(const DVect2 &, const double &)
Increment by this rotation. In this case the axis is ignored.
Definition quat.cpp:49
constexpr Quat2 & operator=(const Quat2 &in)
Equals operator.
Definition quat.h:31
void conj()
Convert to the conjugate quaternion - rotation by the opposite sign.
Definition quat.h:74
void setQuat(const double &a)
Set the angle.
Definition quat.h:35
Quat2(const double &a)
Constructor initializing the angle.
Definition quat.h:25
static BASE_EXPORT Quat2 identity()
Return the identity quaternion.
Definition quat.h:48
Quat2(const Quat2 &q)
Copy constructor.
Definition quat.h:29
Quat2 getConj() const
Return the conjugate of the quaternion.
Definition quat.h:76
Quat2()
Default constructor.
Definition quat.h:23
static BASE_EXPORT Quat2 fromVect(const DVect2 &v)
Convert a DVect2 into a quaternion. This assumes a rotation from the positive x axis.
Definition quat.cpp:17
const double & ang() const
Access the angle.
Definition quat.h:38
BASE_EXPORT void fromMatrix(const DMatrix< 2, 2 > &)
Convert a matrix into a quaternion.
Definition quat.cpp:21
BASE_EXPORT void spinAboutZ(const double &)
Just spin about the Z axis.
Definition quat.cpp:53
BASE_EXPORT void increment(const DAVect2 &)
Increment the quaternion due to a rotation about Z by the DAVect.
Definition quat.cpp:66
~Quat2()
Destructor.
Definition quat.h:27
const Quat2 & operator/=(const double &d)
In place division by a double.
Definition quat.h:95
const Quat2 & operator*=(const double &d)
In place multiplaction by a double.
Definition quat.h:93
BASE_EXPORT void fromAxisAngle(const DVect2 &, const double &)
Definition quat.cpp:45
bool operator==(const Quat2 &v) const
Euality operator.
Definition quat.h:103
void reset()
Reset the angle to 0.
Definition quat.h:44
BASE_EXPORT DMatrix< 2, 2 > quatToMatrix() const
Convert the quaternion to a rotation matrix.
Definition quat.cpp:6
const Quat2 & operator+=(const Quat2 &v)
Definition quat.h:101
void normalize()
Normalize the quaternion.
Definition quat.h:78
BASE_EXPORT DVect2 rotate(const DVect2 &v) const
Rotate a DVect2 by the quaternian to get a new DVect2.
Definition quat.cpp:57
void ident()
Reset to the identity.
Definition quat.h:46
Quat2 operator/(const double &d) const
Division by a double.
Definition quat.h:83
3D quaternion utility class.
Definition quat.h:111
Quat3(const Quat3 &q)
Copy constructor.
Definition quat.h:121
BASE_EXPORT DVect3 rotate(const DVect3 &v) const
Rotate a DVect3 by the quaternian to get a new DVect3.
Definition quat.cpp:231
BASE_EXPORT void increment(const DAVect3 &)
Increment the quaternion due to a rotation about the x, y, and z axes by the DAVect.
Definition quat.cpp:270
const Quat3 & operator/=(const double &d)
In place division by a double.
Definition quat.h:222
constexpr const Quat3 & operator=(const Quat3 &q)
Equality operator.
Definition quat.h:124
const double & k() const
Access the third imaginary part.
Definition quat.h:135
Quat3 getConj() const
Return the conjugate of the quaternion.
Definition quat.h:200
void setQuat(const double &w1, const double &x, const double &y, const double &z)
Set the real and imaginary parts.
Definition quat.h:126
void conj()
Convert the quaternion to the conjugate.
Definition quat.h:198
double & rj()
Access a reference to the second imaginary part.
Definition quat.h:142
static BASE_EXPORT Quat3 fromVect(const DVect3 &v)
Convert a DVect3 into a quaternion.
Definition quat.cpp:125
Quat3 operator+(const Quat3 &v) const
Addition of two quaternions.
Definition quat.h:213
BASE_EXPORT void incrementAxisAngle(const DVect3 &, const double &)
Increment by this rotation.
Definition quat.cpp:209
double & rw()
Access a reference to the real part.
Definition quat.h:138
const Quat3 & operator+=(const Quat3 &v)
In place addition of two quaternions.
Definition quat.h:235
BASE_EXPORT DVect3 e1() const
Get component e1 of the rotation matrix.
Definition quat.cpp:275
~Quat3()
Default destructor.
Definition quat.h:119
BASE_EXPORT bool isNull() const
Returns a boolean indicating whether or not the quaternion is null.
Definition quat.h:153
BASE_EXPORT void fromEuler(const DVect3 &)
Definition quat.cpp:179
static BASE_EXPORT Quat3 identity()
Returns the identity quaternion.
Definition quat.h:151
const double & j() const
Access the second imaginary part.
Definition quat.h:133
BASE_EXPORT void fromUnitAxes(const DVect3 &, const DVect3 &)
Take 2 orthogonal axis for an axis system and convert to a quaternion.
Definition quat.cpp:240
void ident()
Reset the quaternion to the identity.
Definition quat.h:149
BASE_EXPORT DVect3 quatToAAngle() const
Convert to Axis Angle where the magnitude of the axis is the angle in radians.
Definition quat.cpp:98
double & rk()
Access a reference to the third imaginary part.
Definition quat.h:144
Quat3()
Default constructor.
Definition quat.h:114
BASE_EXPORT void spinAboutY(const double &)
Just spin about the Y axis.
Definition quat.cpp:223
friend Quat3 operator*(const double &d, const Quat3 &p2)
Product of a double and a quaternion.
Definition quat.h:209
BASE_EXPORT DVect3 e3() const
Get component e3 of the rotation matrix.
Definition quat.cpp:283
Quat3(const double &w1, const double &x, const double &y, const double &z)
Definition quat.h:117
const double & w() const
Access the real part.
Definition quat.h:129
BASE_EXPORT DVect3 e2() const
Get component e2 of the rotation matrix.
Definition quat.cpp:279
double & ri()
Access a reference to the first imaginary part.
Definition quat.h:140
BASE_EXPORT DVect3 real() const
Return the "real" vector part of the quaternian.
Definition quat.h:181
void reset()
Reset the quaternion.
Definition quat.h:147
BASE_EXPORT void spinAboutX(const double &)
Just spin about the X axis.
Definition quat.cpp:219
BASE_EXPORT void fromAxisAngle(const DVect3 &, const double &)
Take an axis-angle representation and convert it to a quaternion where the angle is in radians.
Definition quat.cpp:165
const double & i() const
Access the first imaginary part.
Definition quat.h:131
BASE_EXPORT DMatrix< 3, 3 > quatToMatrix() const
Convert the quaternion to a rotation matrix.
Definition quat.cpp:70
const Quat3 & operator*=(const double &d)
In place multiplaction by a double.
Definition quat.h:220
BASE_EXPORT void fromEulerZXZ(const DVect3 &)
Definition quat.cpp:201
bool operator==(const Quat3 &v) const
Euality operator.
Definition quat.h:237
BASE_EXPORT void spinAboutZ(const double &)
Just spin about the Z axis.
Definition quat.cpp:227
BASE_EXPORT DVect3 quatToEuler() const
Definition quat.cpp:287
Quat3 operator/(const double &d) const
Division by a double.
Definition quat.h:207
BASE_EXPORT void fromMatrix(const DMatrix< 3, 3 > &)
Convert a matrix into a quaternion.
Definition quat.cpp:134
BASE_EXPORT void normalize()
Normalize the quaternion.
Definition quat.h:202
#define BASE_EXPORT
Definition basedef.h:25
A template-based matrix class, size fixed at compile time.
2D and 3D vector utility classes.