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