2010-12-12 3 views
4

Der Namespace System.Windows.Shapes.Shape bietet Zugriff auf Polygon Objekt, das in XAML oder Code verwendet werden kann. Grundlegende Berechnung für WPF-Polygon: Bereich und Zentroid

Gibt es eine Microsoft-Bibliothek, die einige sehr grundlegende Berechnungen für einen Polygon-ähnlichen Bereich oder eine Zentrierung bereitstellt?

Meine Präferenz ist es, diese Funktionen nicht selbst neu zu implementieren oder eine Mathematik/Geometrie-Bibliothek zu kopieren.

Antwort

8

Die RenderedGeometry-Eigenschaft gibt ein Geometry-Objekt zurück, das selbst über eine GetArea-Methode verfügt.

Es scheint nicht, etwas zu sein, um den Schwerpunkt zu berechnen, aber es sollte ziemlich einfach sein, zu tun, auf der Grundlage der Points Eigenschaft der Polygon:

Point centroid = 
    polygon.Points.Aggregate(
     new { xSum = 0.0, ySum = 0.0, n = 0 }, 
     (acc, p) => new 
     { 
      xSum = acc.xSum + p.X, 
      ySum = acc.ySum + p.Y, 
      n = acc.n + 1 
     }, 
     acc => new Point(acc.xSum/acc.n, acc.ySum/acc.n)); 
+0

Vielen Dank für das Aufzeigen, wie man die Fläche und die Mitte berechnet; Das bringt mich dazu. – Zamboni

2

Ich stellte einige Linq-ified geometrische Operationen in diesem Beitrag:

How to Zip one IEnumerable with itself

die Schwerpunktberechnung geschrieben I unterscheidet sich von der, die @Thomas Levesque geschrieben. Ich habe es von Wikipedia - Centroid. Sein Aussehen ist viel einfacher als das, das ich gepostet habe.

Hier ist mein Algorithmus (es Verwendung von SignedArea und Pairwise aus dem obigen Link macht):

public static Position Centroid(IEnumerable<Position> pts) 
    { 
    double a = SignedArea(pts); 

    var c = pts.Pairwise((p1, p2) => new 
             { 
             x = (p1.X + p2.X) * (p1.X * p2.Y - p2.X * p1.Y), 
             y = (p1.Y + p2.Y) * (p1.X * p2.Y - p2.X * p1.Y)  
             }) 
       .Aggregate((t1, t2) => new 
             { 
             x = t1.x + t2.x, 
             y = t1.y + t2.y 
             }); 

    return new Position(1.0/(a * 6.0) * c.x, 1.0/(a * 6.0) * c.y); 
    } 

Es gibt auch einige andere Algorithmen zu dieser Verbindung, die Sie nützlich sein könnten.

+0

Danke für diese Antwort. – Zamboni