Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

quaternion.h

Ir a la documentación de este archivo.
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 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.