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

cosa.h

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= cosa.h                                                    Julio de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de la clase COSA                                           =
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 __COSA__
00023 #define __COSA__
00024 
00025 #include "jed_defs.h"
00026 #include "entidad.h"
00027 #include "toolkits/geom/geometria.h"
00028 #include "toolkits/geom/mesh.h"
00029 #include "core/simul/solver.h"
00030 #include "matriz4.h"
00031 #include "core/campos/campo.h"
00032 
00033 //===========================================================================
00034 //= DEFINICION DE CLASES AUXILIARES                                         =
00035 //===========================================================================
00036 
00037 class FUERZA_PUNTO 
00046 {
00047   public:
00048     VECTOR fuerza;
00049     VECTOR punto;
00050 };
00051 
00052 class RESORTE;
00053 
00054 //===========================================================================
00055 //= DEFINICION DE LA CLASE COSA                                             =
00056 //===========================================================================
00057 
00058 enum ENUM_CATEGORIAS_COSAS {
00059     CC_DESCONOCIDA = 0,
00060     CC_MASA_PUNTUAL,
00061     CC_COSA_RIGIDA,
00062     CC_TELA,
00063     CC_AVATAR_QUAKE,
00064     CC_ESPACIO_ABIERTO
00065 };
00066 
00067 class COSA : public ENTIDAD, public ECUACION_DIFERENCIAL
00101 {
00102   private:
00103     void leer_material(char *nombre); 
00104 
00105   protected:
00106     //- Variables fisicas basicas -------------------------------------------
00107     VECTOR _posicion;        
00108 
00109     VECTOR _velocidad;       
00110     double _masa;            
00111     double _ke;              
00112 
00113 
00114     //- Artificios del modelo AQUYNZA ---------------------------------------
00115     BOOLEAN _estoy_fijo;     
00116 
00117     MATERIAL *Material;      
00118     COLOR _color;            
00119     COSA *Padre;             
00120 
00121     char *_nombre_padre;
00122 
00123     // Informacion calculada dinamicamente
00124     int _tipo_de_cosa;       
00125     LISTA<FUERZA_PUNTO *>    
00126         lista_fuerzas_externas;    
00127 
00128     //- Servicios privados --------------------------------------------------
00129     void limpiar_fuerzas(void);  
00130     BOOLEAN
00131     leer_basico(TOKENIZADOR *Sabiondo, char *cad, BOOLEAN *cmc);
00132     void grabar_basico(FILE *fd);
00133 
00134   public:
00135     //- Operaciones basicas (manejo de la representacuon) -------------------
00136     COSA();                  
00137     virtual ~COSA();         
00138     virtual COSA *crear_copia(void); 
00139     inline double masa(void);
00140     inline double ke(void);
00141     virtual BOOLEAN          
00142     consultar_variable(const char *nombre_variable, int &tipo, void **ref);
00143     BOOLEAN
00144     actualizar_variable(const char *nombre_variable, int tipo, void *ref);
00145     char *nombre_padre(void);
00146     void asociar_padre(COSA *p);
00147     BOOLEAN estoy_fijo(void);
00148     int tipo_de_cosa(void);
00149 
00150     //- Operaciones basicas (fisicas) ---------------------------------------
00151     VECTOR posicion(void);   
00152 
00153     virtual VECTOR posicion_absoluta(VECTOR p);
00157     virtual QUATERNION orientacion_absoluta(void);
00158     inline VECTOR velocidad_absoluta(void);
00159     inline void set_posicion_absoluta(VECTOR p);
00160     inline void set_velocidad_absoluta(VECTOR v);
00161     virtual VECTOR velocidad_angular_absoluta(void);
00162     virtual void set_velocidad_angular_absoluta(VECTOR omega);
00163     virtual MATRIZ_4x4 tensor_de_inercia(void);
00164     virtual GEOMETRIA *geometria(void) = 0;
00165     inline void anexar_fuerza(VECTOR fuerza, VECTOR p);
00166     virtual void aplicar_campo_vectorial(CAMPO_VECTORIAL *Campo);
00167     virtual void aplicar_drag(double Kd);
00168     double altura(VECTOR p);
00169 
00170     //- Operaciones de simulacion -------------------------------------------
00171     virtual void actualizar(double delta_t) = 0;
00172     virtual int ODE_numero_de_variables_de_estado(void) = 0;
00173     virtual void ODE_reportar_variables_de_estado(double *Datos) = 0;
00174     virtual void ODE_actualizar_variables_de_estado(double *Datos) = 0;
00175     virtual void ODE_calcular_la_primera_derivada(double *Datos) = 0;
00176 
00177     //- Operaciones de consulta y visualizacion -----------------------------
00178     virtual void minmax(VECTOR *min, VECTOR *max) = 0;
00179     virtual double interseccion(RAYO *Rayo, VECTOR *Punto, VECTOR *Normal);
00180 
00181 #ifdef GL_ENABLED
00182     virtual void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara) = 0;
00183 #endif
00184     virtual void pintar_povray(FILE *fd);
00185     MATERIAL *material(void);
00186     COLOR color(void);
00187 
00188     //- Operaciones de persistencia -----------------------------------------
00189     virtual BOOLEAN leer(TOKENIZADOR *Sabiondo) = 0;
00190     virtual BOOLEAN resolver(LISTA <COSA *> *Cosas);
00191     virtual void grabar(FILE *fd) = 0;
00192 };
00193 
00194 inline double
00195 COSA::masa(void)
00196 {
00197     return _masa;
00198 }
00199 
00200 inline double
00201 COSA::ke(void)
00202 {
00203     return _ke;
00204 }
00205 
00206 inline VECTOR
00207 COSA::velocidad_absoluta(void)
00208 {
00209     // MUCHO OJO! No se ha implementado! Debe utilizar la _orientacion, la
00210     // _velocidad y la velocidad_absoluta del padre si lo hay!
00211     return _velocidad;
00212 }
00213 
00214 inline void
00215 COSA::set_velocidad_absoluta(VECTOR v)
00216 {
00217     // MUCHO OJO! No se ha implementado! Debe utilizar la _orientacion, la
00218     // _velocidad y la velocidad_absoluta del padre si lo hay!
00219     _velocidad = v;
00220 }
00221 
00222 inline void
00223 COSA::set_posicion_absoluta(VECTOR p)
00224 {
00225     // MUCHO OJO! No se ha implementado! Debe utilizar la _orientacion, la
00226     // _posicion y la posicion_absoluta del padre si lo hay!
00227     _posicion = p;
00228 }
00229 
00230 inline void
00231 COSA::anexar_fuerza(VECTOR fuerza, VECTOR p)
00240 {
00241     FUERZA_PUNTO *F = new FUERZA_PUNTO;
00242 
00243     if ( !F ) {
00244         fprintf(stderr, "<COSA> - ERROR de memoria insertando una fuerza!\n");
00245         fflush(stderr);
00246         return;
00247     }
00248 
00249     F->fuerza = fuerza;
00250     F->punto = p;
00251     lista_fuerzas_externas.anx(F);
00252 }
00253 
00254 //===========================================================================
00255 //= DEFINICION DE LA JERARQUIA DE CLASES DE COSAS                           =
00256 //===========================================================================
00257 
00258 class TELA;
00259 
00260 class MASA_PUNTUAL : public COSA
00267 {
00268   public:
00269     BOOLEAN en_colision; // OJO: Esto es machete!
00270  
00271     //- Operaciones basicas (manejo de la representacuon) -------------------
00272     MASA_PUNTUAL();
00273     virtual ~MASA_PUNTUAL();
00274     virtual COSA *crear_copia(void);
00275     BOOLEAN
00276     consultar_variable(const char *nombre_variable, int &tipo, void **ref);
00277 
00278     //- Operaciones basicas (fisicas) ---------------------------------------
00279     GEOMETRIA *geometria(void);  // OJO: Retorna NULL!
00280 
00281     //- Operaciones de simulacion -------------------------------------------
00282     void actualizar(double delta_t);
00283     int ODE_numero_de_variables_de_estado(void);
00284     void ODE_reportar_variables_de_estado(double *Datos);
00285     void ODE_actualizar_variables_de_estado(double *Datos);
00286     void ODE_calcular_la_primera_derivada(double *Datos);
00287 
00288     //- Operaciones de consulta (visualizacion) -----------------------------
00289     void minmax(VECTOR *min, VECTOR *max);
00290 #ifdef GL_ENABLED
00291     void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara);
00292 #endif
00293     void pintar_povray(FILE *fd);
00294 
00295     //- Operaciones de persistencia -----------------------------------------
00296     BOOLEAN leer(TOKENIZADOR *Sabiondo);
00297     void grabar(FILE *fd);
00298 
00299     friend class TELA; // Acceso irrestringido por razones de eficiencia!
00300 };
00301 
00302 class COSA_RIGIDA : public COSA
00317 {
00318   protected:
00319     //- Variables fisicas basicas -------------------------------------------
00320     VECTOR _centro_de_masa;  // Posicion relativa al centro geometrico
00321     VECTOR _velocidad_angular;
00322     QUATERNION _orientacion;
00323     MATRIZ_4x4 tensor_de_inercia_0; // Modela la distribucion de la masa
00324 
00325     BOOLEAN leer_rigida(TOKENIZADOR *Sabiondo, char *cad);
00326     void resolver_tensor_de_inercia(void);
00327 
00328   private:
00329     GEOMETRIA *Geometria;
00330     double _ultimo_Kd; // Ultimo coeficiente de viscosidad
00331 
00332   public:
00333     //- Operaciones basicas (manejo de la representacuon) -------------------
00334     COSA_RIGIDA();
00335     virtual ~COSA_RIGIDA();
00336     virtual COSA *crear_copia(void);
00337     BOOLEAN
00338     consultar_variable(const char *nombre_variable, int &tipo, void **ref);
00339     BOOLEAN
00340     actualizar_variable(const char *nombre_variable, int tipo, void *ref);
00341     //- Operaciones basicas (fisicas) ---------------------------------------
00342     GEOMETRIA *geometria(void);
00343     VECTOR posicion_absoluta(VECTOR p); // Redefine la de COSA
00344     VECTOR velocidad_angular_absoluta(void);
00345     void set_velocidad_angular_absoluta(VECTOR omega);
00346     MATRIZ_4x4 tensor_de_inercia(void);
00347     QUATERNION orientacion_absoluta(void);
00348     void set_orientacion_absoluta(QUATERNION q);
00349     void aplicar_drag(double Kd);
00350 
00351     //- Operaciones de simulacion -------------------------------------------
00352     void tick(void);  // OJO: Esto debe borrarse! - Es una prueba!
00353     void actualizar(double delta_t);
00354     int ODE_numero_de_variables_de_estado(void);
00355     void ODE_reportar_variables_de_estado(double *Datos);
00356     void ODE_actualizar_variables_de_estado(double *Datos);
00357     void ODE_calcular_la_primera_derivada(double *Datos);
00358 
00359     //- Operaciones de consulta (visualizacion) -----------------------------
00360     void minmax(VECTOR *min, VECTOR *max);
00361     virtual double interseccion(RAYO *Rayo, VECTOR *Punto, VECTOR *Normal);
00362 #ifdef GL_ENABLED
00363     void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara);
00364 #endif
00365     void pintar_povray(FILE *fd);
00366 
00367     //- Operaciones de persistencia -----------------------------------------
00368     BOOLEAN leer(TOKENIZADOR *Sabiondo);
00369     BOOLEAN resolver(LISTA <COSA *> *Cosa);
00370     void grabar(FILE *fd);
00371 };
00372 
00373 class COSA_FLEXIBLE : public COSA {
00374   public:
00375     COSA_FLEXIBLE();
00376     virtual ~COSA_FLEXIBLE();
00377 
00378     //- Operaciones basicas (manejo de la representacuon) -------------------
00379     virtual GEOMETRIA *geometria(void) = 0;
00380 
00381     //- Operaciones de simulacion -------------------------------------------
00382     virtual void actualizar(double delta_t) = 0;
00383     virtual int ODE_numero_de_variables_de_estado(void) = 0;
00384     virtual void ODE_reportar_variables_de_estado(double *Datos) = 0;
00385     virtual void ODE_actualizar_variables_de_estado(double *Datos) = 0;
00386     virtual void ODE_calcular_la_primera_derivada(double *Datos) = 0;
00387 
00388     //- Operaciones de consulta (visualizacion) -----------------------------
00389     virtual void minmax(VECTOR *min, VECTOR *max) = 0;
00390 #ifdef GL_ENABLED
00391     virtual void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara) = 0;
00392 #endif
00393     virtual void pintar_povray(FILE *fd) = 0;
00394 
00395     //- Operaciones de persistencia -----------------------------------------
00396     virtual BOOLEAN leer(TOKENIZADOR *Sabiondo) = 0;
00397 };
00398 
00399 class TELA : public COSA_FLEXIBLE {
00400   private:
00401     //- Modelo fisico de la tela (tomado del modelo de o-fuente) ------------
00402     RESORTE *plantilla[3]; // Contiene las propiedades de los 3 tipos de 
00403                           // resorte del modelo MASA_PUNTUAL/RESORTE
00404     int x_tam;            // Cota al tamanno de la malla de masas en el
00405     int y_tam;            // modelo de la tela
00406     MASA_PUNTUAL *Arr_masas;  // Arreglo dinamico de x_tam * y_tam MASAS.
00407     RESORTE *Resortes1;  // Estos son arreglos dinamicos con sus tamannos
00408     int num_resortes1;    // para cada uno de los tres tipos de resortes
00409     RESORTE *Resortes2;  // definidos en el modelo masa/resorte de
00410     int num_resortes2;    // Omar Fuentes (o-fuente).
00411     RESORTE *Resortes3;  
00412     int num_resortes3;    
00413 
00414     //- Artificios AQUYNZA --------------------------------------------------
00415     BOOLEAN recien_simulado;  
00416     IMAGEN *Textura;
00417     MESH *Superficie;
00418 
00419     BOOLEAN leer_resortes(TOKENIZADOR *Sabiondo, int tipo);
00420     BOOLEAN leer_malla(TOKENIZADOR *Sabiondo);
00421     BOOLEAN precalcular_resortes(void);
00422 
00423     //- Operaciones para la administracion de la malla de triangulos --------
00424     VECTOR calcule_subnormal(int i1,int j1,int i2,int j2,int i3,int j3);
00425     VECTOR calcule_normal(int i, int j);
00426 
00427   public:
00428     TELA();
00429     virtual ~TELA();
00430 
00431     //- Operaciones basicas (manejo de la representacuon) -------------------
00432     GEOMETRIA *geometria(void);
00433     void aplicar_campo_vectorial(CAMPO_VECTORIAL *Campo);
00434     void aplicar_drag(double Kd);
00435 
00436     //- Operaciones de simulacion -------------------------------------------
00437     void actualizar(double delta_t);
00438     int ODE_numero_de_variables_de_estado(void);
00439     void ODE_reportar_variables_de_estado(double *Datos);
00440     void ODE_actualizar_variables_de_estado(double *Datos);
00441     void ODE_calcular_la_primera_derivada(double *Datos);
00442 
00443     //- Operaciones de consulta (visualizacion) -----------------------------
00444     void minmax(VECTOR *min, VECTOR *max);
00445 #ifdef GL_ENABLED
00446     void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara);
00447 #endif
00448     void pintar_povray(FILE *fd);
00449 
00450     //- Operaciones de persistencia -----------------------------------------
00451     BOOLEAN leer(TOKENIZADOR *Sabiondo);
00452     void grabar(FILE *fd);
00453 
00454     //- Especificas de la tela ----------------------------------------------
00455     inline int num_masas(void);
00456     inline MASA_PUNTUAL *masa_puntual(int i);
00457 };
00458 
00459 class AVATAR_QUAKE : public COSA_FLEXIBLE {
00460   private:
00461     //- Artificios AQUYNZA --------------------------------------------------
00462     IMAGEN *Textura;
00463     MESH *Superficie;
00464 
00465   public:
00466     AVATAR_QUAKE();
00467     virtual ~AVATAR_QUAKE();
00468 
00469     //- Operaciones basicas (manejo de la representacuon) -------------------
00470     GEOMETRIA *geometria(void);
00471 
00472     //- Operaciones de simulacion -------------------------------------------
00473     void actualizar(double delta_t);
00474 
00475     //- Operaciones de consulta (visualizacion) -----------------------------
00476 #ifdef GL_ENABLED
00477     void pintar_gl(CALIDAD_VISUAL *Calidad, CAMARA *Camara);
00478 #endif
00479     void pintar_povray(FILE *fd);
00480 
00481     //- Operaciones de persistencia -----------------------------------------
00482     BOOLEAN leer(TOKENIZADOR *Sabiondo);
00483     void grabar(FILE *fd);
00484 };
00485 
00486 inline int
00487 TELA::num_masas(void)
00488 {
00489     return x_tam * y_tam;
00490 }
00491 
00492 inline MASA_PUNTUAL *
00493 TELA::masa_puntual(int i)
00494 {
00495     return &Arr_masas[i];
00496 }
00497 
00498 #ifndef VEL_ROSITA
00499     #include "core/uniones/union.h"
00500 #endif
00501 
00502 #endif // __COSA__
00503 
00504 //===========================================================================
00505 //= EOF                                                                     =
00506 //===========================================================================
00507 

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.