Exemplo n.º 1
0
static void xy_interp(int line, int samp,
                      int line_lo, int line_hi, int samp_lo, int samp_hi,
                      double *lines, double *samps,
                      double *interp_line, double *interp_samp)
{
  assert(samp>=samp_lo && samp<=samp_hi);
  assert(line>=line_lo && line<=line_hi);

  double l = (double)(line - line_lo) / (double)(line_hi - line_lo);
  double s = (double)(samp - samp_lo) / (double)(samp_hi - samp_lo);

  *interp_line = bilinear_interp_fn(l, s, lines[0], lines[1], lines[2], lines[3]);
  *interp_samp = bilinear_interp_fn(l, s, samps[0], samps[1], samps[2], samps[3]);
}
Exemplo n.º 2
0
static void xy_interp(int line, int samp,
                      int line_lo, int line_hi, int samp_lo, int samp_hi,
                      double *lats, double *lons,
                      double *interp_lat, double *interp_lon)
{
  assert(samp>=samp_lo && samp<=samp_hi);
  assert(line>=line_lo && line<=line_hi);

  double l = (double)(line - line_lo) / (double)(line_hi - line_lo);
  double s = (double)(samp - samp_lo) / (double)(samp_hi - samp_lo);

  *interp_lat = bilinear_interp_fn(l, s, lats[0], lats[1], lats[2], lats[3]);
  *interp_lon = bilinear_interp_fn(l, s, lons[0], lons[1], lons[2], lons[3]);
}
Exemplo n.º 3
0
static void test_interp()
{
  check(1, bilinear_interp_fn(.5,.5,1,1,1,1), 1);
  check(2, bilinear_interp_fn(.1,.1,1,1,1,1), 1);
  check(3, bilinear_interp_fn(.5,.5,1,1,2,2), 1.5);
  check(4, bilinear_interp_fn(.5,.5,1,2,1,2), 1.5);
  check(5, bilinear_interp_fn(.5,.5,1,2,1,2), 1.5);
  check(6, bilinear_interp_fn(0,0,1,2,3,4), 1);
  check(7, bilinear_interp_fn(1,1,1,2,3,4), 4);
  check(8, bilinear_interp_fn(0,1,1,2,3,4), 2);
  check(9, bilinear_interp_fn(1,0,1,2,3,4), 3);  
}
Exemplo n.º 4
0
static float
interp_demData(float *demData, int nl, int ns, double l, double s)
{
  if (l<0 || l>=nl-1 || s<0 || s>=ns-1) {
    return 0;
  }

  int ix = (int)s;
  int iy = (int)l;

  int bilinear = l<3 || l>=nl-3 || s<3 || s>=ns-3;
  //int bilinear = 1;
  if (bilinear) {

    float p00 = demData[ix   + ns*(iy  )];
    float p10 = demData[ix+1 + ns*(iy  )];
    float p01 = demData[ix   + ns*(iy+1)];
    float p11 = demData[ix+1 + ns*(iy+1)];

    return (float)bilinear_interp_fn(s-ix, l-iy, p00, p10, p01, p11);
  }
  else {

    double ret, x[4], y[4], xi[4], yi[4];
    int ii;

    for (ii=0; ii<4; ++ii) {
      y[0] = demData[ix-1 + ns*(iy+ii-1)];
      y[1] = demData[ix   + ns*(iy+ii-1)];
      y[2] = demData[ix+1 + ns*(iy+ii-1)];
      y[3] = demData[ix+2 + ns*(iy+ii-1)];

      x[0] = ix - 1;
      x[1] = ix;
      x[2] = ix + 1;
      x[3] = ix + 2;

      gsl_interp_accel *acc = gsl_interp_accel_alloc ();
      gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, 4);    
      gsl_spline_init (spline, x, y, 4);
      yi[ii] = gsl_spline_eval_check(spline, s, acc);
      gsl_spline_free (spline);
      gsl_interp_accel_free (acc);

      xi[ii] = iy + ii - 1;
    }

    gsl_interp_accel *acc = gsl_interp_accel_alloc ();
    gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, 4);    
    gsl_spline_init (spline, xi, yi, 4);
    ret = gsl_spline_eval_check(spline, l, acc);
    gsl_spline_free (spline);
    gsl_interp_accel_free (acc);
 
    return (float)ret;
  }
  
  asfPrintError("Impossible.");
}
Exemplo n.º 5
0
static float
interp_dem(FloatImage *dem, double l, double s)
{
  int nl = dem->size_y;
  int ns = dem->size_x;

  if (l<0 || l>=nl-1 || s<0 || s>=ns-1) {
    return 0;
  }

  int ix = (int)s;
  int iy = (int)l;

  int bilinear = l<3 || l>=nl-3 || s<3 || s>=ns-3;
  //int bilinear = 1;
  if (bilinear) {

    float p00 = float_image_get_pixel(dem, ix, iy);
    float p10 = float_image_get_pixel(dem, ix+1, iy);
    float p01 = float_image_get_pixel(dem, ix, iy+1);
    float p11 = float_image_get_pixel(dem, ix+1, iy+1);

    return (float)bilinear_interp_fn(s-ix, l-iy, p00, p10, p01, p11);
  }
  else {

    double ret, x[4], y[4], xi[4], yi[4];
    int ii;

    for (ii=0; ii<4; ++ii) {
      y[0] = float_image_get_pixel(dem, ix-1, iy+ii-1);
      y[1] = float_image_get_pixel(dem, ix,   iy+ii-1);
      y[2] = float_image_get_pixel(dem, ix+1, iy+ii-1);
      y[3] = float_image_get_pixel(dem, ix+2, iy+ii-1);

      x[0] = ix - 1;
      x[1] = ix;
      x[2] = ix + 1;
      x[3] = ix + 2;

      gsl_interp_accel *acc = gsl_interp_accel_alloc ();
      gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, 4);
      gsl_spline_init (spline, x, y, 4);
      yi[ii] = gsl_spline_eval_check(spline, s, acc);
      gsl_spline_free (spline);
      gsl_interp_accel_free (acc);

      xi[ii] = iy + ii - 1;
    }

    gsl_interp_accel *acc = gsl_interp_accel_alloc ();
    gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, 4);
    gsl_spline_init (spline, xi, yi, 4);
    ret = gsl_spline_eval_check(spline, l, acc);
    gsl_spline_free (spline);
    gsl_interp_accel_free (acc);

    return (float)ret;
  }

  asfPrintError("Impossible.");
}