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); }