#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 обычным способом? Просто спрашиваю, потому что вы вообще не объяснили свой алгоритм, поэтому мы собираемся проделать дыры в любых крошечных кусочках, которые сможем увидеть, если вы не объясните логику.