Как определить перекрывающиеся полигоны?

У меня есть холст с несколькими полигонами, и я хочу попробовать определить, перекрываются ли полигоны. Я просмотрел различные веб-сайты и в основном обнаружил, что это связано с столкновением объектов - this example, мои многоугольники не перемещаются, так что это не будет проблемой. Мне было интересно, может ли кто-нибудь указать мне в правильном направлении, как определить, пересекаются ли они. Есть ли метод, который может рассчитать пространство, используемое на экране? или область полигона для сравнения двух?

Так, например, как на макете здесь, красная форма перекрывает зеленую. по сути, все, что я хочу, это сказать: да, они частично совпадают или нет.

http://peterfleming.net84.net/Slice%201.png

Заранее спасибо.

Пит


person Peter    schedule 17.05.2012    source источник


Ответы (3)


Эта библиотека (бесплатная и с открытым исходным кодом) покажет отсечение многоугольника: http://www.angusj.com/delphi/clipper.php

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

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

Однако ваша диаграмма, кажется, предполагает, что вы хотите увидеть, расположены ли эти многоугольники «бок о бок» или что-то подобное. Было бы полезно получить разъяснения по этому поводу. Перекрытие обычно требует некоторого плана координат для определения перекрытия.

person yamen    schedule 17.05.2012
comment
Спасибо @yamen, я посмотрю на эти решения и посмотрю, работают ли они в моей ситуации. диаграмма представляет собой изометрический вид этих фигур, поэтому, если бы вы посмотрели вниз, на виде сверху они были бы один перед другим, поэтому я знаю, что никакие многоугольники не пересекаются друг с другом или проходят один через другой. - person Peter; 17.05.2012

Предполагая, что каждый многоугольник представляет собой форму (путь или многоугольник), вы можете использовать FillContainsWithDetail метод их RenderedGeometry для попарной проверки интерцепции .

person Clemens    schedule 17.05.2012

У меня тоже была такая же проблема, и я использовал эту реализацию (которая вдохновлена ​​этим: C # Point в многоугольнике):

bool DoesPolygonsOverlap(IList<Point> firstPolygon, IList<Point> secondPolygon)
{
    foreach (var item in firstPolygon)
    {
        if (IsPointInPolygon(secondPolygon, item))
        {
            return true;
        }
    }
    foreach (var item in secondPolygon)
    {
        if (IsPointInPolygon(firstPolygon, item))
        {
            return true;
        }
    }
    return false;
}

bool IsPointInPolygon(IList<Point> polygon, Point testPoint)
{
    bool result = false;
    int j = polygon.Count() - 1;
    for (int i = 0; i < polygon.Count(); i++)
    {
        if (polygon[i].Y < testPoint.Y && polygon[j].Y >= testPoint.Y || polygon[j].Y < testPoint.Y && polygon[i].Y >= testPoint.Y)
        {
            if (polygon[i].X + (testPoint.Y - polygon[i].Y) / (polygon[j].Y - polygon[i].Y) * (polygon[j].X - polygon[i].X) < testPoint.X)
            {
                result = !result;
            }
        }
        j = i;
    }
    return result;
}

Внимание: функция не особо тестировалась и имеет большой потенциал для улучшения. Скажите, пожалуйста, если вы обнаружите ошибку / проблему.

person Gener4tor    schedule 17.06.2020