00001 //=========================================================================== 00002 //= quaternion.h Mayo de 1999 = 00003 //=-------------------------------------------------------------------------= 00004 //= Definiciones de la clase QUATERNION = 00005 //=-------------------------------------------------------------------------= 00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO = 00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN = 00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES, = 00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO, = 00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO, = 00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA = 00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES = 00013 //= ("ACTIVIDADES DE ALGO RIESGO"). = 00014 //=-------------------------------------------------------------------------= 00015 //= Autor original: Oscar J. Chavarro G. A.K.A. JEDILINK. Copyright (c), = 00016 //= 1997 - 2003, oscarchavarro@hotmail.com = 00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia = 00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la = 00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. = 00020 //=========================================================================== 00021 00022 #ifndef __QUATERNION__ 00023 #define __QUATERNION__ 00024 00025 #include "jed_defs.h" 00026 #include "vector.h" 00027 00028 class QUATERNION 00034 { 00035 public: 00036 VECTOR direccion; 00037 double magnitud; 00038 00039 inline QUATERNION operator * (QUATERNION a); 00040 inline QUATERNION operator + (QUATERNION a); 00041 inline QUATERNION operator * (double n); 00042 inline QUATERNION inversa(void); 00043 inline void importar_quaternion_puro(VECTOR v); 00044 inline void importar_angulo_eje(double angulo, VECTOR eje); 00045 inline double norma(void); 00046 inline void normalizar(void); 00047 00048 //inline void exportar_angulo_eje(double &angulo, VECTOR &eje); 00049 /* 00050 Conjugate: q* = [w, -v] 00051 Norm: N(q) = w2 + x2 + y2 + z2 00052 Inverse: q-1 = q* / N(q) 00053 Unit Quaternion: q is a unit quaternion if N(q)= 1 and then q-1 = q* 00054 00055 inline conjugado 00056 inline unidad 00057 00058 inline identidad(); 00059 // ? No se sabe, porque es [1, (0,0,0)] cuando esta en multiplicacion 00060 // y es [0, (0,0,0)] cuando esta en suma! 00061 */ 00062 00063 }; 00064 00065 inline void 00066 QUATERNION::importar_angulo_eje(double angulo, VECTOR eje) 00073 { 00074 magnitud = cos(angulo/2); 00075 direccion = eje * sin(angulo/2); 00076 } 00077 00078 #ifdef NONONO 00079 inline void 00080 QUATERNION::exportar_angulo_eje(double &angulo, VECTOR &eje) 00083 { 00084 //angulo = 2 * acos(magnitud); 00085 //eje = direccion * (1/sin(angulo/2)); 00086 angulo = 0; 00087 eje = direccion; 00088 } 00089 #endif 00090 00091 inline QUATERNION 00092 QUATERNION::operator * (QUATERNION a) 00098 { 00099 QUATERNION b; 00100 00101 b.magnitud = magnitud * a.magnitud - direccion.producto_punto(a.direccion); 00102 00103 b.direccion = a.direccion*magnitud + direccion*a.magnitud + 00104 direccion.producto_cruz(a.direccion); 00105 00106 return b; 00107 } 00108 00109 inline QUATERNION 00110 QUATERNION::operator + (QUATERNION a) 00115 { 00116 QUATERNION b; 00117 00118 b.magnitud = magnitud + a.magnitud; 00119 b.direccion = direccion + a.direccion; 00120 00121 return b; 00122 } 00123 00124 inline QUATERNION 00125 QUATERNION::operator * (double n) 00131 { 00132 QUATERNION b; 00133 00134 b.magnitud = magnitud * n; 00135 b.direccion = direccion * n; 00136 00137 return b; 00138 } 00139 00140 inline QUATERNION 00141 QUATERNION::inversa(void) 00150 { 00151 QUATERNION inversa; 00152 double denominador = ( (magnitud*magnitud) + 00153 (direccion.x*direccion.x) + 00154 (direccion.y*direccion.y) + 00155 (direccion.z*direccion.z*direccion.z) ); 00156 00157 inversa.magnitud = magnitud; 00158 inversa.direccion = direccion * (-1); 00159 inversa = inversa * (1/denominador); 00160 00161 return inversa; 00162 } 00163 00164 inline void 00165 QUATERNION::importar_quaternion_puro(VECTOR v) 00166 { 00167 magnitud = 0; 00168 direccion = v; 00169 } 00170 00171 inline double 00172 QUATERNION::norma(void) 00173 { 00174 return (magnitud * magnitud) + direccion.producto_punto(direccion); 00175 } 00176 00177 inline void 00178 QUATERNION::normalizar(void) 00179 { 00180 double n = norma(); 00181 magnitud *= 1/n; 00182 direccion *= 1/n; 00183 } 00184 00185 #endif // __QUATERNION__ 00186 00187 //=========================================================================== 00188 //= EOF = 00189 //=========================================================================== 00190