如何检测重叠多边形?

时间:2012-05-17 11:39:48

标签: c# wpf polygon overlap overlapping

我有一个画布,其中有多个多边形,我想要做的是尝试检测多边形是否重叠。我在各种网站上四处看看,我发现的大部分内容与物体碰撞有关 - this for example,我的多边形没有移动,所以这不会成为一个问题。 我想知道是否有人可以指出我正确的方向,如何检测它们是否重叠。有没有一种方法可以计算屏幕上使用的空间?或多边形区域比较两个?

因此,例如像这里的模拟,红色形状与绿色形状重叠。 基本上我想要的只是说是的,它们是重叠的,或者不是它们不是。

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

提前致谢。

皮特

3 个答案:

答案 0 :(得分:2)

此库(免费和开源)将显示多边形裁剪:http://www.angusj.com/delphi/clipper.php

也就是说,如果多边形重叠意味着至少有一个点在另一个内部,则可以通过查看point in point polygon problemchecking each polygons lines to see if it cuts across another polygon来测试每个多边形的点与其他点的对比。 / p>

这些方法都会以不同的效率工作,尝试看看哪种方法最适合您的情况。

但是,您的图表似乎建议您想要查看这些多边形是“并排”还是类似的。这有助于澄清这一点。重叠通常需要一些坐标计划来确定重叠。

答案 1 :(得分:0)

假设每个多边形都是一个Shape(路径或多边形),您可以使用FillContainsWithDetailRenderedGeometry方法成对检查区域。

答案 2 :(得分:0)

我也遇到了同样的问题,因此我使用了此实现(受此启发C# Point in polygon):

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;
}

注意:该功能尚未经过大量测试,尚有很大的改进潜力。请告诉我您是否发现错误/问题。