mirror of https://github.com/CGAL/cgal
111 lines
3.7 KiB
C++
111 lines
3.7 KiB
C++
///////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Class: CQuaternion //
|
|
// //
|
|
// Quaternion to represent rotations. Each component of the //
|
|
// quaternion is stored as a floating point number. //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _QUATERNION_
|
|
#define _QUATERNION_
|
|
|
|
#include "Matrix44.h"
|
|
#include "Vector3d.h"
|
|
|
|
class CQuaternion
|
|
{
|
|
|
|
private :
|
|
|
|
// Data
|
|
float m_s;
|
|
CVector3d m_v;
|
|
|
|
public :
|
|
|
|
// Constructors
|
|
CQuaternion() { m_s = 1.0f; }
|
|
CQuaternion(const float s, const float x, const float y, const float z);
|
|
CQuaternion(const CQuaternion &quat);
|
|
CQuaternion(const CQuaternion *pQuat);
|
|
CQuaternion(const float s, const CVector3d *pVector);
|
|
CQuaternion(const float s, const CVector3d &vector);
|
|
CQuaternion(const CVector3d &vecFrom, const CVector3d &vecTo);
|
|
|
|
virtual ~CQuaternion() { }
|
|
|
|
void Copy(const CQuaternion &quat);
|
|
void Copy(const CQuaternion *pQuat);
|
|
|
|
// Data setting
|
|
void Clear();
|
|
void Set(const CQuaternion *pVector);
|
|
void Set(const CQuaternion &vector);
|
|
void Set(const float s, const CVector3d &v);
|
|
void Set(const float s, const CVector3d *pV);
|
|
void Set(const float s, const float x, const float y, const float z);
|
|
void SetRotation(float ax, float ay, float az, float radAngle);
|
|
|
|
void GetMatrix(float *mat) const;
|
|
CMatrix44 GetMatrix() const;
|
|
|
|
// Per coordinate (explicit inline functions)
|
|
void s(const float s) { m_s = s; }
|
|
void v(const CVector3d v) { m_v = v; }
|
|
void x(const float x) { m_v.x(x); }
|
|
void y(const float y) { m_v.y(y); }
|
|
void z(const float z) { m_v.z(z); }
|
|
|
|
// Data access (explicit inline functions)
|
|
float s() const { return m_s; }
|
|
CVector3d v() const { return m_v; }
|
|
float x() const { return m_v.x(); }
|
|
float y() const { return m_v.y(); }
|
|
float z() const { return m_v.z(); }
|
|
|
|
float& operator[](int i)
|
|
{ if(i==0) return (float&)m_s;
|
|
else return (float&)m_v[i-1];}
|
|
const float& operator[](int i) const
|
|
{ if(i==0) return (float&)m_s;
|
|
else return (float&)m_v[i-1];}
|
|
|
|
// Operators
|
|
CQuaternion& operator+=(const CQuaternion& rQuad);
|
|
CQuaternion& operator+=(const CQuaternion* pQuad);
|
|
CQuaternion& operator-=(const CQuaternion& rQuad);
|
|
CQuaternion& operator-=(const CQuaternion* pQuad);
|
|
CQuaternion& operator*=(const float d);
|
|
CQuaternion& operator/=(const float d)
|
|
{ return *this *= (1.f/d); }
|
|
|
|
// Nondestructive unary negation - returns a new vector
|
|
CQuaternion operator -() const;
|
|
|
|
// Binary operators
|
|
friend CQuaternion operator+(const CQuaternion& u, const CQuaternion& v);
|
|
friend CQuaternion operator-(const CQuaternion& u, const CQuaternion& v);
|
|
friend CQuaternion operator*(const CQuaternion& u, const CQuaternion& v);
|
|
friend CQuaternion operator*(const float s, const CQuaternion& u);
|
|
friend CQuaternion operator*(const CQuaternion& u, const float s)
|
|
{ return s * u; }
|
|
friend CQuaternion operator/(const CQuaternion& u, const float s)
|
|
{ return (1.f/s) * u; }
|
|
friend int operator==(const CQuaternion& q1, const CQuaternion& q2);
|
|
friend int operator!=(const CQuaternion& q1, const CQuaternion& q2)
|
|
{ return !(q1 == q2); }
|
|
|
|
int Equals(const CQuaternion& q, const float tolerence) const;
|
|
|
|
|
|
// Misc
|
|
double Normalize();
|
|
double Length() const;
|
|
double LengthSquared() const;
|
|
void Negate();
|
|
CQuaternion Conjugate();
|
|
};
|
|
|
|
#endif // _QUATERNION_
|