コード例 #1
0
ファイル: myTerrain.cs プロジェクト: eglrp/OSM-City-Engine
        private float getTerrainTriangleHeight(float meterx, float meterz)
        {
            float finalvalue = 0.0f;

            Geography proj = new Geography();
            Vector2   c    = proj.meterstoLatLon(meterx, meterz);

            float ratioX = (float)Math.Ceiling(scenebbox.top) - c.x;
            float ratioZ = c.y - (float)Math.Floor(scenebbox.left);

            float Xindex = (1200.0f * ratioX);
            float Zindex = (1200.0f * ratioZ);

            //Upper Triangle
            if ((Xindex - Math.Floor(Xindex)) + (Zindex - Math.Floor(Zindex)) < 1.0f)
            {
                int   n = heightmap.heightmap[(int)Math.Floor(Xindex), (int)Math.Ceiling(Zindex)];
                int   m = heightmap.heightmap[(int)Math.Floor(Xindex), (int)Math.Floor(Zindex)];
                int   k = heightmap.heightmap[(int)Math.Ceiling(Xindex), (int)Math.Floor(Zindex)];
                float interpolationUp         = m + (n - m) * (Zindex - (float)Math.Floor(Zindex));
                float interpolationHypothenus = k + (n - k) * (Zindex - (float)Math.Floor(Zindex));

                float a      = Xindex - (float)Math.Floor(Xindex);
                float aplusb = (float)Math.Ceiling(Zindex) - Zindex;
                finalvalue = interpolationUp + (interpolationHypothenus - interpolationUp) * (a / aplusb);
            }

            //Lower Triangle
            else if ((Xindex - Math.Floor(Xindex)) + (Zindex - Math.Floor(Zindex)) >= 1.0f)
            {
                int   n = heightmap.heightmap[(int)Math.Ceiling(Xindex), (int)Math.Ceiling(Zindex)];
                int   m = heightmap.heightmap[(int)Math.Ceiling(Xindex), (int)Math.Floor(Zindex)];
                int   k = heightmap.heightmap[(int)Math.Floor(Xindex), (int)Math.Ceiling(Zindex)];
                float interpolationDown       = m + (n - m) * (Zindex - (float)Math.Floor(Zindex));
                float interpolationHypothenus = m + (k - m) * (Zindex - (float)Math.Floor(Zindex));

                float a      = (float)Math.Ceiling(Xindex) - Xindex;
                float aplusb = Zindex - (float)Math.Floor(Zindex);
                finalvalue = interpolationDown + (interpolationHypothenus - interpolationDown) * (a / aplusb);

                if ((Xindex - Math.Floor(Xindex)) + (Zindex - Math.Floor(Zindex)) > 0.98f && (Xindex - Math.Floor(Xindex)) + (Zindex - Math.Floor(Zindex)) < 1.02f)
                {
                    return(interpolationHypothenus);
                }
            }

            float final2 = HighPrecisionTerrainHeight(meterx, meterz, false);

            if (final2 - finalvalue != 0.0f)
            {
                Debug.Log("<color=red>PRECISION ERROR VAR</color>" + (final2 - finalvalue).ToString("0.000"));
            }

            return(final2);
        }