Exemplo n.º 1
0
        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);
        }