コード例 #1
0
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;
}
コード例 #2
0
ファイル: RND.C プロジェクト: AnimatorPro/Animator-Pro
static void cleanup_buffers(Rfile *rf)
/* Free all dynamic work buffers. */
{
	freez(&rf->pktbuf);
	release_polypoints(&rf->pg,&rf->pts);
	free_pointlist(&rf->pts);
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}
コード例 #5
0
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;
}
コード例 #6
0
/**************************************************************************
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;
}