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

cubo.h

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= cubo.h                                                    Marzo de 1999 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de la clase CUBO.                                          =
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 #ifndef __CUBO__
00025 #define __CUBO__
00026 
00027 #include "jed_defs.h"
00028 
00029 #ifndef __GEOMETRIA__
00030     #error "No incluya a cubo.h, incluya a geometria.h!"
00031 #endif
00032 
00033 #ifdef VEL_ROSITA
00034     #include "toolkits/geom/geometria.h"
00035 #endif
00036 
00037 class CUBO : public PRIMITIVA_GEOMETRICA 
00038 {
00039   private:
00040     double _lado;
00041     IMAGEN *imagen;
00042   public:
00043     CUBO(double l);
00044     virtual ~CUBO();
00045     double lado(void);
00046     void set_lado(double l);
00047     void minmax(VECTOR *min, VECTOR *max);
00048 #ifdef GL_ENABLED
00049     void
00050     pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material, CAMARA *Camara);
00051 #endif
00052     void pintar_povray(FILE *fd);
00053     void pintar_aqz(FILE *fd);
00054     void anexar_textura(IMAGEN *img);
00055     int clasificar_punto(VECTOR p);
00056     virtual GEOMETRIA *crear_copia(void);
00057     double interseccion(RAYO *Rayo, VECTOR &punto, VECTOR &normal);
00058 };
00059 
00060 //===========================================================================
00061 //= Metodos inline de la clase CUBO                                         =
00062 //===========================================================================
00063 
00064 inline double
00065 CUBO::interseccion(RAYO *Rayo, VECTOR &punto, VECTOR &normal)
00074 {
00075     double t, min_t = INFINITO;
00076     double l2 = _lado/2;  // OJO: Esto deberia venir precalculado
00077     VECTOR p;
00078 
00079     // Plano superior: Z = _lado/2
00080     if ( fabs(Rayo->direccion.z) > EPSILON ) {
00081         // El rayo no es paralelo al plano Z=_lado/2
00082         t = (l2-Rayo->origen.z)/Rayo->direccion.z;
00083         if ( t > -EPSILON ) {
00084             p = Rayo->origen + Rayo->direccion * t;
00085             if ( p.x >= -l2 && p.x <= l2 && 
00086                  p.y >= -l2 && p.y <= l2 ) {
00087                 normal.x = normal.y = 0;
00088                 normal.z = 1;
00089                 punto = p;
00090                 min_t = t;
00091             }
00092         }
00093     }
00094 
00095     // Plano inferior: Z = -_lado/2
00096     if ( fabs(Rayo->direccion.z) > EPSILON ) {
00097         // El rayo no es paralelo al plano Z=-_lado/2
00098         t = (-l2-Rayo->origen.z)/Rayo->direccion.z;
00099         if ( t > -EPSILON && t < min_t ) {
00100             p = Rayo->origen + Rayo->direccion * t;
00101             if ( p.x >= -l2 && p.x <= l2 && 
00102                  p.y >= -l2 && p.y <= l2 ) {
00103                 normal.x = normal.y = 0;
00104                 normal.z = -1;
00105                 punto = p;
00106                 min_t = t;
00107             }
00108         }
00109     }
00110 
00111     // Plano frontal: Y = _lado/2
00112     if ( fabs(Rayo->direccion.y) > EPSILON ) {
00113         // El rayo no es paralelo al plano Y=_lado/2
00114         t = (l2-Rayo->origen.y)/Rayo->direccion.y;
00115         if ( t > -EPSILON && t < min_t ) {
00116             p = Rayo->origen + Rayo->direccion * t;
00117             if ( p.x >= -l2 && p.x <= l2 && 
00118                  p.z >= -l2 && p.z <= l2 ) {
00119                 normal.x = normal.z = 0;
00120                 normal.y = 1;
00121                 punto = p;
00122                 min_t = t;
00123             }
00124         }
00125     }
00126 
00127     // Plano posterior: Y = -_lado/2
00128     if ( fabs(Rayo->direccion.y) > EPSILON ) {
00129         // El rayo no es paralelo al plano Y=-_lado/2
00130         t = (-l2-Rayo->origen.y)/Rayo->direccion.y;
00131         if ( t > -EPSILON && t < min_t ) {
00132             p = Rayo->origen + Rayo->direccion * t;
00133             if ( p.x >= -l2 && p.x <= l2 && 
00134                  p.z >= -l2 && p.z <= l2 ) {
00135                 normal.x = normal.z = 0;
00136                 normal.y = -1;
00137                 punto = p;
00138                 min_t = t;
00139             }
00140         }
00141     }
00142 
00143     // Plano X = _lado/2
00144     if ( fabs(Rayo->direccion.x) > EPSILON ) {
00145         // El rayo no es paralelo al plano X=_lado/2
00146         t = (l2-Rayo->origen.x)/Rayo->direccion.x;
00147         if ( t > -EPSILON && t < min_t ) {
00148             p = Rayo->origen + Rayo->direccion * t;
00149             if ( p.y >= -l2 && p.y <= l2 && 
00150                  p.z >= -l2 && p.z <= l2 ) {
00151                 normal.y = normal.z = 0;
00152                 normal.x = 1;
00153                 punto = p;
00154                 min_t = t;
00155             }
00156         }
00157     }
00158 
00159     // Plano X = -_lado/2
00160     if ( fabs(Rayo->direccion.x) > EPSILON ) {
00161         // El rayo no es paralelo al plano X=-_lado/2
00162         t = (-l2-Rayo->origen.x)/Rayo->direccion.x;
00163         if ( t > -EPSILON && t < min_t ) {
00164             p = Rayo->origen + Rayo->direccion * t;
00165             if ( p.y >= -l2 && p.y <= l2 && 
00166                  p.z >= -l2 && p.z <= l2 ) {
00167                 normal.y = normal.z = 0;
00168                 normal.x = -1;
00169                 punto = p;
00170                 min_t = t;
00171             }
00172         }
00173     }
00174 
00175     if ( min_t < INFINITO ) return min_t;
00176     return 0;
00177 }
00178 
00179 #endif
00180 
00181 //===========================================================================
00182 //= EOF                                                                     =
00183 //===========================================================================
00184 

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.