00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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 )
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
00091
00092
00093 CAMPO_V_ALMACENADO::CAMPO_V_ALMACENADO(char * , 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
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
00144
00145
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
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
00292
00293
00294
00295
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
00311
00312