public float GetInterpolated(float3 coords) { coords /= Spacing; // from [0, 1] to [0, dim - 1] float3 coord_grid = coords; float3 index = coord_grid.Floor(); float result = 0.0f; int MinX = Math.Max(0, (int)index.X - 1), MaxX = Math.Min((int)index.X + 2, Dimensions.X - 1); int MinY = Math.Max(0, (int)index.Y - 1), MaxY = Math.Min((int)index.Y + 2, Dimensions.Y - 1); int MinZ = Math.Max(0, (int)index.Z - 1), MaxZ = Math.Min((int)index.Z + 2, Dimensions.Z - 1); float[,] InterpX = new float[MaxZ - MinZ + 1, MaxY - MinY + 1]; for (int z = MinZ; z <= MaxZ; z++) { for (int y = MinY; y <= MaxY; y++) { float2[] Points = new float2[MaxX - MinX + 1]; if (Points.Length == 1) { InterpX[z - MinZ, y - MinY] = Values[z, y, 0]; } else { for (int x = MinX; x <= MaxX; x++) { Points[x - MinX] = new float2(x, Values[z, y, x]); } Cubic1DShort Spline = Cubic1DShort.GetInterpolator(Points); InterpX[z - MinZ, y - MinY] = Spline.Interp(coords.X); } } } float[] InterpXY = new float[MaxZ - MinZ + 1]; for (int z = MinZ; z <= MaxZ; z++) { float2[] Points = new float2[MaxY - MinY + 1]; if (Points.Length == 1) { InterpXY[z - MinZ] = InterpX[z - MinZ, 0]; } else { for (int y = MinY; y <= MaxY; y++) { Points[y - MinY] = new float2(y, InterpX[z - MinZ, y - MinY]); } Cubic1DShort Spline = Cubic1DShort.GetInterpolator(Points); InterpXY[z - MinZ] = Spline.Interp(coords.Y); } } { float2[] Points = new float2[MaxZ - MinZ + 1]; if (Points.Length == 1) { result = InterpXY[0]; } else { for (int z = MinZ; z <= MaxZ; z++) { Points[z - MinZ] = new float2(z, InterpXY[z - MinZ]); } Cubic1DShort Spline = Cubic1DShort.GetInterpolator(Points); result = Spline.Interp(coords.Z); } } return(result); }