местоположение найдено в пределах многоугольника или нет C # - PullRequest
0 голосов
/ 28 августа 2018

Я ищу идеальный алгоритм в C #, который определяет, находится ли местоположение (широта / долгота) в многоугольнике или нет.

На карте Google я создал разные зоны в форме многоугольника. Каждая зона может быть представлена ​​набором координат. Например, ниже приведены координаты залива Монтего (зона А), Ямайка (комбинация долготы и широты):

-77.9531479,18.4565699,-77.9482339,18.4579542,-77.9443393,18.4615874,-77.9399726,18.4627373,-77.933943,18.4653526,-77.931272,18.4652763,-77.9282138,18.46578,-77.9267121,18.4645891,-77.924619,18.4625118,-77.923131,18.4689837,-77.924646,18.4727285,-77.924112,18.4763919,-77.9255882,18.4793735,-77.927573,18.4833522,-77.9234638,18.4888979,-77.92363,18.492311,-77.914973,18.4951459,-77.918355,18.4971759,-77.972733,18.4985953,-77.916291,18.527569,-77.8997725,18.56178,-77.8962851,18.58578,-77.873843,18.517512,-77.8772736,18.5228297,-77.9253387,18.521568,-77.9531479,18.4565699

Теперь давайте скажем, что нам нужно выяснить, принадлежит ли Сансет Бич Гостиницы, Монтего Бэй, Ямайка, координаты которых (длинные / лат): -95.030710, 29.148650, принадлежит Зоне А или нет?

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

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 28 августа 2018

Я успешно использовал номер обмотки: http://geomalgorithms.com/a03-_inclusion.html

Шаг 1. Определите направление рисования многоугольника.

По сути, многоугольник статичен и не имеет направления. Однако учтите движения, которые вы выполняете, когда рисуете многоугольник на листе бумаги. Вы начинаете с одной позиции и перемещаете ручку, чтобы нарисовать линию для каждой стороны многоугольника. Если вы не снимаете ручку с бумаги, все стороны многоугольника будут либо нарисованы по часовой стрелке, либо против часовой стрелки.

Мы можем использовать это «направление», чтобы определить, как стороны многоугольника «закручиваются» вокруг точки (по часовой стрелке или против часовой стрелки).

С реальным рассматриваемым многоугольником (который не был нарисован в направлении), не важно, в каком направлении вы считаете его нарисованным, но важно, чтобы каждая сторона считалась нарисованной в одном и том же направлении. .

Шаг 2. Рассмотрим каждую сторону многоугольника как отдельный объект с двумя вершинами.

Если мы знаем вершины многоугольника, мы можем определить конечные точки каждой стороны многоугольника.

Шаг 3: Определите направление, в котором каждая сторона пересекает точку (если стороны пересекают точку).

Пример использования намотки по часовой стрелке для определения, окружает ли многоугольник point:

Определите counter для отслеживания числа обмоток.

Для каждой стороны многоугольника возьмите первую вершину vertex1 и вторую вершину vertex2 (эти точки определяют конец каждой стороны). Если vertex1.x <<code>point.x, то сторона начинается слева от point.x. Если vertex2.x> point.x, то сторона заканчивается справа от point.x. Если сторона начинается слева И заканчивается справа, линия пересекает точку.

Если сторона пересекает point, нам нужно определить, в каком направлении она пересекается. Используя положительное направление по часовой стрелке, сторона должна пересекать отметку point, чтобы считаться положительной. Линия пересекается выше point, если значение y строки в позиции x point больше значения y * point. Иначе оно пересекает точку ниже.

Если оно пересекается выше, увеличить counter. Если оно пересекает ниже, уменьшите counter.

ПРИМЕЧАНИЕ: обратите внимание, что если линия проходит слева направо, то в положительном направлении линия проходит выше точки, но если линия идет справа налево (смещается назад под точкой), то в положительном направлении линия видна. пройти ниже точки. Положительное направление по часовой стрелке.

Теперь сделайте то же самое со следующей стороной многоугольника, где vertex1 будет vertex2 предыдущей стороны, а новый vertex2 будет следующим углом многоугольника при движении по часовой стрелке.

Сделайте это для всех сторон многоугольника.

В конце у вас будет счетчик с положительным, отрицательным или нулевым значением.

Если значение счетчика равно 0, многоугольник не содержит точку, в противном случае он содержит.

Это потому, что многоугольник, содержащий точку, всегда будет иметь четное число сторон, проходящих точку. Либо 2 стороны, либо 4 стороны и т. Д. Из этих сторон половина будет проходить слева направо над точкой, а половина - справа налево под точкой.

Результат 0 означает, что ни одна из сторон не проходит точку (следовательно, многоугольник никогда не пересекает ось точки), или многоугольник проходит по одной стороне точки в двух направлениях (например, выше точки слева направо, затем выше точки справа налево). Поэтому номера обмоток взаимно уничтожаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...