KJB
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Classes | Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Friends | List of all members
kjb::Quaternion Class Reference

#include <g_quaternion.h>

Public Types

enum  Euler_mode {
  XESS = 0, XYXS, XEDS, XYZS,
  XOSS, XZXS, XODS, XZYS,
  YESS, YZYS, YEDS, YZXS,
  YOSS, YXYS, YODS, YXZS,
  ZESS, ZXZS, ZEDS, ZXYS,
  ZOSS, ZYZS, ZODS, ZYXS,
  XESR, XYXR, XEDR, ZYXR,
  XOSR, XZXR, XODR, YZXR,
  YESR, YZYR, YEDR, XZYR,
  YOSR, YXYR, YODR, ZXYR,
  ZESR, ZXZR, ZEDR, YXZR,
  ZOSR, ZYZR, ZODR, XYZR
}
 
enum  Euler_axis { EulX = 0, EulY = 1, EulZ = 2 }
 
enum  Euler_parity { EulParEven = 0, EulParOdd = 1 }
 
enum  Euler_repeat { EulRepNo = 0, EulRepYes = 1 }
 
enum  Euler_frame { EulFrmS = 0, EulFrmR = 1 }
 

Public Member Functions

 Quaternion ()
 
 Quaternion (double x, double y, double z, double w)
 
 Quaternion (double phi, double theta, double psi, Euler_mode mode=DEFAULT_EULER_MODE)
 
 Quaternion (const Matrix &rotation_matrix)
 
 Quaternion (const Vector &x, const Vector &y, const Vector &z)
 
 Quaternion (const Vector &axis, double angle)
 
 Quaternion (const Quaternion &)
 
Quaternion clone () const
 
void swap (Self &other)
 
Quaternioninit_identity ()
 
bool is_identity () const
 
const Matrixget_rotation_matrix () const
 
const Vectorget_axis () const
 
Vector get_axis_angle () const
 
double get_angle () const
 
const Vectorget_euler_angles () const
 returns vector [phi, theta, psi] More...
 
Vector get_imag () const
 returns vector [x, y, z] More...
 
double get_real () const
 returns w More...
 
Quaternionset_rotation_matrix (const Matrix &)
 
Quaternionset_axis_angle (const Vector &, double angle)
 
Quaternionset_axis_angle (const Vector &axis_angle)
 
Quaternionset_from_directions (const Vector &d1, const Vector &d2)
 Find quaternion that rotates vector d1 to vector d2 in the smallest angle. More...
 
Quaternionset_from_directions (const Vector3 &d1, const Vector3 &d2)
 
Quaternionset_euler_angles (double phi, double theta, double psi)
 
Quaternionset_euler_phi (double phi)
 
Quaternionset_euler_theta (double theta)
 
Quaternionset_euler_psi (double psi)
 
Quaternionset_euler_mode (Euler_mode m)
 
Euler_mode get_euler_mode () const
 
Vector rotate (const Vector &v) const
 
Vector3 rotate (const Vector3 &v) const
 
Quaternion conj () const
 
double norm (unsigned int l=2) const
 compute the L-* norm More...
 
double magnitude () const
 
double magnitude_squared () const
 
Quaternionoperator= (const Quaternion &)
 
Quaternionoperator*= (const Quaternion &)
 
Quaternionoperator/= (const Quaternion &)
 
Quaternionoperator+= (const Quaternion &)
 
Quaternionoperator-= (const Quaternion &)
 This is simple 4-vector subtraction. If you want to invert a rotation, don't use this–multiply by the conugate instead (or use the division operator (untested?)) More...
 
Quaternionoperator*= (double)
 This is used in computing the mean, and in normalization. More...
 
Quaternionoperator/= (double)
 
Quaternion operator* (const Quaternion &) const
 
Quaternion operator/ (const Quaternion &) const
 
Quaternion operator+ (const Quaternion &q) const
 
Quaternion operator- (const Quaternion &q) const
 
bool operator== (const Quaternion &) const
 
