Пересечение многоугольников

Имеются два многоугольника. как можно определить, находится ли один полигон внутри, снаружи или пересекает другой полигон? Многоугольники могут быть вогнутыми или выпуклыми.

+7
27 июн. '12 в 10:11
источник поделиться
4 ответа

Вы хотите использовать теорему разделительной оси для выпуклых многоугольников. В принципе, для каждой грани каждого многоугольника вы проектируете каждый многоугольник на нормали этого лица, и вы видите, пересекаются ли эти проекции.

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

Вогнутые многоугольники сложнее. Я думаю, что вы можете разложить многоугольник на множество выпуклых многоугольников и попытаться проверить каждую комбинацию пересечения, но я бы не счел себя достаточно квалифицированным в этой области, чтобы попробовать.

+3
27 июн. '12 в 17:50
источник

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

Однако, если вы уверены, что вам нужно решение для двух и только двух полигонов, тогда его можно решить с помощью последовательных тестов типа "точка-vs-полигон" и "сегмент-vs-полигон".

+2
28 июн. '12 в 0:08
источник

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

bool isInside(point a, polygon B)
{
    double angle = 0;
    for(int i = 0; i < B.nbVertices(); i++)
    {
        angle += angle(B[i],a,B[i+1]);
    }
    return (abs(angle) > pi);
}
  • Если сегмент линии A пересекает отрезок линии B, то два полигона пересекаются друг с другом.
  • Если все точки многоугольника A находятся внутри многоугольника B, то A находится внутри B.
  • Если все точки многоугольника B находятся внутри многоугольника A, то B внутри A.
  • Если все точки многоугольника A находятся вне многоугольника B, то A вне B.
  • Еще два полигона пересекаются друг с другом.
0
27 июн. '12 в 14:10
источник

Существует простой способ проверить, находится ли точка в многоугольнике. В соответствии с этой статьей Википедии он называется алгоритмом кастинга лучей.

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

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

Затем вы можете использовать этот метод так, как Томас описал в своем ответе, чтобы проверить, пересекаются ли два полигона. Это должно дать вам алгоритм O(NM), где два полигона имеют вершины N и M соответственно.

0
28 июн. '12 в 0:05
источник

Посмотрите другие вопросы по меткам или Задайте вопрос