QP  0.7-SNAPSHOT
Control software for the ??SRT telescope
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
Public Types | Public Member Functions | Static Public Member Functions | List of all members
Quaternion Class Reference

The Quaternion class encapsulates quaternions (quelle surprise!), and provides a small set of operations for manipulating them. More...

#include <quaternion.h>

Public Types

enum  basis_quaternion { Unit, I, J, K }
 The set of basis quaternions. More...
 

Public Member Functions

 Quaternion ()
 The default constructor creates a K quaternion. More...
 
 Quaternion (const double q0, const double q1, const double q2, const double q3)
 The constructor creates a quaternion from four coefficients of the basis quaternions. More...
 
 Quaternion (const basis_quaternion)
 Produce one of the basis quaternions.
 
 Quaternion (const Position &)
 Create a quaternion vector which points in the direction of the given position.
 
Quaternion operator- () const
 Produce a new quaternion which is the negative of this one.
 
Quaternion operator+ (const Quaternion &) const
 Produces the sum of two quaternions.
 
Quaternion operator- (const Quaternion &) const
 Produces the difference of two quaternions.
 
Quaternion operator* (const Quaternion &) const
 Performs the quaternion product of two quaternions.
 
Quaternion scale (double factor) const
 Return quaternion scaled by real factor.
 
Quaternion rotate (const Quaternion &) const
 'Rotate' the quaternion. More...
 
Quaternion reflect (const Quaternion &) const
 Reflect the quaternion through the line generated by the argument. More...
 
Quaternion conj (void) const
 Returns a new quaternion which is the conjugate of this one.
 
const double * cpts (void) const
 The components of the quaternion, as an array of doubles, in radians.
 
Position coords (Position::System system=Position::TopoPolar, Position::System from_system=Position::TopoPolar) const
 Obtains the direction of a quaternion, by decomposing it into polar angles. More...
 
Quaternion cross (const Quaternion &, bool norm=false) const
 Return the vector product of this quaternion with the argument. More...
 
double dot (const Quaternion &) const
 Return scalar product of two quaternions in Vec(H). More...
 
Quaternion rotation (const double angle) const
 Produce a quaternion which specifies a rotation about the current quaternion, by the given angle.
 
bool is_unit_p (void)
 Test whether a quaternion is a unit quaternion. More...
 

Static Public Member Functions

static Quaternion vector (const double longitude, double latitude)
 Creates a new vector quaternion which is pointing in the direction of the given (east-)longitude and latitude. More...
 
static const char * coords_str (const Quaternion &, Position::System system=Position::TopoPolar, bool sexagesimal_p=true)
 Returns a pointer to a static buffer containing a formatted representation of the quaternion. More...
 

Detailed Description

The Quaternion class encapsulates quaternions (quelle surprise!), and provides a small set of operations for manipulating them.

The directions in this module are described either in terms of the basis quaternions 1, i, j, k, or in terms of longitude [0..2pi] and latitude [-pi/2..+pi/2], where the direction i is (long,lat) = (0,0), j is (pi/2, 0) and k is (0, pi/2). The longitude coordinate therefore increases from i to j (ie, moving eastwards).

Although it doesn't much matter to this class, when viewed as a topocentric coordinate system, i should be taken as pointing south, and j east.

The arithmetic operations in this class return new constant objects, rather than mutating existing ones.

Member Enumeration Documentation

The set of basis quaternions.

See also
Quaternion(const basis_quaternion)
Enumerator
Unit 

The unit quaternion (sometimes used as a sentinel value; see is_unit_p())

the basis quaternion in the i direction

the basis quaternion in the j direction

the basis quaternion in the k direction

Constructor & Destructor Documentation

Quaternion::Quaternion ( )

The default constructor creates a K quaternion.

Creating a Unit quaternion might be more intuitive, but since this isn't a vector, it has the potential to cause lots of trouble if used accidentally.

Quaternion::Quaternion ( const double  q0,
const double  q1,
const double  q2,
const double  q3 
)

The constructor creates a quaternion from four coefficients of the basis quaternions.

This is the only constructor that can create a non-unit quaternion.

Member Function Documentation

Position Quaternion::coords ( Position::System  system = Position::TopoPolar,
Position::System  from_system = Position::TopoPolar 
) const

Obtains the direction of a quaternion, by decomposing it into polar angles.

The coordinates are returned as part of a Position object, so the specific result coordinate system may be chosen using the arguments.

Parameters
systemthe system in which the result angles are to be expressed
from_systemthe system in which the quaternion's rectangular components should be taken to be expressed
See also
Position::Position(double,double,Position::System,Position::System)
const char * Quaternion::coords_str ( const Quaternion q,
Position::System  system = Position::TopoPolar,
bool  sexagesimal_p = true 
)
static

Returns a pointer to a static buffer containing a formatted representation of the quaternion.

Parameters
qthe quaternion to be formatted
systemthe system to be used for the formatted output
sexagesimal_pif true, output as sexagesimal, if false, in radians
Returns
a pointer to a common static buffer
Quaternion Quaternion::cross ( const Quaternion arg,
bool  norm = false 
) const

Return the vector product of this quaternion with the argument.

We assume, but don't check, that the both the current and the argument quaternion are in Vec(H).

Parameters
argthe quaternion to be crossed with this one (on the right)
normif true, the result is normalised to unit length
double Quaternion::dot ( const Quaternion arg) const

Return scalar product of two quaternions in Vec(H).

We assume, but don't check, that the both the current and the argument quaternion are in Vec(H).

bool Quaternion::is_unit_p ( void  )

Test whether a quaternion is a unit quaternion.

That is, test whether it is (1, 0, 0, 0). We sometimes use this quaternion, generated by Quaternion(const basis_quaternion), as a sentinel value.

Quaternion Quaternion::reflect ( const Quaternion rq) const

Reflect the quaternion through the line generated by the argument.

This is equivalent to a rotation of pi radians around the argument, which is assumed to be a unit vector. The result of this method should be equivalent to the application of Quaternion::rotate, but should be faster because of the assumption that the argument is a vector.

Parameters
rqthe quaternion which generates the rotation, which is assumed to be a unit vector
Quaternion Quaternion::rotate ( const Quaternion rq) const

'Rotate' the quaternion.

Given a quaternion, r, and taking the current quaternion to be A, return r*A*r.conj. This requires 23 multiplications and 24 additions, as opposed to 32 multiplications and 24 additions when done the 'long' way. This should also be more accurate.

Note that this is different from the rotation method, which constructs a quaternion which generates a rotation.

See quaternion-pointing notes, at note rotation.

Parameters
rqthe quaternion which generates the rotation, which is assumed to be a unit quaternion
Quaternion Quaternion::vector ( const double  longitude,
double  latitude 
)
static

Creates a new vector quaternion which is pointing in the direction of the given (east-)longitude and latitude.

Both of the angles are given in 'polar' radians, thus east of south.


The documentation for this class was generated from the following files: