WPF多边形的基本计算:面积和质心

5

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

是否有微软库可提供多边形的基本计算,如面积或重心?

我的偏好是不重新实现这些函数或复制数学/几何库。

2个回答

9

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

似乎没有任何计算重心的东西,但是根据PolygonPoints属性应该很容易实现:

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));

谢谢您指出如何计算面积和质心;这让我有了一个好的开始。 - Zamboni

2
我在这篇文章中发布了一些使用linq的几何运算:如何将一个IEnumerable与自身进行Zip操作
我发布的质心计算方法与@Thomas Levesque发布的不同。 我从维基百科 - 质心获得了它。 他的方法看起来比我发布的要简单得多。
以下是我的算法(它利用了上面链接中的SignedArea和Pairwise):
  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); 
  } 

这个链接中还有一些其他算法,您可能会发现它们很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接