public void Test_S2LatLng_TestBasic() { S2LatLng ll_rad = S2LatLng.FromRadians(S2.M_PI_4, S2.M_PI_2); Assert.Equal(S2.M_PI_4, ll_rad.LatRadians); Assert.Equal(S2.M_PI_2, ll_rad.LngRadians); Assert.True(ll_rad.IsValid()); S2LatLng ll_deg = S2LatLng.FromDegrees(45, 90); Assert.Equal(ll_rad, ll_deg); Assert.True(ll_deg.IsValid()); Assert.False(S2LatLng.FromDegrees(-91, 0).IsValid()); Assert.False(S2LatLng.FromDegrees(0, 181).IsValid()); S2LatLng bad = S2LatLng.FromDegrees(120, 200); Assert.False(bad.IsValid()); S2LatLng better = bad.Normalized(); Assert.True(better.IsValid()); Assert.Equal(S1Angle.FromDegrees(90), better.Lat()); Assert2.DoubleEqual(S1Angle.FromDegrees(-160).Radians, better.LngRadians); bad = S2LatLng.FromDegrees(-100, -360); Assert.False(bad.IsValid()); better = bad.Normalized(); Assert.True(better.IsValid()); Assert.Equal(S1Angle.FromDegrees(-90), better.Lat()); Assert2.DoubleEqual(0.0, better.LngRadians); Assert.True((S2LatLng.FromDegrees(10, 20) + S2LatLng.FromDegrees(20, 30)). ApproxEquals(S2LatLng.FromDegrees(30, 50))); Assert.True((S2LatLng.FromDegrees(10, 20) - S2LatLng.FromDegrees(20, 30)). ApproxEquals(S2LatLng.FromDegrees(-10, -10))); Assert.True((0.5 * S2LatLng.FromDegrees(10, 20)). ApproxEquals(S2LatLng.FromDegrees(5, 10))); // Check that Invalid() returns an invalid point. S2LatLng invalid = S2LatLng.Invalid; Assert.False(invalid.IsValid()); // Check that the default constructor sets latitude and longitude to 0. S2LatLng default_ll = S2LatLng.Center; Assert.True(default_ll.IsValid()); Assert.Equal(0, default_ll.LatRadians); Assert.Equal(0, default_ll.LngRadians); }
// Returns the minimum distance from X to the latitude line segment defined by // the given latitude and longitude interval. private static S1Angle GetDistance(S2LatLng x, S1Angle lat, S1Interval interval) { Assert.True(x.IsValid()); Assert.True(interval.IsValid()); // Is X inside the longitude interval? if (interval.Contains(x.LngRadians)) { return(S1Angle.FromRadians((x.Lat() - lat).Abs())); } // Return the distance to the closer endpoint. return(new[] { x.GetDistance(new S2LatLng(lat, S1Angle.FromRadians(interval.Lo))), x.GetDistance(new S2LatLng(lat, S1Angle.FromRadians(interval.Hi))) }.Min()); }