【发布时间】:2012-06-25 17:22:43
【问题描述】:
我有一个方法会占用我 25% 的 CPU 时间。我每秒调用这种方法大约 27,000 次。 (是的,很多电话,因为它经常更新)。我想知道是否有人知道一种更快的方法来检测 2 个多边形是否重叠。基本上,我必须检查屏幕上的移动对象和屏幕上的静止对象。我正在使用 PathGeometry,下面的两个调用占用了我的程序使用的 CPU 时间的 25%。我传递的 PointCollection 对象只包含代表多边形 4 个角的 4 个点。它们可能不会创建一个矩形区域,但所有点都是连接的。我猜应该是梯形。
这些方法很短并且很容易实现,但我想我可能希望选择一个更复杂的解决方案,如果我可以让它比下面的代码运行得更快。有什么想法吗?
public static bool PointCollectionsOverlap(PointCollection area1, PointCollection area2)
{
PathGeometry pathGeometry1 = GetPathGeometry(area1);
PathGeometry pathGeometry2 = GetPathGeometry(area2);
return pathGeometry1.FillContainsWithDetail(pathGeometry2) != IntersectionDetail.Empty;
}
public static PathGeometry GetPathGeometry(PointCollection polygonCorners)
{
List<PathSegment> pathSegments = new List<PathSegment>
{ new PolyLineSegment(polygonCorners, true) };
PathGeometry pathGeometry = new PathGeometry();
pathGeometry.Figures.Add(new PathFigure(polygonCorners[0], pathSegments, true));
return pathGeometry;
}
【问题讨论】:
-
如果您有这么多对象,您是否总是针对每个形状测试每个形状?因为首先,您不需要针对所有测试全部, set{a, b} 1)a->a, 2)a->b 3)b->a, 4)b->a; 4 个测试可以减少到 1 个(只是为了解释我的意思)。否则,为简单起见,您可以将形状分类为四叉树或简单网格,并且仅在 2 个形状共享同一个单元格时才使用昂贵的重叠测试。您还可以在第二种方法中缓存 PathGeometry 对象,至少对于您的固定形状。
-
A 组最多有 100 个形状,B 组最多有 16 个形状。我循环遍历 A 组,对于 A 组中的每个项目,我检查 B 组中的所有形状,所以我只检查我需要做的事情,而不是重复任何检查。我可以缓存我的 SetB 形状的 PathGeometries,因为它们不会经常更改。那会有所帮助。我不确定将形状排序成四叉树是什么意思..
-
考虑这张图片codeproject.com/KB/recipes/QuadTree/QuadTree4.png。您将静止形状放在四叉树中,为动态形状生成边界框,而不是针对每个静止形状测试每个形状。您首先让您的动态形状检索它当前重叠的四叉树中的单元格,并且这些单元格附有固定形状,因此您知道您只需要测试这些。谷歌四叉树,对于这种情况,它是一种非常常见且广泛使用的数据结构。
标签: wpf polygon polygons pathgeometry point-in-polygon