PHP — Расположение внутри нескольких полигонов

#php #math #geometry #polygon

Вопрос:

Как я могу включить это в поддержку большего количества полигонов, чем только этот? Я думаю о чем-то с массивами, но я заблудился, этот код работает с одним полигоном, но просто не могу продвинуться дальше, вот что у меня получилось:

Я хотел бы, чтобы он проверил, находится ли точка в полигоне A, B или C и так далее, В зависимости от того, сколько полигонов у меня есть прямо сейчас, он проверяет только, находится ли точка внутри полигона A.

 class Point {
    public $lat;
    public $long;
    function Point($lat, $long) {
        $this->lat = $lat;
        $this->long = $long;
    }
}

//the Point in Polygon function
function pointInPolygon($p, $polygon) {
    //if you operates with (hundred)thousands of points
    set_time_limit(60);
    $c = 0;
    $p1 = $polygon[0];
    $n = count($polygon);

    for ($i=1; $i<=$n; $i  ) {
        $p2 = $polygon[$i % $n];
        if ($p->long > min($p1->long, $p2->long)
            amp;amp; $p->long <= max($p1->long, $p2->long)
            amp;amp; $p->lat <= max($p1->lat, $p2->lat)
            amp;amp; $p1->long != $p2->long) {
                $xinters = ($p->long - $p1->long) * ($p2->lat - $p1->lat) / ($p2->long - $p1->long)   $p1->lat;
                if ($p1->lat == $p2->lat || $p->lat <= $xinters) {
                    $c  ;
                }
        }
        $p1 = $p2;
    }
    // if the number of edges we passed through is even, then it's not in the poly.
    return $c%2!=0;
}

$polygon = array(
    new Point(54.992883, -9.860767),
    new Point(54.992775, -9.860289),
    new Point(54.992236,- 9.861030),
    new Point(54.992473, -9.862007)
);


 

Комментарии:

1. Конечно, вы используете PHP, но проблема, о которой вы спрашиваете, не является проблемой программирования на PHP: пометьте свой пост тегами, соответствующими вашей проблеме. Просто php , безусловно, не даст вам алгоритм геометрии, люди, которые смотрят на него =) (Тем не менее, если единственное, что вас смущает, — это «как мне проверить более одного полигона», ответ заключается в использовании массива. Поместите все свои полигоны, которые вам нужно протестировать, в массив, а затем проложите свой путь к успеху).

2. Не совсем ясно, какого результата вы хотите. Вы имеете в виду, что хотите иметь возможность передавать в функцию более одного элемента pointInPolygon и получать несколько результатов? Или что-то еще? Пожалуйста, будьте конкретны в том, чего вы пытаетесь достичь. «поддержка большего количества полигонов» немного расплывчата и на самом деле не дает нам определенной цели.

3. Эта точка смотрит только на один полигон, но я бы хотел, чтобы она проверяла несколько полигонов, например, чтобы определить, находится ли пользователь в области 1 или 2, или 3, или 5 … и так далее

4. Так что же именно происходит, когда вы запускаете код прямо сейчас? Какой результат вы получили? И какого результата вы ожидали вместо этого? Также, пожалуйста, покажите вам, как вызывать функцию в данный момент — мы не знаем, что вы передаете для $p переменной.

5. Как основное наблюдение, является for ($i=1; $i<=$n; $i ) { ли логическая ошибка? Или вы намеревались игнорировать первый элемент в массиве $polygon при выполнении цикла? Хотя на самом деле я думаю, что вы в конечном итоге зациклите их все из-за $polygon[$i % $n] . Опять же, это намеренно, чтобы изменить порядок их обработки, или просто обходной путь для того, чтобы не знать, как начать цикл с 0 обычным способом? Просто спрашиваю, потому что вы вообще не объяснили свой алгоритм, поэтому мы собираемся проделать дыры в любых крошечных кусочках, которые сможем увидеть, если вы не объясните логику.