Определить, находится ли точка в многоугольнике

В соответствии с моим требованием я рисую многоугольники на карте google, показанной на изображении ниже (с использованием карт v2) enter image description here

Теперь мне нужно показать предупреждение, когда пользователь вводит эти конкретные полигоны.

Как определить, находится ли мое текущее местоположение в многоугольнике. (Требуется оптимизированный способ без отвода аккумулятора)

Спасибо заранее.

Ответ 1

Просто попробовал алгоритм Ray Casting, который идентифицирует точку в многоугольнике. Это прекрасно работает.

Обратитесь http://en.wikipedia.org/wiki/Point_in_polygon к тезису Ray-Casting

private boolean isPointInPolygon(LatLng tap, ArrayList<LatLng> vertices) {
        int intersectCount = 0;
        for (int j = 0; j < vertices.size() - 1; j++) {
            if (rayCastIntersect(tap, vertices.get(j), vertices.get(j + 1))) {
                intersectCount++;
            }
        }

        return ((intersectCount % 2) == 1); // odd = inside, even = outside;
    }

    private boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) {

        double aY = vertA.latitude;
        double bY = vertB.latitude;
        double aX = vertA.longitude;
        double bX = vertB.longitude;
        double pY = tap.latitude;
        double pX = tap.longitude;

        if ((aY > pY && bY > pY) || (aY < pY && bY < pY)
                || (aX < pX && bX < pX)) {
            return false; // a and b can't both be above or below pt.y, and a or
                            // b must be east of pt.x
        }

        double m = (aY - bY) / (aX - bX); // Rise over run
        double bee = (-aX) * m + aY; // y = mx + b
        double x = (pY - bee) / m; // algebra is neat!

        return x > pX;
    }

Ответ 2

Я нашел метод лучевого литья ненадежным, но в итоге я использовал PolyUtil на картах google.

Вам нужна зависимость compile 'com.google.maps.android:android-maps-utils:0.5'

И тогда метод выглядит так:

PolyUtil.containsLocation(userLocation, polyPointsList, false);

ИЗМЕНИТЬ

Это описание этого метода, найденного в исходном коде

Вычисляет, находится ли данная точка внутри указанного многоугольника. Полигон всегда считается закрытым, независимо от того, равна ли последняя точка первой или нет. Внутри определяется как не содержащий Южный полюс - Южный полюс всегда снаружи. Многоугольник сформирован из больших сегментов круга, если геодезическая истинна, а от остальных (loxodromic) сегментов в противном случае.

Ответ 3

Ссылка на эту ссылку

Обнаружение Polygon Touch Google Map API V2

Его алгоритм RayCasting может помочь вам:)

Краткое описание алгоритма:

Горизонтальная линия выводится из вашей точки вправо, если она пересекает стороны многоугольника нечетным числом раз, то точка находится внутри многоугольника вне:)

Эти ссылки wiki дадут вам полную идею:

http://en.wikipedia.org/wiki/Point_in_polygon

http://rosettacode.org/wiki/Ray-casting_algorithm