00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
00064
00065
00066 inline double
00067 FLECHA::interseccion(RAYO *Rayo, VECTOR &punto, VECTOR &normal)
00072 {
00073
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
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();
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();
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
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
00117 punto = R * punto;
00118 punto = punto + poc;
00119 normal = R * normal;
00120 }
00121
00122
00123 return t;
00124 }
00125
00126
00127
00128
00129