1 /****************************************************************************
3 quaternion.h - A quaternion class
5 GLUI User Interface Toolkit (LGPL)
6 Copyright (c) 1998 Paul Rademacher
8 ---------------------------------------------------------------------
10 WWW: http://sourceforge.net/projects/glui/
11 Forums: http://sourceforge.net/forum/?group_id=92496
13 This library is free software; you can redistribute it and/or
14 modify it under the terms of the GNU Lesser General Public
15 License as published by the Free Software Foundation; either
16 version 2.1 of the License, or (at your option) any later version.
18 This library is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 Lesser General Public License for more details.
23 You should have received a copy of the GNU Lesser General Public
24 License along with this library; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 *****************************************************************************/
29 #ifndef GLUI_QUATERNION_H
30 #define GLUI_QUATERNION_H
35 /* this line defines a new type: pointer to a function which returns a */
36 /* float and takes as argument a float */
37 typedef float (*V_FCT_PTR)(float);
39 /****************************************************************
41 ****************************************************************/
48 vec3 v; /* vector component */
49 float s; /* scalar component */
56 quat(float x, float y, float z, float w);
57 quat(const vec3 &v, float s);
58 quat(float s, const vec3 &v);
59 quat(const float *d); /* copy from four-element float array */
60 quat(const double *f); /* copy from four-element double array */
61 quat(const quat &q); /* copy from other quat */
63 /* Assignment operators */
65 quat &operator = (const quat &v); /* assignment of a quat */
66 quat &operator += (const quat &v); /* incrementation by a quat */
67 quat &operator -= (const quat &v); /* decrementation by a quat */
68 quat &operator *= (float d); /* multiplication by a constant */
69 quat &operator /= (float d); /* division by a constant */
71 /* special functions */
73 float length() const; /* length of a quat */
74 float length2() const; /* squared length of a quat */
75 quat &normalize(); /* normalize a quat */
76 quat &apply(V_FCT_PTR fct); /* apply a func. to each component */
77 vec3 xform(const vec3 &v ); /* q*v*q-1 */
79 void set_angle(float f); /* set rot angle (degrees) */
80 void scale_angle(float f); /* scale rot angle (degrees) */
81 float get_angle() const; /* set rot angle (degrees) */
82 vec3 get_axis() const; /* get axis */
84 void print( FILE *file, const char *name ) const; /* print to a file */
86 float &operator [] (int i); /* indexing */
87 const float &operator [] (int i) const; /* indexing */
89 void set(float x, float y, float z); /* set quat */
90 void set(const vec3 &v, float s); /* set quat */
94 friend quat operator - (const quat &v); /* -q1 */
95 friend quat operator + (const quat &a, const quat &b); /* q1 + q2 */
96 friend quat operator - (const quat &a, const quat &b); /* q1 - q2 */
97 friend quat operator * (const quat &a, float d); /* q1 * 3.0 */
98 friend quat operator * (float d, const quat &a); /* 3.0 * q1 */
99 friend quat operator * (const quat &a, const quat &b); /* q1 * q2 */
100 friend quat operator / (const quat &a, float d); /* q1 / 3.0 */
101 friend int operator == (const quat &a, const quat &b); /* q1 == q2 ? */
102 friend int operator != (const quat &a, const quat &b); /* q1 != q2 ? */
103 friend void swap(quat &a, quat &b); /* swap q1 &q2 */
104 /*friend quat min(const quat &a, const quat &b); -- min(q1, q2) */
105 /*friend quat max(const quat &a, const quat &b); -- max(q1, q2) */
106 friend quat prod(const quat &a, const quat &b); /* term by term mult*/
109 /* Utility functions */
111 quat quat_identity(); /* Returns quaternion identity element */
112 quat quat_slerp(const quat &from, const quat &to, float t);