FOUND
Loading...
Searching...
No Matches
attitude-utils.hpp
1#ifndef SRC_COMMON_SPATIAL_ATTITUDE_UTILS_HPP_
2#define SRC_COMMON_SPATIAL_ATTITUDE_UTILS_HPP_
3
4#include <memory>
5
6#include "common/decimal.hpp"
7
8namespace found {
9
10// At first, I wanted to have two separate Attitude classes, one storing Euler angles and converting
11// to Quaterinon, and another storing as Quaternion and converting to Euler. But abstract classes
12// make everything more annoying, because you need vectors of pointers...ugh!
13
17
22struct Vec2 {
24 decimal x;
26 decimal y;
27
28 // Magnitude
29
35 decimal Magnitude() const;
36
42 decimal MagnitudeSq() const;
43
44 // Unit Vector
45
51 Vec2 Normalize() const;
52
53 // Vector Operations
54
62 decimal operator*(const Vec2 &other) const;
63
71 Vec2 operator*(const decimal &scalar) const;
72
80 Vec2 operator+(const Vec2 &other) const;
81
89 Vec2 operator-(const Vec2 &other) const;
90};
91
92class Mat3; // define above so we can use in Vec3 class
93
98class Vec3 {
99 public:
101 decimal x;
103 decimal y;
105 decimal z;
106
114 constexpr Vec3(decimal x, decimal y, decimal z) : x(x), y(y), z(z) {}
115
119 Vec3() = default;
120
121 // Magnitude
122
128 decimal Magnitude() const;
129
135 decimal MagnitudeSq() const;
136
137 // Unit Vector
138
144 Vec3 Normalize() const;
145
146 // Operations
147
153 Vec3 operator-() const;
154
162 Vec3 operator-(const Vec3 &) const;
163
171 decimal operator*(const Vec3 &) const;
172
180 Vec3 operator*(const decimal &) const;
181
189 Vec3 operator/(const decimal &) const;
190
200 Vec3 &operator+=(const Vec3 &);
201
210 Vec3 operator*(const Mat3 &) const;
211
219 Vec3 CrossProduct(const Vec3 &) const;
220
228 Mat3 OuterProduct(const Vec3 &) const;
229};
230
234
243Vec2 Midpoint(const Vec2 &, const Vec2 &);
244
253Vec3 Midpoint(const Vec3 &, const Vec3 &);
254
264Vec3 Midpoint(const Vec3 &, const Vec3 &, const Vec3 &);
265
274decimal Distance(const Vec2 &, const Vec2 &);
275
284decimal Distance(const Vec3 &, const Vec3 &);
285
294decimal Angle(const Vec3 &, const Vec3 &);
295
306decimal AngleUnit(const Vec3 &, const Vec3 &);
307
311
316class Mat3 {
317 public:
319 decimal x[9];
320
321 // Accessor
322
331 decimal At(int i, int j) const;
332
340 Vec3 Column(int) const;
341
349 Vec3 Row(int) const;
350
356 decimal Trace() const;
357
363 decimal Det() const;
364
365 // Operations
366
374 Mat3 operator+(const Mat3 &) const;
375
383 Mat3 operator*(const Mat3 &) const;
384
395 Vec3 operator*(const Vec3 &) const;
396
404 Mat3 operator*(const decimal &) const;
405
406 // Transformations
407
416 Mat3 Transpose() const;
417
423 Mat3 Inverse() const;
424};
425
427extern const Mat3 kIdentityMat3;
428
432
444 public:
452 constexpr EulerAngles(decimal ra = DECIMAL(0.0),
453 decimal de = DECIMAL(0.0),
454 decimal roll = DECIMAL(0.0))
455 : ra(ra), de(de), roll(roll) {}
456
458 decimal ra;
460 decimal de;
462 decimal roll;
463};
464
468
475 public:
476 Quaternion() = default;
477
484 Quaternion(const Vec3 &, decimal);
485
491 explicit Quaternion(const Vec3 &);
492
503 Quaternion(decimal real, decimal i, decimal j, decimal k)
504 : real(real), i(i), j(j), k(k) {}
505
514 Quaternion operator*(const Quaternion &other) const;
515
521 Quaternion operator-() const;
522
529 Quaternion Conjugate() const;
530
538 Vec3 Vector() const;
539
545 void SetVector(const Vec3 &);
546
554 Vec3 Rotate(const Vec3 &) const;
555
561 decimal Angle() const;
562
570 void SetAngle(decimal);
571
580 bool IsUnit(decimal tolerance) const;
581
590 Quaternion Canonicalize() const;
591
598 EulerAngles ToSpherical() const;
599
601 decimal real;
603 decimal i;
605 decimal j;
607 decimal k;
608};
609
613
627class Attitude {
628 public:
632 Attitude() = default;
633
639 explicit Attitude(const Quaternion &quat) : quaternion(quat), type(QuaternionType) {}
640
647 explicit Attitude(const Mat3 &matrix) : dcm(matrix), type(DCMType) {}
648
656
663 Mat3 GetDCM() const;
664
671 EulerAngles ToSpherical() const;
672
681 Vec3 Rotate(const Vec3 &) const;
682
683 private:
694
701};
702
706
707
708// Attitude Conversions
709
710
723Mat3 QuaternionToDCM(const Quaternion &);
724
732Quaternion DCMToQuaternion(const Mat3 &);
733
750Quaternion SphericalToQuaternion(decimal ra, decimal dec, decimal roll);
751
763inline Quaternion SphericalToQuaternion(EulerAngles angles)
764 { return SphericalToQuaternion(angles.ra, angles.de, angles.roll); }
765
766
767// Spherical-Vector Conversions
768
769
779Vec3 SphericalToSpatial(decimal ra, decimal de);
780
792void SpatialToSpherical(const Vec3 &, decimal &ra, decimal &de);
793
794
795// Angle Conversions
796
797
805constexpr decimal RadToDeg(decimal rad) {
806 return rad*DECIMAL(180.0)/DECIMAL_M_PI;
807}
808
816constexpr decimal DegToRad(decimal deg) {
817 return deg/DECIMAL(180.0)*DECIMAL_M_PI;
818}
819
832constexpr decimal RadToArcSec(decimal rad) {
833 return RadToDeg(rad) * DECIMAL(3600.0);
834}
835
844constexpr decimal ArcSecToRad(decimal arcSec) {
845 return DegToRad(arcSec / DECIMAL(3600.0));
846}
847
848} // namespace found
849
850#endif // SRC_COMMON_SPATIAL_ATTITUDE_UTILS_HPP_
An Attitude is an immutable object that represents the orientation of a 3D point.
Definition attitude-utils.hpp:627
Attitude()=default
Constructs this by default.
Attitude(const Quaternion &quat)
Constructs an Attitude object from Quaternion information.
Definition attitude-utils.hpp:639
Quaternion GetQuaternion() const
Provides the Quaternion corresponding to this Attitude.
Definition attitude-utils.cpp:336
EulerAngles ToSpherical() const
Obtains the Euler Angles of this Attitude.
Definition attitude-utils.cpp:358
Attitude(const Mat3 &matrix)
Constructs an Attitude object from a Direction Cosine Matrix (A matrix holding the direction cosines ...
Definition attitude-utils.hpp:647
Quaternion quaternion
Internal Quaternion Representation.
Definition attitude-utils.hpp:696
Mat3 dcm
Internal DCM Representation.
Definition attitude-utils.hpp:698
AttitudeType
Represents what internal representation for attitude is being used.
Definition attitude-utils.hpp:686
@ NullType
No Internal representation.
Definition attitude-utils.hpp:688
@ DCMType
DCM Internal Representation.
Definition attitude-utils.hpp:692
@ QuaternionType
Quaternion Internal Representation.
Definition attitude-utils.hpp:690
AttitudeType type
Internal Representation Type.
Definition attitude-utils.hpp:700
Vec3 Rotate(const Vec3 &) const
Obtains a vector rotated to this Attitude from another vector (Convert a vector from the reference fr...
Definition attitude-utils.cpp:369
Mat3 GetDCM() const
Obtains the rotation matrix from this Attitude.
Definition attitude-utils.cpp:347
An EulerAngle is a mutable Object representing Euler Angles of a 3D point.
Definition attitude-utils.hpp:443
decimal ra
Right ascension. How far we yaw left. Yaw is performed first.
Definition attitude-utils.hpp:458
decimal de
Declination. How far we pitch up (or down if negative). Pitch is performed second,...
Definition attitude-utils.hpp:460
decimal roll
How far we roll counterclockwise. Roll is performed last (after yaw and pitch).
Definition attitude-utils.hpp:462
constexpr EulerAngles(decimal ra=DECIMAL(0.0), decimal de=DECIMAL(0.0), decimal roll=DECIMAL(0.0))
Initializes an EulerAngles with corresponding parameters.
Definition attitude-utils.hpp:452
A Mat3 is a mutable object that represents a 3x3 Matrix.
Definition attitude-utils.hpp:316
decimal Det() const
Obtains the determinant of this Matrix.
Definition attitude-utils.cpp:168
decimal Trace() const
Obtains the trace of this Matrix.
Definition attitude-utils.cpp:164
Mat3 operator+(const Mat3 &) const
Matrix Addition (element-wise)
Definition attitude-utils.cpp:174
decimal At(int i, int j) const
Obtains an entry in this Matrix.
Definition attitude-utils.cpp:152
Vec3 Row(int) const
Obtains one of the row vectors in this Matrix.
Definition attitude-utils.cpp:160
Mat3 Transpose() const
Obtains the transpose of this Matrix.
Definition attitude-utils.cpp:208
decimal x[9]
The matrix entries.
Definition attitude-utils.hpp:319
Mat3 Inverse() const
Obtains the inverse of this Matrix.
Definition attitude-utils.cpp:216
Vec3 Column(int) const
Obtains one of the column vectors in this Matrix.
Definition attitude-utils.cpp:156
Mat3 operator*(const Mat3 &) const
Matrix Multiplication.
Definition attitude-utils.cpp:182
A Quaternion is a mutable object that represents a Quaternion.
Definition attitude-utils.hpp:474
Quaternion(decimal real, decimal i, decimal j, decimal k)
Creates a Quaternion with components.
Definition attitude-utils.hpp:503
decimal Angle() const
Provides the amount of rotations represented by this Quaterion.
Definition attitude-utils.cpp:288
Vec3 Vector() const
The axis of the represented rotation.
Definition attitude-utils.cpp:273
Vec3 Rotate(const Vec3 &) const
Rotates a vector about this Quaternion.
Definition attitude-utils.cpp:283
bool IsUnit(decimal tolerance) const
Tells client if this Quarternion is a unit quaternion.
Definition attitude-utils.cpp:301
decimal j
The j component.
Definition attitude-utils.hpp:605
decimal real
The real component.
Definition attitude-utils.hpp:601
Quaternion Conjugate() const
Effectively computes a quaternion representing the inverse rotation of the original.
Definition attitude-utils.cpp:269
Quaternion Canonicalize() const
Provides the canonicalized Quaternion of this, if it is not already canonicalized.
Definition attitude-utils.cpp:305
decimal i
The i component.
Definition attitude-utils.hpp:603
void SetAngle(decimal)
Changes the rotation represented in this quarterion.
Definition attitude-utils.cpp:296
Quaternion operator*(const Quaternion &other) const
Multiply two quaternions using the usual definition of quaternion multiplication (effectively compose...
Definition attitude-utils.cpp:257
Quaternion operator-() const
Negate the quaternion, which is the same rotation.
Definition attitude-utils.cpp:265
EulerAngles ToSpherical() const
Converts this Quarterion to a new system of Euler Angles by extracting the rotations described by thi...
Definition attitude-utils.cpp:313
decimal k
The k component.
Definition attitude-utils.hpp:607
void SetVector(const Vec3 &)
Set imaginary components of Quarterion.
Definition attitude-utils.cpp:277
A Vec3 is a mutable object that represents a 3D Vector.
Definition attitude-utils.hpp:98
Mat3 OuterProduct(const Vec3 &) const
Computes the outer product between this and another vector.
Definition attitude-utils.cpp:106
decimal z
The z coordinate.
Definition attitude-utils.hpp:105
decimal y
The y coordinate.
Definition attitude-utils.hpp:103
Vec3 operator-() const
Vector Negation.
Definition attitude-utils.cpp:61
Vec3 & operator+=(const Vec3 &)
Vector Addition (Modification)
Definition attitude-utils.cpp:82
decimal Magnitude() const
Provides the magnitude of this Vec3.
Definition attitude-utils.cpp:46
decimal operator*(const Vec3 &) const
Dot Product.
Definition attitude-utils.cpp:70
Vec3 operator/(const decimal &) const
Scalar Division.
Definition attitude-utils.cpp:78
constexpr Vec3(decimal x, decimal y, decimal z)
Construction of vector with x, y, and z components.
Definition attitude-utils.hpp:114
decimal MagnitudeSq() const
Provides the square of the magnitude of this Vec3.
Definition attitude-utils.cpp:50
Vec3 CrossProduct(const Vec3 &) const
Computes the cross (vector) product between this and another vector.
Definition attitude-utils.cpp:98
decimal x
The x coordinate.
Definition attitude-utils.hpp:101
Vec3 Normalize() const
Provides the magnitude of this Vec2.
Definition attitude-utils.cpp:54
Vec3()=default
Default construction of the Vector.
A Vec2 is an immutable object that represents a 2D Vector.
Definition attitude-utils.hpp:22
decimal operator*(const Vec2 &other) const
Dot product (Scalar product)
Definition attitude-utils.cpp:30
Vec2 operator+(const Vec2 &other) const
Vector Addition.
Definition attitude-utils.cpp:38
Vec2 operator-(const Vec2 &other) const
Vector Subtraction.
Definition attitude-utils.cpp:42
decimal y
The y coordinate.
Definition attitude-utils.hpp:26
decimal x
The x coordinate.
Definition attitude-utils.hpp:24
Vec2 Normalize() const
Normalizes this.
Definition attitude-utils.cpp:23
decimal MagnitudeSq() const
Provides the square of the magnitude of this Vec2.
Definition attitude-utils.cpp:19
decimal Magnitude() const
Provides the magnitude of this Vec2.
Definition attitude-utils.cpp:15