bool operator!= (const Quaternion &) const
 

Static Public Member Functions

static void set_default_euler_mode (Euler_mode m)
 
static Euler_mode get_default_euler_mode ()
 
static void set_gimbal_lock_epsilon (float e)
 
static float get_gimbal_lock_epsilon ()
 
static void set_epsilon (float e)
 
static float get_epsilon ()
 

Public Attributes

bool _gimbal_lock
 

Static Public Attributes

static const Euler_axis EulSafe [4] = {EulX, EulY, EulZ, EulX}
 
static const Euler_axis EulNext [4] = {EulY, EulZ, EulX, EulY}
 

Friends

Quaternion slerp (const Quaternion &q1, const Quaternion &q2, double t)
 
Quaternion slerp2 (const Quaternion &q1, const Quaternion &q2, double t)
 
Quaternion nlerp (const Quaternion &q1, const Quaternion &q2, double t)
 
std::ostream & operator<< (std::ostream &out, const Quaternion &q)
 

Member Enumeration Documentation

Enumerator
EulX 
EulY 
EulZ 
Enumerator
EulFrmS 
EulFrmR 
Enumerator
XESS 
XYXS 
XEDS 
XYZS 
XOSS 
XZXS 
XODS 
XZYS 
YESS 
YZYS 
YEDS 
YZXS 
YOSS 
YXYS 
YODS 
YXZS 
ZESS 
ZXZS 
ZEDS 
ZXYS 
ZOSS 
ZYZS 
ZODS 
ZYXS 
XESR 
XYXR 
XEDR 
ZYXR 
XOSR 
XZXR 
XODR 
YZXR 
YESR 
YZYR 
YEDR 
XZYR 
YOSR 
YXYR 
YODR 
ZXYR 
ZESR 
ZXZR 
ZEDR 
YXZR 
ZOSR 
ZYZR 
ZODR 
XYZR 
Enumerator
EulParEven 
EulParOdd 
Enumerator
EulRepNo 
EulRepYes 

Constructor & Destructor Documentation

kjb::Quaternion::Quaternion ( )
kjb::Quaternion::Quaternion ( double  x,
double  y,
double  z,
double  w 
)

Construct a quaternion directly from its components.

Note
Does not normalize norm to 1. Use one of the other constructors to create a unit quaternion.
kjb::Quaternion::Quaternion ( double  phi,
double  theta,
double  psi,
Euler_mode  mode = DEFAULT_EULER_MODE 
)
kjb::Quaternion::Quaternion ( const Matrix rotation_matrix)
kjb::Quaternion::Quaternion ( const Vector x,
const Vector y,
const Vector z 
)

Set rotation matrix from new x, y, z vectors

kjb::Quaternion::Quaternion ( const Vector axis,
double  angle 
)
kjb::Quaternion::Quaternion ( const Quaternion src)

Member Function Documentation

Quaternion kjb::Quaternion::clone ( ) const
Quaternion kjb::Quaternion::conj ( ) const
double kjb::Quaternion::get_angle ( ) const
const Vector & kjb::Quaternion::get_axis ( ) const
Vector kjb::Quaternion::get_axis_angle ( ) const
Quaternion::Euler_mode kjb::Quaternion::get_default_euler_mode ( )
static
float kjb::Quaternion::get_epsilon ( )
static
const Vector & kjb::Quaternion::get_euler_angles ( ) const

returns vector [phi, theta, psi]

Quaternion::Euler_mode kjb::Quaternion::get_euler_mode ( ) const
float kjb::Quaternion::get_gimbal_lock_epsilon ( )
static
Vector kjb::Quaternion::get_imag ( ) const

returns vector [x, y, z]

double kjb::Quaternion::get_real ( ) const

returns w

const Matrix & kjb::Quaternion::get_rotation_matrix ( ) const
Quaternion & kjb::Quaternion::init_identity ( )
bool kjb::Quaternion::is_identity ( ) const
inline
double kjb::Quaternion::magnitude ( ) const
inline
double kjb::Quaternion::magnitude_squared ( ) const
inline
double kjb::Quaternion::norm ( unsigned int  l = 2) const

