#include #include #include #include #include "definiz.h" #define MAXLINE 200 /************** lerro batetik zenbaki osoa irakurtzeko *****************/ static int sreadint(char * lerroa, int * zenbakiak) { char *s=lerroa; int i,zbk,kont=0; while (sscanf(s," %d%n",&zbk,&i)>0) { s+=i; zenbakiak[kont++]=zbk; } return(kont); } /******************************************************************** *************** Wavefront fitxategia irakurtzen du *****************/ int WaveFrontIrakurri(char * fitxiz, objektua * objektuptr) { vertice *tablavert; cara *tablacaras; int numvert=-1,numcaras=-1,konterpin=0,kontaurpegi=0; FILE *fitx; char lerroa[MAXLINE], lerroa1[MAXLINE], zaborra[45]; int k; int i,j; int balioak[MAXLINE]; /* Fitxategiaren lehen irakurketa ***************************/ if ((fitx=fopen(fitxiz,"r"))==NULL) { printf("Ez dut %s fitxategia aurkitzen!!!!!\n",fitxiz); return(-1); } while (fscanf(fitx,"\n%[^\n]",lerroa)>0) { i=0; while (lerroa[i] == ' ') i++; if ((lerroa[0] == '#') && ((int)strlen(lerroa)>5)) { i+=2; j=0; while (lerroa[i]!= ' ') lerroa1[j++]=lerroa[i++]; i++; lerroa1[j]='\0'; j=0; while ((lerroa[i]!= ' ') && (lerroa[i]!='\0')) zaborra[j++]=lerroa[i++]; zaborra[j]=0; if (strcmp(zaborra,"vertices")==0) { numvert=atoi(lerroa1); // printf("lerroa: %s\nlerroa1: %s\nzaborra: %s\n",lerroa,lerroa1,zaborra); } if (strncmp(zaborra,"elements",7)==0) { numcaras=atoi(lerroa1); // printf("lerroa: %s\nlerroa1: %s\nzaborra: %s\n",lerroa,lerroa1,zaborra); } } else { if (strlen(lerroa)>6) { if (lerroa[i] == 'f' && lerroa[i+1] == ' ') kontaurpegi++; else if (lerroa[i] == 'v' && lerroa[i+1] == ' ') konterpin++; } } } fclose(fitx); // printf("numvert: %d = %d\n",numvert,konterpin); // printf("aurpegikop: %d = %d\n",numcaras,kontaurpegi); if ((numvert != -1 && numvert != konterpin) && (numcaras != -1 && numcaras != kontaurpegi)) { printf("Fitxategi desegokia: (%s)\n",fitxiz); return(-2); } if (numvert == 0 || konterpin ==0) { printf("Ez da erpinik aurkitu: (%s)\n",fitxiz); return(3); } if (numcaras == 0 || kontaurpegi == 0) { printf("Ez da aurpegirik aurkitu: (%s)\n",fitxiz); return(3); } else { // printf("%d aurpegi\n%d erpin\n",kontaurpegi,konterpin); } numvert = konterpin; numcaras = kontaurpegi; /*********** fitxategi osoa lehenengo aldiz irakurrri du ************/ tablavert=(vertice *)malloc(numvert*sizeof(vertice)); tablacaras=(cara *)malloc(numcaras*sizeof(cara)); /*** bigarren aldiz irakurriko du balioak hartzeko *****************/ fitx=fopen(fitxiz,"r"); k=0; j=0; for (i=0;i0) { switch (lerroa[0]) { case 'v': { sscanf(lerroa+2,"%lf%lf%lf",&(tablavert[k].koord.x), &(tablavert[k].koord.y), &(tablavert[k].koord.z)); k++; } break; case 'f': { for (i=2; i<=(int)strlen(lerroa); i++) lerroa1[i-2]=lerroa[i]; tablacaras[j].numvert = sreadint(lerroa1,balioak); tablacaras[j].tablaindvert = (int *)malloc(tablacaras[j].numvert*sizeof(int)); for (i=0; itablavert = tablavert; objektuptr->tablacaras = tablacaras; objektuptr->numvert = numvert; objektuptr->numcaras = numcaras; /**** Hauek oraingoz ez ditugu behar auzokideak_kalkulatu (objektuptr); normalak_kalkulatu (objektuptr); *************************************/ /********* bigarren aldiz irakurri du *****************************/ /* ahora vamos a calcular el punto mínimo y el punto máximo */ objektuptr->max.x =objektuptr->tablavert[0].koord.x; objektuptr->max.y = objektuptr->tablavert[0].koord.y; objektuptr->max.z = objektuptr->tablavert[0].koord.z; objektuptr->min.x = objektuptr->tablavert[0].koord.x; objektuptr->min.y = objektuptr->tablavert[0].koord.y; objektuptr->min.z = objektuptr->tablavert[0].koord.z; for( i=1; inumvert; i++) { if(objektuptr->tablavert[i].koord.x < objektuptr->min.x) objektuptr->min.x = objektuptr->tablavert[i].koord.x; if(objektuptr->tablavert[i].koord.y < objektuptr->min.y) objektuptr->min.y = objektuptr->tablavert[i].koord.y; if(objektuptr->tablavert[i].koord.z < objektuptr->min.z) objektuptr->min.z = objektuptr->tablavert[i].koord.z; if(objektuptr->tablavert[i].koord.x > objektuptr->max.x) objektuptr->max.x = objektuptr->tablavert[i].koord.x; if(objektuptr->tablavert[i].koord.y > objektuptr->max.y) objektuptr->max.y = objektuptr->tablavert[i].koord.y; if(objektuptr->tablavert[i].koord.z > objektuptr->max.z) objektuptr->max.z = objektuptr->tablavert[i].koord.z; } return(0); } /************************* fitxategia irakurtzearen bukaera ******/