关于c#:WPF多边形的基本计算:面积和质心

Basic Calculation for WPF Polygon: Area and Centroid

System.Windows.Shapes.Shape命名空间提供对可以在XAML或代码中使用的Polygon对象的访问。

是否存在一个Microsoft库,该库提供有关多边形之类的面积或中心的一些非常基本的计算?

我的偏好是不要自己重新实现这些功能或复制数学/几何库。


RenderedGeometry属性返回一个Geometry对象,该对象本身具有一个GetArea方法。

似乎没有什么可以计算质心,但基于PolygonPoints属性,它应该很容易做到:

1
2
3
4
5
6
7
8
9
10
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));


我在这篇文章中发布了一些基于linq的几何运算:

如何用自身压缩一个IEnumerable

我发布的质心计算与@Thomas Levesque发布的质心计算不同。我从Wikipedia-Centroid获得。他的看上去比我发布的简单得多。

这是我的算法(它通过上面的链接使用了SignedArea和Pairwise):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  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);
  }

在该链接上还有一些其他算法可能会有用。