我有一个有几个多边形的画布,我想做的是尝试检测多边形是否重叠。我在各种网站上环顾四周,发现的大部分内容与对象碰撞有关——例如,我的多边形没有移动,所以这不会成为问题。我想知道是否有人可以为我指出如何检测它们是否重叠的正确方向。有没有一种方法可以计算屏幕上使用的空间?或多边形的区域来比较两者?
例如,就像这里的模型一样,红色形状与绿色形状重叠。基本上我只想说是的,它们是重叠的,或者不是。
http://peterfleming.net84.net/Slice%201.png
提前致谢。
皮特
我有一个有几个多边形的画布,我想做的是尝试检测多边形是否重叠。我在各种网站上环顾四周,发现的大部分内容与对象碰撞有关——例如,我的多边形没有移动,所以这不会成为问题。我想知道是否有人可以为我指出如何检测它们是否重叠的正确方向。有没有一种方法可以计算屏幕上使用的空间?或多边形的区域来比较两者?
例如,就像这里的模型一样,红色形状与绿色形状重叠。基本上我只想说是的,它们是重叠的,或者不是。
http://peterfleming.net84.net/Slice%201.png
提前致谢。
皮特
这里的这个库(免费和开源)将显示多边形裁剪:http ://www.angusj.com/delphi/clipper.php
也就是说,如果通过多边形重叠,您的意思是至少一个点在另一个点内,您可以通过查看点中点多边形问题或检查每个多边形线以查看它是否跨越来测试每个多边形的点与其他点另一个多边形。
这些方法都会以不同的效率工作,尝试看看哪种方法最适合您的情况。
但是,您的图表似乎表明您想查看这些多边形是否“并排”或类似的东西。这将有助于澄清这一点。重叠通常需要一些坐标计划来确定重叠。
假设每个多边形都是一个形状(路径或多边形),您可以使用其RenderedGeometry的FillContainsWithDetail方法来成对检查相交。
我也遇到了同样的问题,我使用了这个实现(这是受此启发的天堂: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;
}
注意:该功能没有经过太多测试,有很大的改进潜力。如果您发现错误/问题,请告诉我。