compute the L-* norm

bool kjb::Quaternion::operator!= ( const Quaternion op2) const
Quaternion kjb::Quaternion::operator* ( const Quaternion op_2) const
Quaternion & kjb::Quaternion::operator*= ( const Quaternion q)
Quaternion & kjb::Quaternion::operator*= ( double  x)

This is used in computing the mean, and in normalization.

Quaternion kjb::Quaternion::operator+ ( const Quaternion q) const
inline
Quaternion & kjb::Quaternion::operator+= ( const Quaternion q)
Quaternion kjb::Quaternion::operator- ( const Quaternion q) const
inline
Quaternion & kjb::Quaternion::operator-= ( const Quaternion q)

This is simple 4-vector subtraction. If you want to invert a rotation, don't use this–multiply by the conugate instead (or use the division operator (untested?))

Quaternion kjb::Quaternion::operator/ ( const Quaternion op_2) const
Quaternion & kjb::Quaternion::operator/= ( const Quaternion q)
Quaternion & kjb::Quaternion::operator/= ( double  x)
Quaternion & kjb::Quaternion::operator= ( const Quaternion src)
bool kjb::Quaternion::operator== ( const Quaternion op2) const
Vector kjb::Quaternion::rotate ( const Vector v) const
Vector3 kjb::Quaternion::rotate ( const Vector3 v) const
Quaternion & kjb::Quaternion::set_axis_angle ( const Vector axis,
double  angle 
)
Quaternion & kjb::Quaternion::set_axis_angle ( const Vector axis_angle)

Set axis/angle from 3-vector, where magnitude is angle, and direction is axis.

void kjb::Quaternion::set_default_euler_mode ( Euler_mode  m)
static
void kjb::Quaternion::set_epsilon ( float  e)
static
Quaternion & kjb::Quaternion::set_euler_angles ( double  phi,
double  theta,
double  psi 
)
Quaternion & kjb::Quaternion::set_euler_mode ( Euler_mode  m)
Quaternion & kjb::Quaternion::set_euler_phi ( double  phi)

Set first euler rotation

Quaternion & kjb::Quaternion::set_euler_psi ( double  psi)

Set first euler rotation

Quaternion & kjb::Quaternion::set_euler_theta ( double  theta)

Set second euler rotation

Quaternion & kjb::Quaternion::set_from_directions ( const Vector d1,
const Vector d2 
)

Find quaternion that rotates vector d1 to vector d2 in the smallest angle.

Find quaternion that rotates vector d1 to vector d2 in the smallest angle.

Quaternion & kjb::Quaternion::set_from_directions ( const Vector3 d1,
const Vector3 d2 
)
void kjb::Quaternion::set_gimbal_lock_epsilon ( float  e)
static
Quaternion & kjb::Quaternion::set_rotation_matrix ( const Matrix rotation_matrix)
void kjb::Quaternion::swap ( Self other)

Friends And Related Function Documentation

Quaternion nlerp ( const Quaternion q1,
const Quaternion q2,
double  t 
)
friend

Normalized linear interpolation of two quaternions. More efficient than slerp, but rotation rate is non-constant.

std::ostream& operator<< ( std::ostream &  out,
const Quaternion q 
)
friend
Quaternion slerp ( const Quaternion q1,
const Quaternion q2,
double  t 
)
friend

Spherical linear interpolation between two quaternions

Quaternion slerp2 ( const Quaternion q1,
const Quaternion q2,
double  t 
)
friend

An alternative implementation of spherical linear interpolation

Member Data Documentation

bool kjb::Quaternion::_gimbal_lock
mutable
const Quaternion::Euler_axis kjb::Quaternion::EulNext = {EulY, EulZ, EulX, EulY}
static
const Quaternion::Euler_axis kjb::Quaternion::EulSafe = {EulX, EulY, EulZ, EulX}
static

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