cgal/Tutorial/tutorial/Polyhedron/Qt/Subdivision/tool/Quaternion.h

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_