/***************** Listing 2 *************************

            Bilinear Interpolation

   double bilinear(image, x, y)
     float *image, x, y;

   image: pointer to the four values of grid i.e.
          a 2 x 2 array ( image[2][2] )
   x    : sample coordinate
   y    : line coordinate

               p
            |------------->
          image(0,0)         image(0,1)
         -  *-------------------*
         |  |                   |
      q  V  |             o     |
            |           (y,x)   |    y = line
            |                   |    x = sample
            |                   |
            |                   |
            *-------------------*
         image(1,0)          image(1,1)

    If point "o" falls on upper left corner, then 
    return image(0,0). The point should never fall on 
    any of the other corners because the calling 
    program will ensure against this according to the
    filling sequence of the array image[2][2].

******************************************************
#include <stdio.h>

double bilinear(image, x, y)
 float *image, x, y;
{
   register i;
   float p, q;
   double val = 0.0;

   p = x - (int) x;
   q = y - (int) y;

   if( (p == 0.0) && (q == 0.0) )
     return( (double) *image );   /* upper left */

   val = (p*q* *image++) + (q*(1-p)* *image++) +   \
          (p*(1-q)* *image++) + ((1-p)*(1-q)* *image);

   return( val );
}
