예제 #1
0
파일: gdal_crs.c 프로젝트: koordinates/gdal
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);
}
예제 #2
0
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;
}