Gibt es eine effizientere Methode zum Erkennen von Polygonüberschneidungen als PathGeometry.FillContainsWithDetail ()?
Ich habe eine Methode, die 25% meiner CPU-Zeit verschlingt. Ich nenne diese Methode ungefähr 27.000 Mal pro Sekunde. (Ja, viele Anrufe, da es häufig aktualisiert wird). Ich frage mich, ob jemand einen schnelleren Weg kennt, um festzustellen, ob sich zwei Polygone überlappen. Grundsätzlich muss ich die sich bewegenden Objekte auf dem Bildschirm mit stationären Objekten auf dem Bildschirm vergleichen. Ich verwende PathGeometry und die beiden folgenden Aufrufe belegen 25% der von meinem Programm verwendeten CPU-Zeit. Die PointCollection-Objekte, die ich übergebe, enthalten nur 4 Punkte, die 4 Ecken eines Polygons darstellen. Sie erzeugen möglicherweise keinen rechteckigen Bereich, aber alle Punkte sind verbunden. Ich denke, ein Trapazoid wäre die Form.
Diese Methoden sind kurz und sehr einfach zu implementieren, aber ich denke, ich möchte vielleicht eine kompliziertere Lösung wählen, wenn sie schneller ausgeführt werden kann als der folgende Code. Irgendwelche Ideen?
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;
}