File: Wm5HQuaternion.h

package info (click to toggle)
libwildmagic 5.17%2Bcleaned1-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 90,124 kB
  • sloc: cpp: 215,940; csh: 637; sh: 91; makefile: 40
file content (121 lines) | stat: -rw-r--r-- 4,149 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.0.3 (2015/11/27)

#ifndef WM5HQUATERNION_H
#define WM5HQUATERNION_H

#include "Wm5MathematicsLIB.h"
#include "Wm5Float4.h"
#include "Wm5HMatrix.h"

namespace Wm5
{

class WM5_MATHEMATICS_ITEM HQuaternion
{
public:
    // A quaternion is q = w + x*i + y*j + z*k where (w,x,y,z) is not
    // necessarily a unit-length vector in 4D.

    // Construction.
    HQuaternion ();  // uninitialized
    HQuaternion (float w, float x, float y, float z);
    HQuaternion (const HQuaternion& q);

    // HQuaternion for the input rotation matrix.
    HQuaternion (const HMatrix& rot);

    // HQuaternion for the rotation of the axis-angle pair.
    HQuaternion (const AVector& axis, float angle);

    // Coordinate access as an array:  0 = w, 1 = x, 2 = y, 3 = z.
    inline operator const float* () const;
    inline operator float* ();
    inline const float& operator[] (int i) const;
    inline float& operator[] (int i);
    inline float W () const;
    inline float& W ();
    inline float X () const;
    inline float& X ();
    inline float Y () const;
    inline float& Y ();
    inline float Z () const;
    inline float& Z ();

    // Assignment.
    HQuaternion& operator= (const HQuaternion& q);

    // Comparison (for use by STL containers).
    bool operator== (const HQuaternion& q) const;
    bool operator!= (const HQuaternion& q) const;
    bool operator<  (const HQuaternion& q) const;
    bool operator<= (const HQuaternion& q) const;
    bool operator>  (const HQuaternion& q) const;
    bool operator>= (const HQuaternion& q) const;

    // Arithmetic operations.
    HQuaternion operator+ (const HQuaternion& q) const;
    HQuaternion operator- (const HQuaternion& q) const;
    HQuaternion operator* (const HQuaternion& q) const;
    HQuaternion operator* (float scalar) const;
    HQuaternion operator/ (float scalar) const;
    HQuaternion operator- () const;

    WM5_MATHEMATICS_ITEM
    friend HQuaternion operator* (float scalar, const HQuaternion& q);

    // Arithmetic updates.
    HQuaternion& operator+= (const HQuaternion& q);
    HQuaternion& operator-= (const HQuaternion& q);
    HQuaternion& operator*= (float scalar);
    HQuaternion& operator/= (float scalar);

    // Conversion between quaternions, matrices, and axis-angle.
    void FromRotationMatrix (const HMatrix& rot);
    void ToRotationMatrix (HMatrix& rot) const;
    void FromAxisAngle (const AVector& axis, float angle);
    void ToAxisAngle (AVector& axis, float& angle) const;

    // Functions of a quaternion.
    float Length () const;  // length of 4-tuple
    float SquaredLength () const;  // squared length of 4-tuple
    float Dot (const HQuaternion& q) const;  // dot product of 4-tuples
    float Normalize (const float epsilon = 0.0f);
    HQuaternion Inverse () const;  // apply to non-zero quaternion
    HQuaternion Conjugate () const;  // negate x, y, and z terms
    HQuaternion Exp () const;  // apply to quaternion with w = 0
    HQuaternion Log () const;  // apply to unit-length quaternion

    // Rotation of a vector by a quaternion.
    AVector Rotate (const AVector& vec) const;

    // Spherical linear interpolation.
    HQuaternion& Slerp (float t, const HQuaternion& p, const HQuaternion& q);

    // Intermediate terms for spherical quadratic interpolation.
    HQuaternion& Intermediate (const HQuaternion& q0, const HQuaternion& q1,
        const HQuaternion& q2);

    // Spherical quadratic interpolation.
    HQuaternion& Squad (float t, const HQuaternion& q0, const HQuaternion& a0,
        const HQuaternion& a1, const HQuaternion& q1);

    // Special quaternions.
    static const HQuaternion ZERO;
    static const HQuaternion IDENTITY;

private:
    // Order of storage is (w,x,y,z).
    float mTuple[4];
};

#include "Wm5HQuaternion.inl"

}

#endif