static int calccoef (struct Control_Points *cp, double x_mean, double y_mean, double E[], double N[], int order) { struct MATRIX m; double *a = NULL; double *b = NULL; int numactive = 0; /* NUMBER OF ACTIVE CONTROL POINTS */ int status = 0; int i = 0; memset( &m, 0, sizeof(m) ); /* CALCULATE THE NUMBER OF VALID CONTROL POINTS */ for(i = numactive = 0 ; i < cp->count ; i++) { if(cp->status[i] > 0) numactive++; } /* CALCULATE THE MINIMUM NUMBER OF CONTROL POINTS NEEDED TO DETERMINE A TRANSFORMATION OF THIS ORDER */ m.n = ((order + 1) * (order + 2)) / 2; if(numactive < m.n) return(MNPTERR); /* INITIALIZE MATRIX */ m.v = (double *)CPLCalloc(m.n*m.n,sizeof(double)); if(m.v == NULL) { return(MMEMERR); } a = (double *)CPLCalloc(m.n,sizeof(double)); if(a == NULL) { CPLFree((char *)m.v); return(MMEMERR); } b = (double *)CPLCalloc(m.n,sizeof(double)); if(b == NULL) { CPLFree((char *)m.v); CPLFree((char *)a); return(MMEMERR); } if(numactive == m.n) status = exactdet(cp,&m, x_mean, y_mean, a,b,E,N); else status = calcls(cp,&m, x_mean, y_mean,a,b,E,N); CPLFree((char *)m.v); CPLFree((char *)a); CPLFree((char *)b); return(status); }
static int calccoef (struct Control_Points *cp, double E[], double N[], int order) { struct MATRIX m; double *a; double *b; int numactive; /* NUMBER OF ACTIVE CONTROL POINTS */ int status, i; /* CALCULATE THE NUMBER OF VALID CONTROL POINTS */ for (i = numactive = 0; i < cp->count; i++) { if (cp->status[i] > 0) numactive++; } /* CALCULATE THE MINIMUM NUMBER OF CONTROL POINTS NEEDED TO DETERMINE A TRANSFORMATION OF THIS ORDER */ m.n = ((order + 1) * (order + 2)) / 2; if (numactive < m.n) return MNPTERR; /* INITIALIZE MATRIX */ m.v = calloc (m.n * m.n, sizeof (double)); a = calloc (m.n, sizeof (double)); b = calloc (m.n, sizeof (double)); if (numactive == m.n) status = exactdet (cp, &m, a, b, E, N); else status = calcls (cp, &m, a, b, E, N); free (m.v); free (a); free (b); return status; }