Example #1
0
    private static S1Angle BruteForceDistance(S2LatLngRect a, S2LatLngRect b)
    {
        if (a.Intersects(b))
        {
            return(S1Angle.FromRadians(0));
        }

        // Compare every point in 'a' against every latitude edge and longitude edge
        // in 'b', and vice-versa, for a total of 16 point-vs-latitude-edge tests and
        // 16 point-vs-longitude-edge tests.
        var pnt_a = new S2LatLng[4];
        var pnt_b = new S2LatLng[4];

        pnt_a[0] = new S2LatLng(a.LatLo(), a.LngLo());
        pnt_a[1] = new S2LatLng(a.LatLo(), a.LngHi());
        pnt_a[2] = new S2LatLng(a.LatHi(), a.LngHi());
        pnt_a[3] = new S2LatLng(a.LatHi(), a.LngLo());
        pnt_b[0] = new S2LatLng(b.LatLo(), b.LngLo());
        pnt_b[1] = new S2LatLng(b.LatLo(), b.LngHi());
        pnt_b[2] = new S2LatLng(b.LatHi(), b.LngHi());
        pnt_b[3] = new S2LatLng(b.LatHi(), b.LngLo());

        // Make arrays containing the lo/hi latitudes and the lo/hi longitude edges.
        var lat_a = new S1Angle[2] {
            a.LatLo(), a.LatHi()
        };
        var lat_b = new S1Angle[2] {
            b.LatLo(), b.LatHi()
        };
        var lng_edge_a = new S2Point[][] { new S2Point[] { pnt_a[0].ToPoint(), pnt_a[3].ToPoint() },
                                           new S2Point[] { pnt_a[1].ToPoint(), pnt_a[2].ToPoint() } };
        var lng_edge_b = new S2Point[][] { new S2Point[] { pnt_b[0].ToPoint(), pnt_b[3].ToPoint() },
                                           new S2Point[] { pnt_b[1].ToPoint(), pnt_b[2].ToPoint() } };

        S1Angle min_distance = S1Angle.FromDegrees(180.0);

        for (int i = 0; i < 4; ++i)
        {
            // For each point in a and b.
            var current_a = pnt_a[i];
            var current_b = pnt_b[i];

            for (int j = 0; j < 2; ++j)
            {
                // Get distances to latitude and longitude edges.
                S1Angle a_to_lat = GetDistance(current_a, lat_b[j], b.Lng);
                S1Angle b_to_lat = GetDistance(current_b, lat_a[j], a.Lng);
                S1Angle a_to_lng = S2.GetDistance(current_a.ToPoint(), lng_edge_b[j][0], lng_edge_b[j][1]);
                S1Angle b_to_lng = S2.GetDistance(current_b.ToPoint(), lng_edge_a[j][0], lng_edge_a[j][1]);

                min_distance = new[] { min_distance, a_to_lat, b_to_lat, a_to_lng, b_to_lng }.Min();
            }
        }
        return(min_distance);
    }
Example #2
0
    public void Test_S2LatLngRect_Accessors()
    {
        // Check various accessor methods.
        S2LatLngRect d1 = RectFromDegrees(-90, 0, -45, 180);

        Assert2.DoubleEqual(d1.LatLo().GetDegrees(), -90);
        Assert2.DoubleEqual(d1.LatHi().GetDegrees(), -45);
        Assert2.DoubleEqual(d1.LngLo().GetDegrees(), 0);
        Assert2.DoubleEqual(d1.LngHi().GetDegrees(), 180);
        Assert.Equal(d1.Lat, new(-S2.M_PI_2, -S2.M_PI_4));
        Assert.Equal(d1.Lng, new(0, Math.PI));
    }
Example #3
0
    private static S1Angle BruteForceRectPointDistance(S2LatLngRect a, S2LatLng b)
    {
        if (a.Contains(b))
        {
            return(S1Angle.FromRadians(0));
        }

        S1Angle b_to_lo_lat = GetDistance(b, a.LatLo(), a.Lng);
        S1Angle b_to_hi_lat = GetDistance(b, a.LatHi(), a.Lng);
        S1Angle b_to_lo_lng = S2.GetDistance(b.ToPoint(), new S2LatLng(a.LatLo(), a.LngLo()).ToPoint(), new S2LatLng(a.LatHi(), a.LngLo()).ToPoint());
        S1Angle b_to_hi_lng = S2.GetDistance(b.ToPoint(), new S2LatLng(a.LatLo(), a.LngHi()).ToPoint(), new S2LatLng(a.LatHi(), a.LngHi()).ToPoint());

        return(new[] { b_to_lo_lat, b_to_hi_lat, b_to_lo_lng, b_to_hi_lng }.Min());
    }