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

campo.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= campo.cc                                         Julio - agosto de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de la clase CAMPO                                          =
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 #include <stdio.h>
00023 #include <string.h>
00024 
00025 #include <math.h>
00026 #include "core/campos/campo.h"
00027 
00028 //===========================================================================
00029 //===========================================================================
00030 
00031 CAMPO::CAMPO()
00032 {
00033     strcpy(_nombre, "<ANONIMO>");
00034 }
00035 
00036 char *
00037 CAMPO::nombre(void)
00038 {
00039     return _nombre;
00040 }
00041 
00042 void
00043 CAMPO::set_nombre(const char *n)
00044 {
00045     strcpy(_nombre, n);
00046 }
00047 
00048 
00049 //===========================================================================
00050 //===========================================================================
00051 
00052 CAMPO_VECTORIAL::CAMPO_VECTORIAL() : CAMPO()
00053 {
00054     ;
00055 }
00056 
00057 CAMPO_VECTORIAL::~CAMPO_VECTORIAL()
00058 {
00059     ;
00060 }
00061 
00062 //===========================================================================
00063 //= Clase CAMPO_V_CONSTANTE                                                 =
00064 //===========================================================================
00065 
00066 CAMPO_V_CONSTANTE::CAMPO_V_CONSTANTE(VECTOR val_inic) : CAMPO_VECTORIAL()
00067 {
00068     _valor = val_inic;
00069 }
00070 
00071 CAMPO_V_CONSTANTE::~CAMPO_V_CONSTANTE()
00072 {
00073     ;
00074 }
00075 
00076 VECTOR
00077 CAMPO_V_CONSTANTE::valor(VECTOR /*posicion*/)
00078 {
00079     return _valor;
00080 }
00081 
00082 void
00083 CAMPO_V_CONSTANTE::set_valor(VECTOR nuevo_valor)
00084 {
00085     _valor = nuevo_valor;
00086 }
00087 
00088 
00089 //===========================================================================
00090 //= Clase CAMPO_V_ALMACENADO                                                =
00091 //===========================================================================
00092 
00093 CAMPO_V_ALMACENADO::CAMPO_V_ALMACENADO(char * /*archivo*/, VECTOR min, VECTOR max)
00094 : CAMPO_VECTORIAL()
00095 {
00096     DATa = NULL;
00097     escala.x = escala.y = escala.z = 1.0;
00098     x_tam = y_tam = z_tam = 0;
00099     //
00100     //
00101     offset = min;
00102     escala = (max - min);
00103     escala.x /= (double)x_tam;
00104     escala.y /= (double)y_tam;
00105     escala.z /= (double)z_tam;
00106 }
00107 
00108 #define VERIFICAR(x) \
00109     if ( !(x) ) { \
00110         fprintf(stderr, "<CAMPO_VECTORIAL> ERROR: Memoria insuficiente!"); \
00111         fflush(stderr); \
00112         return; \
00113     }
00114 
00115 #define VERIFICARF(x) \
00116     if ( !(x) ) { \
00117         fprintf(stderr, "<CAMPO_VECTORIAL> ERROR: Memoria insuficiente!"); \
00118         fflush(stderr); \
00119         return FALSE; \
00120     }
00121 
00122 CAMPO_V_ALMACENADO::CAMPO_V_ALMACENADO(int x, int y, int z, 
00123                                        VECTOR min, VECTOR max)
00124 {
00125     int i, j, k;
00126 
00127     DATa = NULL;
00128     escala.x = escala.y = escala.z = 1.0;
00129     x_tam = x;
00130     y_tam = y;
00131     z_tam = z;
00132 
00133     //- Cree un campo con [x_tam][y_tam][z_tam] elementos ------------------
00134     DATa = new VECTOR** [x_tam];
00135     VERIFICAR(DATa);
00136     for ( i = 0; i < x_tam; i++ ) {
00137         DATa[i] = new VECTOR* [y_tam];
00138         VERIFICAR(DATa[i]);
00139         for ( j = 0; j < y_tam; j++ ) {
00140             DATa[i][j] = new VECTOR[z_tam];
00141             VERIFICAR(DATa[i][j]);
00142             for ( k = 0; k < z_tam; k++ ) {
00143               //DATa[i][j][k].x = 10*((double)(i+1)/4);
00144               //DATa[i][j][k].y = 10*((double)(j+1)/4);
00145               //DATa[i][j][k].z = 0;
00146                 if ( i < x_tam/2 ) {
00147                     DATa[i][j][k].x = 10;
00148                   }
00149                   else {
00150                     DATa[i][j][k].x = -10;
00151                 }
00152                 if ( j < y_tam/2 ) {
00153                     DATa[i][j][k].y = 10;
00154                   }
00155                   else {
00156                     DATa[i][j][k].y = -10;
00157                 }
00158                 DATa[i][j][k].z = 0;
00159             }
00160         }
00161     }
00162 
00163     //- Dada el dominio [min]-[max] en R3, determine escala y offset ---------
00164     offset = min;
00165     escala = (max - min);
00166     escala.x /= (double)x_tam;
00167     escala.y /= (double)y_tam;
00168     escala.z /= (double)z_tam;
00169 }
00170 
00171 CAMPO_V_ALMACENADO::~CAMPO_V_ALMACENADO()
00172 {
00173     elim();
00174 }
00175 
00176 void
00177 CAMPO_V_ALMACENADO::elim(void)
00178 {
00179     int i, j;
00180 
00181     if ( !DATa ) return;
00182 
00183     for ( i = 0; i < x_tam; i++ ) {
00184         for ( j = 0; j < y_tam; j++ ) {
00185             delete DATa[i][j];
00186         }
00187         delete DATa[i];
00188     }
00189     delete DATa;
00190 
00191     x_tam = y_tam = z_tam = 0;
00192     DATa = NULL;
00193 }
00194 
00195 BOOLEAN
00196 CAMPO_V_ALMACENADO::leer(char *archivo)
00197 {
00198     FILE *fd;
00199     int i, j, k;
00200 
00201     elim();
00202 
00203     fd = fopen(archivo, "rb");
00204     if ( !fd ) {
00205         fprintf(stderr, "<CAMPO_V_ALMACENADO> ERROR: No se puede abrir el\n"
00206             "archivo \"%s\".\n", archivo);
00207         fflush(stderr);
00208         return FALSE;
00209     }
00210 
00211     lea_WORD_BE(&x_tam, fd);
00212     lea_WORD_BE(&y_tam, fd);
00213     lea_WORD_BE(&z_tam, fd);
00214 
00215     printf("Leo un campo de %d x %d x %d elementos!\n", x_tam, y_tam, z_tam);
00216     fflush(stdout);
00217 
00218     DATa = new VECTOR** [x_tam];
00219     VERIFICARF(DATa);
00220     for ( i = 0; i < x_tam; i++ ) {
00221         DATa[i] = new VECTOR* [y_tam];
00222         VERIFICARF(DATa[i]);
00223         for ( j = 0; j < y_tam; j++ ) {
00224             DATa[i][j] = new VECTOR[z_tam];
00225             VERIFICARF(DATa[i][j]);
00226             for ( k = 0; k < z_tam; k++ ) {
00227                 lea_WORD_BE(&DATa[i][j][k].x, fd);
00228                 lea_WORD_BE(&DATa[i][j][k].y, fd);
00229                 lea_WORD_BE(&DATa[i][j][k].z, fd);
00230                 DATa[i][j][k] = DATa[i][j][k];
00231             }
00232         }
00233     }
00234 
00235 
00236     fclose(fd);
00237 
00238     return TRUE;
00239 }
00240 
00241 BOOLEAN
00242 CAMPO_V_ALMACENADO::grabar(char *archivo)
00243 {
00244     FILE *fd;
00245     int i, j, k;
00246 
00247     fd = fopen(archivo, "wb");
00248     if ( !fd ) {
00249         fprintf(stderr, "<CAMPO_V_ALMACENADO> ERROR: No se puede abrir el\n"
00250             "archivo \"%s\".\n", archivo);
00251         fflush(stderr);
00252         return FALSE;
00253     }
00254 
00255     fwrite(&x_tam, sizeof(int), 1, fd);
00256     fwrite(&y_tam, sizeof(int), 1, fd);
00257     fwrite(&z_tam, sizeof(int), 1, fd);
00258 
00259     for ( i = 0; i < x_tam; i++ ) {
00260         for ( j = 0; j < y_tam; j++ ) {
00261             for ( k = 0; k < z_tam; k++ ) {
00262                 fwrite(&DATa[i][j][k].x, sizeof(double), 1, fd);
00263                 fwrite(&DATa[i][j][k].y, sizeof(double), 1, fd);
00264                 fwrite(&DATa[i][j][k].z, sizeof(double), 1, fd);
00265             }
00266         }
00267     }
00268 
00269     fclose(fd);
00270 
00271     return TRUE;
00272 }
00273 
00274 VECTOR
00275 CAMPO_V_ALMACENADO::valor(VECTOR posicion)
00276 {
00277     VECTOR a(0, 0, 0);
00278 
00279     posicion = posicion - offset;
00280 
00281     int i = ((int)floor(posicion.x/escala.x));
00282     int j = ((int)floor(posicion.y/escala.y));
00283     int k = ((int)floor(posicion.z/escala.z));
00284 
00285     if ( i < 0 || j < 0 || k < 0 ||
00286          i >= x_tam || j >= y_tam || k >= z_tam ) {
00287         return a;
00288     }
00289     return DATa[i][j][k];
00290 
00291     //printf("matriz[%d][%d][%d] = <%.2f, %.2f, %.2f>\n", i, j, k,
00292     //    DATa[i][j][k].x, DATa[i][j][k].y, DATa[i][j][k].z);
00293     //fflush(stdout);
00294 
00295     //return a;
00296 }
00297 
00298 void
00299 CAMPO_V_ALMACENADO::cambiar_posicion(int i, int j, int k, VECTOR nuevo_valor)
00300 {
00301     if ( i < 0 || j < 0 || k < 0 || i >= x_tam || j >= y_tam || k >= z_tam ) {
00302         return;
00303     }
00304     if ( !DATa ) return;
00305     DATa[i][j][k] = nuevo_valor;
00306 }
00307 
00308 
00309 //===========================================================================
00310 //= EOF                                                                     =
00311 //===========================================================================
00312 

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.