Пример #1
0
 public override void OnInspectorGUI()
 {
     if (GUILayout.Button("Check File"))
     {
         SRTMDataCell cell = new SRTMDataCell((int)TileManager.OriginLatitude, (int)TileManager.OriginLongitude);
     }
 }
Пример #2
0
    public static SRTMDataCell GetSRTMDataCell(int latIndex, int longIndex)
    {
        if (dataCells == null)
        {
            dataCells = new Dictionary <int, Dictionary <int, SRTMDataCell> >();
        }

        if (!dataCells.ContainsKey(latIndex))
        {
            dataCells[latIndex] = new Dictionary <int, SRTMDataCell>();
        }

        if (!dataCells[latIndex].ContainsKey(longIndex))
        {
            dataCells[latIndex][longIndex] = new SRTMDataCell(latIndex, longIndex);
            Debug.Log("Created new SRTMDataCell " + dataCells[latIndex][longIndex].ToString());
        }
        return(dataCells[latIndex][longIndex]);
    }
Пример #3
0
    //public float GetInterpolatedHeight(double latitude, double longitude)
    //{
    //    int pixelIndexX = (int)Math.Floor((latitude - latIndex) * 1201);
    //    int pixelIndexY = (int)Math.Floor((longitude - longIndex) * 1201);

    //    float x = (float)(((latitude - latIndex) * 1201) % 1);
    //    float y = (float)(((longitude - longIndex) * 1201) % 1);

    //    float f00 = Data[pixelIndexX, pixelIndexY];
    //    float f01 = Data[pixelIndexX, pixelIndexY + 1];
    //    float f10 = Data[pixelIndexX + 1, pixelIndexY];
    //    float f11 = Data[pixelIndexX + 1, pixelIndexY + 1];

    //    //Bilinear Interpolation
    //    //return f00 * (1f - x) * (1f - y) + f10 * x * (1f - y) + f01 * (1 - x) * y + f11 * x * y;
    //    return BilinearInterpolation(f00, f01, f10, f11, x, y);
    //}

    //private float BilinearInterpolation(float f00, float f01, float f10, float f11, float u, float w)
    //{
    //    return f00 * (1 - u) * (1 - w) + f01 * (1 - u) * w + f10 * u * (1 - w) + f11 * u * w;
    //}

    public float GetInterpolatedHeight(double latitude, double longitude)
    {
        int pixelIndexX = (int)Math.Floor((latitude - latIndex) * 1200);
        int pixelIndexY = (int)Math.Floor((longitude - longIndex) * 1200);

        float xParam = (float)(((latitude - latIndex) * 1200) % 1);
        float yParam = (float)(((longitude - longIndex) * 1200) % 1);

        float[,] controlPoints = new float[4, 4];

        int counterX = 0;
        int counterY = 0;

        for (int x = pixelIndexX - 1; x <= pixelIndexX + 2; x++)
        {
            counterY = 0;
            for (int y = pixelIndexY - 1; y <= pixelIndexY + 2; y++)
            {
                if (x == -1)
                {
                    //       |
                    //     * * * *
                    //     * * * *
                    // ----*-*-*-*-----
                    //     X * * *
                    //       |
                    if (y == -1)
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex - 1, longIndex - 1);
                        controlPoints[counterX, counterY] = cell.Data[1199, 1199];

                        if (xParam >= 0.5f || yParam >= 0.5f)
                        {
                            Debug.Log("Parameter: " + x + ", " + y);
                        }
                    }
                    //       |
                    //     X * * *
                    // ----*-*-*-*-----
                    //     * * * *
                    //     * * * *
                    //       |
                    else if (y == 1201)
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex - 1, longIndex + 1);
                        controlPoints[counterX, counterY] = cell.Data[1199, 1];
                    }
                    //       |
                    //     X * * *
                    //     * * * *
                    // ----*-*-*-*-----
                    //     * * * *
                    //       |
                    else if (y == 1202)
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex - 1, longIndex + 1);
                        controlPoints[counterX, counterY] = cell.Data[1199, 2];
                    }
                    //  |
                    //X * **
                    //X * **
                    //X * **
                    //X * **
                    //  |
                    else
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex - 1, longIndex);
                        controlPoints[counterX, counterY] = cell.Data[1199, y];
                    }
                }
                else if (x == 1201)
                {
                    //         |
                    //     * * * *
                    //     * * * *
                    // ----*-*-*-*-----
                    //     * * * X
                    //         |
                    if (y == -1)
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex + 1, longIndex - 1);
                        controlPoints[counterX, counterY] = cell.Data[1, 1199];
                    }
                    //         |
                    //     * * * x
                    // ----*-*-*-*-----
                    //     * * * *
                    //     * * * *
                    //         |
                    else if (y == 1201)
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex + 1, longIndex + 1);
                        controlPoints[counterX, counterY] = cell.Data[1, 1];
                    }
                    ////         |
                    ////     * * * x
                    ////     * * * *
                    //// ----*-*-*-*-----
                    ////     * * * *
                    ////         |
                    //else if (y == 1202)
                    //{
                    //    SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex + 1, longIndex + 1);
                    //    controlPoints[counterX, counterY] = cell.Data[1, 2];
                    //}
                    //         |
                    //     * * * x
                    //     * * * x
                    //     * * * x
                    //     * * * x
                    //         |
                    else
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex + 1, longIndex);
                        controlPoints[counterX, counterY] = Data[1, y];
                    }
                }
                //else if (x == 1202)
                //{
                //    //       |
                //    //     * * * *
                //    //     * * * *
                //    // ----*-*-*-*-----
                //    //     * * * X
                //    //       |
                //    if (y == -1)
                //    {
                //        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex + 1, longIndex - 1);
                //        controlPoints[counterX, counterY] = cell.Data[2, 1199];
                //    }
                //    //       |
                //    //     * * * x
                //    // ----*-*-*-*-----
                //    //     * * * *
                //    //     * * * *
                //    //       |
                //    else if (y == 1201)
                //    {
                //        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex + 1, longIndex + 1);
                //        controlPoints[counterX, counterY] = cell.Data[2, 1];
                //    }
                //    //       |
                //    //     * * * x
                //    //     * * * *
                //    // ----*-*-*-*-----
                //    //     * * * *
                //    //       |
                //    else if (y == 1202)
                //    {
                //        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex + 1, longIndex + 1);
                //        controlPoints[counterX, counterY] = cell.Data[2, 2];
                //    }
                //    //       |
                //    //     * * * x
                //    //     * * * x
                //    //     * * * x
                //    //     * * * x
                //    //       |
                //    else
                //    {
                //        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex + 1, longIndex);
                //        controlPoints[counterX, counterY] = Data[2, y];
                //    }
                //}
                else
                {
                    //
                    //     * * * *
                    //     * * * *
                    // ----*-*-*-*-----
                    //     X X X X
                    //
                    if (y == -1)
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex, longIndex - 1);
                        controlPoints[counterX, counterY] = cell.Data[x, 1199];
                    }
                    //
                    //     X X X X
                    // ----*-*-*-*-----
                    //     * * * *
                    //     * * * *
                    //
                    else if (y == 1201)
                    {
                        SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex, longIndex + 1);
                        controlPoints[counterX, counterY] = cell.Data[x, 1];
                    }
                    ////
                    ////     X X X X
                    ////     * * * *
                    //// ----*-*-*-*-----
                    ////     * * * *
                    ////
                    //else if (y == 1202)
                    //{
                    //    SRTMDataCell cell = SRTMHeightProvider.GetSRTMDataCell(latIndex, longIndex + 1);
                    //    controlPoints[counterX, counterY] = cell.Data[x, 1];
                    //}
                    //
                    //     X X X X
                    //     X X X X
                    //     X X X X
                    //     X X X X
                    //
                    else
                    {
                        controlPoints[counterX, counterY] = Data[x, y];
                    }
                }
                counterY++;
            }
            counterX++;
        }



        //Bilinear Interpolation
        //return f00 * (1f - x) * (1f - y) + f10 * x * (1f - y) + f01 * (1 - x) * y + f11 * x * y;
        return(CardinalSplinePatchPoint(controlPoints, xParam, yParam));
    }