private double SmoothedNoise( double x, double y )
{
int xInt = (int) x;
int yInt = (int) y;
double xFrac = x - xInt;
double yFrac = y - yInt;
// get four noise values
double x0y0 = Noise( xInt, yInt );
double x1y0 = Noise( xInt + 1, yInt );
double x0y1 = Noise( xInt, yInt + 1 );
double x1y1 = Noise( xInt + 1, yInt + 1 );
// x interpolation
double v1 = CosineInterpolate( x0y0, x1y0, xFrac );
double v2 = CosineInterpolate( x0y1, x1y1, xFrac );
// y interpolation
return CosineInterpolate( v1, v2, yFrac );
}