int CargarPartida(char * nombreArchivo,tipoError *error){ /*Devuelve una partida, modifica 'error' si lo hubo*/ FILE * pPartida; int i; partida juegoT; pPartida = fopen(nombreArchivo,"r"); if(pPartida == NULL) { *error = LECTURA_INVALIDA; return juegoT; }else{ fread(&juegoT.matActual, sizeof(juegoT.matActual),1,pPartida); fread(&juegoT.cantUndos,sizeof(juegoT.cantUndos),1,pPartida); fread(&juegoT.puntaje,sizeof(juegoT.puntaje),1,pPartida); fread(&juegoT.dim,sizeof(juegoT.dim),1,pPartida); fread(&juegoT.condGanar,sizeof(juegoT.condGanar),1,pPartida); juegoT.matActual = creaMatriz(juegoT.dim); for (i=0; i<juegoT.dim ; i++) fread(juegoT.matActual[i],sizeof(juegoT.matActual[0][0]),juegoT.dim,pPartida); } }
pos *sga(float *imagen, int num_endmembers, int muestras , int lineas, int bandas){ //solucion = (pos*) malloc(num_endmembers*sizeof(pos)); int n = 1, i = 0, j = 0, primeraVuelta = 1,x; double volumen = 0.0; srand(time(NULL)); float *endmember; if(DEBUG) printf("muestras: %d, filas: %d, bandas %d\n", muestras, lineas, bandas); pos *endmember_index = (pos*) malloc((num_endmembers)*sizeof(pos));//vamos a tener 19 puntos de endmembers endmember_index[0].filas = rand() % lineas;//221 endmember_index[0].columnas = rand() % muestras;//325 if(DEBUG) printf("la posicion al azar es: %d - %d\n",endmember_index[0].columnas,endmember_index[0].filas); while(n < num_endmembers){ endmember = (float*) malloc(num_endmembers*num_endmembers*sizeof(float));//como maximo va tener p * p elementos, n x n en cada vuelta y se resetea for(i = 0; i < n; i++){//para n for(j = 0; j < n; j++){//para las bandas endmember[i*(n)+j] = imagen[endmember_index[i].columnas + endmember_index[i].filas*muestras + muestras*lineas*j];//flipa pepinillos ! } } pos *newendmember_index = (pos*) malloc(1*sizeof(pos)); double maxVolumen = 0.0; int factorial = 1; for(i = n; i > 0; i--) factorial *= i; for(i = 0; i < muestras; i++){ for(j = 0; j < lineas; j++){ //le pasamos el endmember y los puntos i j que vamos a usar, devuelve el array hasta n de ese punto float *jointpoint = (float*) malloc ((n*n+n+(n+1))*sizeof(float));; creaMatriz(endmember, i , j, imagen, n, muestras, lineas, jointpoint);//esta funcion hace jointpoint, transpone la matriz y hace matrixjoinpoint(unos en la primera fila) volumen = calculaVolumen(jointpoint, n+1, factorial);//se calcula sobre una matriz (n+1)*(n+1) //if(n==1 && global && i == 349 && j == 296){printf("%f \n",volumen); } if(volumen > maxVolumen){ maxVolumen = volumen; //if(DEBUG)printf("Volumen(%d)[%d][%d]: %f\n",n,i,j,volumen); newendmember_index[0].columnas = i; newendmember_index[0].filas = j; } free(jointpoint); } } endmember_index[n].columnas = newendmember_index[0].columnas; endmember_index[n].filas = newendmember_index[0].filas; n++;printf("Valor del maxVolumen: %f\n",maxVolumen);//<- 18 y 19 no caben en float?????????? if(primeraVuelta){//endmeber_index va tener valores pero creo que no se van a usar, si falla mirar aqui n = 1; endmember_index[0].filas = newendmember_index[0].filas; endmember_index[0].columnas = newendmember_index[0].columnas; primeraVuelta--; } //printf("\n\n"); free(newendmember_index); free(endmember); } return endmember_index; }