bool get_plane_rg(pointlist& INpL, plane& OUplane) { double xx, xy, xz, yy, yz; point center; pointlist MpL; if (get_center(INpL, center) < 3) return false; MpL = trans_coord(INpL,center); xx = get_sumprod(MpL, X_, X_); xy = get_sumprod(MpL, X_, Y_); xz = get_sumprod(MpL, X_, Z_); yy = get_sumprod(MpL, Y_, Y_); yz = get_sumprod(MpL, Y_, Z_); free_pointlist(MpL); double div = ( xx * yy - xy * xy ); if (div == 0) { OUplane.A = 0; OUplane.B = 0; return false; } else { OUplane.A = ( xz * yy - xy * yz ) / div; OUplane.B = ( xy * xz - xx * yz ) / -div; } OUplane.C = center.coord[Z_] - OUplane.A * center.coord[X_] - OUplane.B * center.coord[Y_]; return true; }
static void cleanup_buffers(Rfile *rf) /* Free all dynamic work buffers. */ { freez(&rf->pktbuf); release_polypoints(&rf->pg,&rf->pts); free_pointlist(&rf->pts); }
line get_line_regr_YZ(pointlist& INpL) { double yy, yz; point center; pointlist MpL; line OUline; get_center(INpL,center); MpL = trans_coord(INpL, center); yy = get_sumprod(MpL, Y_, Y_); yz = get_sumprod(MpL, Y_, Z_); free_pointlist(MpL); OUline.A = yz / yy; OUline.B = center.coord[Z_] - OUline.A * center.coord[Y_]; return OUline; }
line get_line_regr_XZ(pointlist& INpL) { double xx, xz; point center; pointlist MpL; line OUline; get_center(INpL,center); MpL = trans_coord(INpL, center); xx = get_sumprod(MpL, X_, X_); xz = get_sumprod(MpL, X_, Z_); free_pointlist(MpL); OUline.A = xz / xx; OUline.B = center.coord[Z_] - OUline.A * center.coord[X_]; return OUline; }
line get_line_regr_YX(pointlist& INpL) { double xy, yy; point center; pointlist MpL; line OUline; get_center(INpL,center); MpL = trans_coord(INpL, center); yy = get_sumprod(MpL, Y_, Y_); xy = get_sumprod(MpL, X_, Y_); free_pointlist(MpL); OUline.A = xy / yy; OUline.B = center.coord[X_] - OUline.A * center.coord[Y_]; return OUline; }
/************************************************************************** Paso previo a haz_movimiento para pedir al usuario que enfoque cuatro esquinas del patron para poder calcular un plano de regresion. Paso opcional. Devuelve 0 si el plano ha sido definido y -1 si el usuario ha optado por no definirlo AUXILIAR SOLO VISUAL *****************************************************************************/ int definePlanoRegresion(parametros& param, plane& plano) { char mensaje[LONGITUD_TEXTO*2]; point esquina; pointlist plist; // Se ha de enfocar con el filtro "de enfoque" (o "de referencia", es decir el monocromatico) Rueda.ChangeFilter(param.filtro[param.Rueda.posEnfoque]); sprintf(mensaje,"\n+- DEFINE PLANO DE REGRESION ------------------------------------------+"); strcat(mensaje, "\n| Posiciónese en cada esquina del patrón para poder enfocar correctamente |"); strcat(mensaje, "\n| Enfoque y presione [ENTER] |"); strcat(mensaje, "\n| [Esc] - Para omitir este paso |"); strcat(mensaje, "\n+-------------------------------------------------------------------------+\n"); CharToOem(mensaje,mensaje); printf(mensaje); dim_pointlist(PUNTOS_PLANO_REGRESION,plist); // Dimensionamos la lista de puntos. for (int i=0;i<PUNTOS_PLANO_REGRESION;i++) { if (TomaAutomatica.bAutomatica == true) { put_pointlist(plist,i,TomaAutomatica.Puntos[i]); } else { if ( pideP(&esquina) < 0) { // Se ha pulsado [Esc], no se define plano de regresion free_pointlist(plist); // Liberamos la memoria empleada // OJO: esto se hace porque puede ser que el usuario haya enfocado manualmente antes // Estamos en el filtro "de enfoque" y sin embargo zPredefinido debe ser calculado para el pancromatico double zPancromatico = mspWhere(Z_) + param.Rueda.diferencia_z[param.Rueda.posFiltro] - param.Rueda.diferencia_z[param.filtro[param.Rueda.posEnfoque]] ; Rueda.zPredefinido = zPancromatico; //actualizo el valor absoluto de z del filtro predefinido // Regresamos al filtro predefinido (o de usuario) Rueda.ChangeFilter(param.Rueda.posFiltro); return -1; } put_pointlist(plist, i, esquina); // Se guarda su posición en la lista. printf("\n"); } } get_plane_rg(plist, plano); // Calculamos el plano de regresión double Zplano, errorZ; for (i=0; i<PUNTOS_PLANO_REGRESION; i++) { Zplano = plano.A * plist.pointn[i].coord[X_] + plano.B * plist.pointn[i].coord[Y_] + plano.C; errorZ = plist.pointn[i].coord[Z_] - Zplano; printf("punto %d: [%.2lf,%.2lf,%.2lf] Zplano:%.2lf errorZ: %.2lf\n", i+1, plist.pointn[i].coord[X_], plist.pointn[i].coord[Y_], plist.pointn[i].coord[Z_], Zplano, errorZ); } free_pointlist(plist); // Liberamos la memoria empleada // OJO: esto se hace porque puede ser que el usuario haya enfocado manualmente antes // Estamos en el filtro "de enfoque" y sin embargo zPredefinido debe ser calculado para el pancromatico double zPancromatico = mspWhere(Z_) + param.Rueda.diferencia_z[param.Rueda.posFiltro] - param.Rueda.diferencia_z[param.filtro[param.Rueda.posEnfoque]] ; Rueda.zPredefinido = zPancromatico; //actualizo el valor absoluto de z del filtro predefinido // Regresamos al filtro predefinido (o de usuario) Rueda.ChangeFilter(param.Rueda.posFiltro); return 0; }