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

flecha.h

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= flecha.h                                             Septiembre de 1999 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de la clase FLECHA                                         =
00005 //= NOTA: No incluya este encabezado en los modulos.  Incluya a             =
00006 //=       geometria.h.                                                      =
00007 //=-------------------------------------------------------------------------=
00008 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00009 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00010 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00011 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00012 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00013 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00014 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00015 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00016 //=-------------------------------------------------------------------------=
00017 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00018 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00019 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00020 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00021 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00022 //===========================================================================
00023 
00024 #include "jed_defs.h"
00025 
00026 #ifndef __GEOMETRIA__
00027     #error "No incluya a flecha.h, incluya a geometria.h!"
00028 #endif
00029 
00030 #ifdef VEL_ROSITA
00031     #include "toolkits/geom/geometria.h"
00032 #endif
00033 
00034 class FLECHA : public GEOMETRIA_3D {
00035   private:
00036     double largo_flecha;
00037     double largo_punta;
00038     double grosor_cuerpo;
00039     double grosor_punta;
00040 
00041     CILINDRO _punta;
00042     CILINDRO _cuerpo;
00043 
00044   public:
00045     FLECHA(double l_flecha, double l_punta, double g_cuerpo, double g_punta);
00046     virtual ~FLECHA();
00047 
00048     double interseccion(RAYO *Rayo, VECTOR &punto, VECTOR &normal);
00049 
00050     void minmax(VECTOR *min, VECTOR *max);
00051 #ifdef GL_ENABLED
00052     void
00053     pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material, CAMARA *Camara);
00054 #endif
00055     void pintar_povray(FILE *fd);
00056     void pintar_aqz(FILE *fd);
00057     virtual void anexar_textura(IMAGEN *img);
00058     virtual int clasificar_punto(VECTOR p);
00059     virtual GEOMETRIA *crear_copia(void);
00060 };
00061 
00062 //===========================================================================
00063 //= Metodos inline de la clase FLECHA                                         =
00064 //===========================================================================
00065 
00066 inline double
00067 FLECHA::interseccion(RAYO *Rayo, VECTOR &punto, VECTOR &normal)
00072 {
00073     //- OJO: Esto deberia optimizarce! -------------------------------------
00074     MATRIZ_4x4 R, R_i;
00075     VECTOR pop((largo_flecha-largo_punta)/2, 0, 0);
00076     VECTOR poc(-largo_punta/2, 0, 0);
00077     RAYO rayo_punta;
00078     RAYO rayo_cuerpo;
00079     
00080     R.rotacion_angulos_euler(0, -PI/2, 0);
00081     R_i = R.inversa();
00082 
00083     // Transformo los rayito al sistema de coordenadas de los cilindros
00084     rayo_cuerpo.origen = Rayo->origen - poc;
00085     rayo_cuerpo.origen = R_i * rayo_cuerpo.origen;
00086     rayo_cuerpo.direccion = R_i * Rayo->direccion;
00087     rayo_cuerpo.direccion.normalizar(); // Esto es necesario?
00088 
00089     rayo_punta.origen = Rayo->origen - pop;
00090     rayo_punta.origen = R_i * rayo_punta.origen;
00091     rayo_punta.direccion = R_i * Rayo->direccion;
00092     rayo_punta.direccion.normalizar(); // Esto es necesario?
00093 
00094     //-----------------------------------------------------------------------
00095     double t_punta, t_cuerpo, t = 0;
00096     VECTOR p_punta, p_cuerpo, n_punta, n_cuerpo;
00097 
00098     t_punta = _punta.interseccion(&rayo_punta, p_punta, n_punta);
00099     t_cuerpo = _cuerpo.interseccion(&rayo_cuerpo, p_cuerpo, n_cuerpo);
00100 
00101     if ( !IGUAL(t_punta, 0.0) && (IGUAL(t_cuerpo, 0) || t_punta < t_cuerpo) ) {
00102         t = t_punta;
00103         punto = p_punta;
00104         normal = n_punta;
00105 
00106         // De regreso al espacio de la flecha...
00107         punto  = R * punto;
00108         punto  = punto + pop;
00109         normal = R * normal;
00110     }
00111     else {
00112         t = t_cuerpo;
00113         punto = p_cuerpo;
00114         normal = n_cuerpo;
00115 
00116         // De regreso al espacio de la flecha...
00117         punto  = R * punto;
00118         punto  = punto + poc;
00119         normal = R * normal;
00120     }
00121 
00122     //-----------------------------------------------------------------------
00123     return t;
00124 }
00125 
00126 //===========================================================================
00127 //= EOF                                                                     =
00128 //===========================================================================
00129 

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.