0

C# のハイトマップ (またはハイトフィールド) クラスに双一次補間を実装しようとしましたが、Wiki の数学がよくわかりません。これは、heightfield クラスの実装です。NotImplementedException をスローする 2 番目の関数 Mathf.BilinearInterpolation(...) があります。

    /// <summary>
    /// A flattened 2D array which contains the surface elevation data.
    /// </summary>
    public float[] Elevation { get; }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public float ElevationAtVertex(int x, int y)
    {
        return Elevation[x + y + (y * Length)];
    }

    public float ElevationAtPoint(float x, float y)
    {
        float f1 = ElevationAtVertex(Mathf.Floor(x), Mathf.Floor(y));
        float f2 = ElevationAtVertex(Mathf.Floor(x), Mathf.Ceiling(y));
        float f3 = ElevationAtVertex(Mathf.Ceiling(x), Mathf.Floor(y));
        float f4 = ElevationAtVertex(Mathf.Ceiling(x), Mathf.Ceiling(y));
        return Mathf.BilinearInterpolation(f1, f2, f3, f4);
    }
4

2 に答える 2

0

このコードは正しいですか?

public float ElevationAtPoint(float x, float y)
    {
        int x1 = Mathf.Floor(x);
        int x2 = Mathf.Ceiling(x);
        int y1 = Mathf.Floor(y);
        int y2 = Mathf.Ceiling(y);

        float q11 = ElevationAtVertex(x1, y1);
        float q12 = ElevationAtVertex(x1, y2);
        float q21 = ElevationAtVertex(x2, y1);
        float q22 = ElevationAtVertex(x2, y2);

        float r1 = ((x2 - x) / (x2 - x1)) * q11 + ((x - x1) / (x2 - x1)) * q21;
        float r2 = ((x2 - x) / (x2 - x1)) * q12 + ((x - x1) / (x2 - x1)) * q22;

        return ((y2 - y) / (y2 - y1)) * r1 + ((y - y1) / (y2 - y1)) * r2;
    }
于 2015-08-06T08:34:36.697 に答える