Есть ли более эффективный способ обнаружения перекрытия / пересечения полигонов, чем PathGeometry.FillContainsWithDetail ()?
У меня есть метод, который поглощает 25% моего процессорного времени. Я называю этот метод около 27 000 раз в секунду. (Да, много звонков, так как он часто обновляется). Мне интересно, если кто-нибудь знает более быстрый способ обнаружить, если 2 полигона перекрываются. По сути, я должен проверять движущиеся объекты на экране и неподвижные объекты на экране. Я использую PathGeometry, и два приведенных ниже вызова занимают до 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;
}