找到不规则凸多边形中心的最快方法是什么?

时间:2015-12-03 06:19:13

标签: geometry center polygon point

我对快速计算简单,凸,(非相交)2D多边形的旋转无关中心感兴趣。

以下示例(左侧)显示平均中心(所有点的总和除以总数),以及右侧所需的结果。

center of a polygon

我已经考虑过的一些选项。

  • bound-box center (取决于旋转,并根据它们与轴的关系忽略点)
  • Straight skeleton - 计算速度太慢。

我找到了一种工作得相当好的方法,(用边长来衡量点数) - 但这意味着每个边缘的平方根调用 - 我想避免。
< em>(即使我对此并不完全满意,也会发布答案。)

注意,我知道这个问题的相似性:
What is the fastest way to find the "visual" center of an irregularly shaped polygon?

然而,必须处理凸多边形会显着增加问题的复杂性。

3 个答案:

答案 0 :(得分:1)

多边形的点可以通过边长来加权,这可以补偿非均匀点分布。

这也适用于凸多边形,但在这种情况下,中心点不能保证在多边形内。

Psudo代码:

def poly_center(poly):
    sum_center = (0, 0)
    sum_weight = 0.0
    for point in poly:
        weight = ((point - point.next).length +
                  (point - point.prev).length)
        sum_center += point * weight
        sum_weight += weight

    return sum_center / sum_weight

注意,我们可以预先计算所有边长以将长度计算的数量减半,或者重复使用先前的边长来进行半+ 1长度计算。这只是作为显示逻辑的一个例子。

包括这个答案的完整性,因为它是迄今为止我发现的最佳方法。

答案 1 :(得分:0)

没有比边长加权的坐标积累更好的方法,这确实需要N平方根。

如果接受近似,可以通过曲线简化跳过一些顶点,如下所示:

  • 决定偏差容差;

  • 从顶点0开始并跳转到顶点M(比如M = N / 2);

  • 检查折线沿0到M的偏差是否超过公差(为此,计算由顶点0,M / 2,M形成的三角形的高度);

    • 如果超出偏差,则用0,M / 4,M / 2和M / 2,3M / 4,M递归重复;

    • 如果未超出偏差,则假设形状在0和M之间是直的。

  • 一直持续到多边形结束。

如果点密集(如示例中的左边缘),则应该获得一些加速。

答案 2 :(得分:0)

我认为最简单的方法是对多边形点的Delaunay三角剖分的质心进行处理。即


def _centroid_poly(poly):

    T = spatial.Delaunay(poly).simplices
    n = T.shape[0]
    W = np.zeros(n)
    C = 0

    for m in range(n):
        sp = poly[T[m,:],:]
        W[m] = spatial.ConvexHull(sp).volume
        C += W[m] +np.mean(sp, axis = 0)

    return C / np.sum(W)

这对我来说很好!