Существует ли более эффективный способ обнаружения перекрытия/пересечения полигонов, чем 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;
}
5
задан Curtis 27 June 2012 в 20:14
поделиться