Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测重叠多边形?_C#_Wpf_Polygon_Overlap_Overlapping - Fatal编程技术网

C# 如何检测重叠多边形?

C# 如何检测重叠多边形?,c#,wpf,polygon,overlap,overlapping,C#,Wpf,Polygon,Overlap,Overlapping,我有一个画布,其中有几个多边形,我想做的是尝试检测多边形是否重叠。我在不同的网站上浏览了一下,发现大部分都与对象碰撞有关,我的多边形没有移动,所以这不会成为问题。 我想知道是否有人能为我指出正确的方向,如何检测它们是否重叠。有没有一种方法可以计算屏幕上使用的空间?还是多边形的区域来比较两者 例如,像这里的模型一样,红色形状与绿色形状重叠。 基本上我只想说是的,它们是重叠的,或者不是重叠的 提前谢谢 Pete假设每个多边形都是一个形状(路径或多边形),您可以使用它们的方法成对检查间隔。此库(免费

我有一个画布,其中有几个多边形,我想做的是尝试检测多边形是否重叠。我在不同的网站上浏览了一下,发现大部分都与对象碰撞有关,我的多边形没有移动,所以这不会成为问题。 我想知道是否有人能为我指出正确的方向,如何检测它们是否重叠。有没有一种方法可以计算屏幕上使用的空间?还是多边形的区域来比较两者

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

提前谢谢


Pete

假设每个多边形都是一个形状(路径或多边形),您可以使用它们的方法成对检查间隔。

此库(免费和开源)将显示多边形剪裁:

这就是说,如果多边形重叠表示一个多边形中至少有一个点在另一个多边形中,则可以通过查看或来测试每个多边形的点与其他点的对比

这些方法都会以不同的效率工作,试着看看什么最适合你的情况


然而,您的图表似乎表明您希望查看这些多边形是“并排”还是类似的。这将有助于澄清这一点。重叠通常需要一些协调计划来确定重叠。

我也遇到了同样的问题,我使用了这个实现(这是受此启发的:):

bool DoesPolygonsOverlap(IList第一多边形,IList第二多边形)
{
foreach(firstPolygon中的变量项)
{
if(IsPointInPolygon(第二个多边形,项目))
{
返回true;
}
}
foreach(第二个多边形中的变量项)
{
if(IsPointInPolygon(第一个多边形,项目))
{
返回true;
}
}
返回false;
}
布尔IsPointInPolygon(IList多边形,点测试点)
{
布尔结果=假;
int j=polygon.Count()-1;
对于(int i=0;i=testPoint.Y | |多边形[j].Y=testPoint.Y)
{
如果(多边形[i].X+(测试点.Y-多边形[i].Y)/(多边形[j].Y-多边形[i].Y)*(多边形[j].X-多边形[i].X)

注意:功能没有经过太多测试,有很大的改进潜力。如果您发现错误/问题,请告诉我。

谢谢@yamen,我会看看这些解决方案,看看它们是否适合我的情况。这张图是这些形状的等距视图,所以如果你往下看,在平面图上它们会是一个在另一个前面,所以我知道没有多边形相互交叉或穿过另一个。
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;
}