public double Noise( double x, double y, double z ) {
int X = (int)Math.Floor( x ) & 255, // FIND UNIT CUBE THAT
Y = (int)Math.Floor( y ) & 255, // CONTAINS POINT.
Z = (int)Math.Floor( z ) & 255;
x -= Math.Floor( x ); // FIND RELATIVE X,Y,Z
y -= Math.Floor( y ); // OF POINT IN CUBE.
z -= Math.Floor( z );
double u = Fade( x ), // COMPUTE FADE CURVES
v = Fade( y ), // FOR EACH OF X,Y,Z.
w = Fade( z );
int A = p[X] + Y,
AA = p[A] + Z,
AB = p[A + 1] + Z, // HASH COORDINATES OF
B = p[X + 1] + Y,
BA = p[B] + Z,
BB = p[B + 1] + Z; // THE 8 CUBE CORNERS,
return Lerp( w,
Lerp( v,
Lerp( u,
Grad( p[AA], x, y, z ), // AND ADD
Grad( p[BA], x - 1, y, z ) ), // BLENDED
Lerp( u,
Grad( p[AB], x, y - 1, z ), // RESULTS
Grad( p[BB], x - 1, y - 1, z ) ) ), // FROM 8
Lerp( v,
Lerp( u,
Grad( p[AA + 1], x, y, z - 1 ), // CORNERS
Grad( p[BA + 1], x - 1, y, z - 1 ) ), // OF CUBE
Lerp( u,
Grad( p[AB + 1], x, y - 1, z - 1 ),
Grad( p[BB + 1], x - 1, y - 1, z - 1 ) ) ) );
}