Download document (10.35 MB) - Escuela Superior de Informática ...

Download document (10.35 MB) - Escuela Superior de Informática ... Download document (10.35 MB) - Escuela Superior de Informática ...

11.07.2015 Views

168 Capítulo D. Código fuente7 * suavizado --> Factor de suavizado a utilizar8 * Salidas: Ninguna.9 **********************************************************************/10 void suavizar (int desde, int hasta, int canal, int suavizado)11 {12 int nerrores_intervalo=0;13 double vaux [MAX_PTOS];14 int i, j, desde_prop, hasta_prop;15 TPunto3D *Punto3D;16 GSList *Nodo;1718 /* Veamos si el intervalo tiene algun error */19 for (i=0; idata;22 switch (j %3) {23 case 0 : { if (Punto3D->x > 999998) nerrores_intervalo++; break; }24 case 1 : { if (Punto3D->y > 999998) nerrores_intervalo++; break; }25 case 2 : { if (Punto3D->z > 999998) nerrores_intervalo++; break; }26 };27 }2829 if (nerrores_intervalo != 0)30 mostrar_popup (g_strdup_printf ("El intervalo seleccionado no puede31 tener\n errores para proceder al suavizado.\n32 El intervalo %d - %d del canal [ %s] tiene %d errores.",33 desde, hasta, modelo3D[canal].nombre->str,34 nerrores_intervalo) , GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE);35 else { /* El intervalo elegido no tiene errores */36 /* Creamos el vector de puntos... */37 for (j=canal; j MAX_PTOS) hasta_prop += (MAX_PTOS -1);41 else hasta_prop = hasta;4243 /* Introducimos errores cada tantos puntos como indique el */44 /* factor de suavizado. Luego pasaremos a interpolar... */4546 for (i=0; idata;49 switch (j %3) {50 case 0 : { if ((i %suavizado==0) || (i==hasta_prop-desde_prop))51 vaux [i] = Punto3D->x; else vaux [i] = 999999;break; }52 case 1 : { if ((i %suavizado==0) || (i==hasta_prop-desde_prop))53 vaux [i] = Punto3D->y; else vaux [i] = 999999;break; }54 case 2 : { if ((i %suavizado==0) || (i==hasta_prop-desde_prop))55 vaux [i] = Punto3D->z; else vaux [i] = 999999;break; }56 };57 }5859 interpola (hasta_prop-desde_prop+1, vaux);6061 /* Guardamos el resultado obtenido en la estructura de datos */6263 for (i=0; i

D.2. Código fuente de los módulos más relevantes. 16964 Nodo = (g_slist_nth ( modelo3D[canal].lista, desde_prop+i));65 Punto3D = Nodo->data;66 switch (j %3) {67 case 0 : { Punto3D->x = vaux [i]; break; }68 case 1 : { Punto3D->y = vaux [i]; break; }69 case 2 : { Punto3D->z = vaux [i]; break; }70 };71 }72 desde_prop = hasta_prop+1;73 } /* Fin del while */74 } /* Fin del for con el que recorremos XYZ del canal */75 } /* Else (si no hubo error) */76 }7778 /*******************************************************************79 * Funcion: interpola80 * Descripcion: Dado el vector con los valores de y originales (yo),81 * devolveremos el mismo vector, pero sin errores.82 * El algoritmo de interpolacion esta basado en Splines83 * Cubicas Naturales.84 * Entradas: num_ptos --> Numero de puntos85 * yo --> Vector con los valores en el eje Y.86 * Salidas: Ninguna.87 ********************************************************************/88 void interpola (int num_ptos, double yo[])89 {90 int i, j, k, l, m;91 double ax[MAX_PTOS], bx[MAX_PTOS], cx[MAX_PTOS], dx[MAX_PTOS];92 double ay[MAX_PTOS], by[MAX_PTOS], cy[MAX_PTOS], dy[MAX_PTOS];93 double der[MAX_PTOS], gam[MAX_PTOS], ome[MAX_PTOS];94 double x[MAX_PTOS], y[MAX_PTOS];95 double t, dt;96 int ierror, ferror; /* Inicio y fin de cada segmento que tiene error */9798 /* Creamos los vectores x, e y sin insertar en ellos los errores */99 dt = 1./(double) InfoFichero.frames_seg;100101 if (arregla_extremos (num_ptos, yo))102 mostrar_popup ("Demasiados Errores.\n No se puede interpolar103 automaticamente.",104 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE);105 for (i=0, j=0, t=0; i

168 Capítulo D. Código fuente7 * suavizado --> Factor <strong>de</strong> suavizado a utilizar8 * Salidas: Ninguna.9 **********************************************************************/10 void suavizar (int <strong>de</strong>s<strong>de</strong>, int hasta, int canal, int suavizado)11 {12 int nerrores_intervalo=0;13 double vaux [MAX_PTOS];14 int i, j, <strong>de</strong>s<strong>de</strong>_prop, hasta_prop;15 TPunto3D *Punto3D;16 GSList *Nodo;1718 /* Veamos si el intervalo tiene algun error */19 for (i=0; idata;22 switch (j %3) {23 case 0 : { if (Punto3D->x > 999998) nerrores_intervalo++; break; }24 case 1 : { if (Punto3D->y > 999998) nerrores_intervalo++; break; }25 case 2 : { if (Punto3D->z > 999998) nerrores_intervalo++; break; }26 };27 }2829 if (nerrores_intervalo != 0)30 mostrar_popup (g_strdup_printf ("El intervalo seleccionado no pue<strong>de</strong>31 tener\n errores para proce<strong>de</strong>r al suavizado.\n32 El intervalo %d - %d <strong>de</strong>l canal [ %s] tiene %d errores.",33 <strong>de</strong>s<strong>de</strong>, hasta, mo<strong>de</strong>lo3D[canal].nombre->str,34 nerrores_intervalo) , GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE);35 else { /* El intervalo elegido no tiene errores */36 /* Creamos el vector <strong>de</strong> puntos... */37 for (j=canal; j MAX_PTOS) hasta_prop += (MAX_PTOS -1);41 else hasta_prop = hasta;4243 /* Introducimos errores cada tantos puntos como indique el */44 /* factor <strong>de</strong> suavizado. Luego pasaremos a interpolar... */4546 for (i=0; idata;49 switch (j %3) {50 case 0 : { if ((i %suavizado==0) || (i==hasta_prop-<strong>de</strong>s<strong>de</strong>_prop))51 vaux [i] = Punto3D->x; else vaux [i] = 999999;break; }52 case 1 : { if ((i %suavizado==0) || (i==hasta_prop-<strong>de</strong>s<strong>de</strong>_prop))53 vaux [i] = Punto3D->y; else vaux [i] = 999999;break; }54 case 2 : { if ((i %suavizado==0) || (i==hasta_prop-<strong>de</strong>s<strong>de</strong>_prop))55 vaux [i] = Punto3D->z; else vaux [i] = 999999;break; }56 };57 }5859 interpola (hasta_prop-<strong>de</strong>s<strong>de</strong>_prop+1, vaux);6061 /* Guardamos el resultado obtenido en la estructura <strong>de</strong> datos */6263 for (i=0; i

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!