quaternion.h

Go to the documentation of this file.
00001 /*
00002  * quaternion.h
00003  *
00004  * Copyright (C) 2009  Thomas A. Vaughan
00005  * All rights reserved.
00006  *
00007  *
00008  * Redistribution and use in source and binary forms, with or without
00009  * modification, are permitted provided that the following conditions are met:
00010  *     * Redistributions of source code must retain the above copyright
00011  *       notice, this list of conditions and the following disclaimer.
00012  *     * Redistributions in binary form must reproduce the above copyright
00013  *       notice, this list of conditions and the following disclaimer in the
00014  *       documentation and/or other materials provided with the distribution.
00015  *     * Neither the name of the <organization> nor the
00016  *       names of its contributors may be used to endorse or promote products
00017  *       derived from this software without specific prior written permission.
00018  *
00019  * THIS SOFTWARE IS PROVIDED BY THOMAS A. VAUGHAN ''AS IS'' AND ANY
00020  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00021  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00022  * DISCLAIMED. IN NO EVENT SHALL THOMAS A. VAUGHAN BE LIABLE FOR ANY
00023  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00024  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00025  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00026  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00027  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00028  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029  *
00030  *
00031  * Basic quaternion objects (used mostly for 3D rotations).
00032  */
00033 
00034 #ifndef WAVEPACKET_QUATERNION_H__
00035 #define WAVEPACKET_QUATERNION_H__
00036 
00037 // includes --------------------------------------------------------------------
00038 #include "geometry_3d.h"
00039 
00040 
00041 /// \ingroup geometry
00042 /*@{*/
00043 
00044 
00045 // common typedefs -------------------------------------------------------------
00046 
00047 
00048 /// Basic quaternion object.  Mostly used for 3D object orientation.
00049 struct quaternion_t {
00050         // constructors --------------------------------------------------------
00051         quaternion_t(void) throw() {}
00052         quaternion_t(IN const quaternion_t& q) throw() { *this = q; }
00053 
00054         // manipulators --------------------------------------------------------
00055         void clear(void) throw() {
00056                         x = y = z = 0.0;
00057                         w = 1.0;
00058                 }
00059 
00060         /// set quaternion based on the provided Euler angles
00061         void setEulerZYX(IN float yaw, IN float pitch, IN float roll) throw();
00062 
00063         void setEulerZYX(IN const point3d_t& euler) throw() {
00064                         this->setEulerZYX(euler.z, euler.y, euler.x);
00065                 }
00066 
00067         void operator=(IN const quaternion_t& q) throw() {
00068                         x = q.x;
00069                         y = q.y;
00070                         z = q.z;
00071                         w = q.w;
00072                 }
00073 
00074         void dump(IN const char * msg) const throw() {
00075                         DPRINTF("%s: x=%f, y=%f, z=%f, w=%f", msg,
00076                             x, y, z, w);
00077                 }
00078 
00079         // data fields ---------------------------------------------------------
00080         float           x;
00081         float           y;
00082         float           z;
00083         float           w;
00084 };
00085 
00086 
00087 #endif  // WAVEPACKET_QUATERNION_H__
00088