【问题标题】:What is the fastest way to find the center of an irregular convex polygon?找到不规则凸多边形中心的最快方法是什么?
【发布时间】:2016-03-07 15:51:39
【问题描述】:

我对计算简单、凸(非相交)二维多边形的旋转无关中心的快速方法感兴趣。

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

我已经考虑过一些选项。

  • 边界框中心(取决于旋转,并根据它们与轴的关系忽略点)
  • Straight skeleton - 计算太慢了。

我找到了一种效果相当不错的方法,(按边长对点加权)-但这意味着对每条边都进行平方根调用-我想避免这种情况。
(将作为答案发布,即使我对此并不完全满意)。


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

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

【问题讨论】:

  • 精确解需要 Ω(N) 次操作。你接受近似解吗?

标签: geometry center polygon point


【解决方案1】:

多边形的点可以通过它们的边缘长度来加权,以补偿不均匀的点分布。

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

伪代码:

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 的长度计算。这只是写一个例子来说明逻辑。


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

【讨论】:

  • 假设线性密度恒定,这个计算是精确的,它确实给出了轮廓的质心。
【解决方案2】:

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

如果接受近似值,可以通过曲线简化跳过部分顶点,如下:

  • 确定偏差容差;

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

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

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

    • 如果不超过偏差,则假设形状在0和M之间是直线。

  • 继续直到多边形结束。

在点密集的地方(如示例中的左边缘),您应该获得一些加速。

【讨论】:

    【解决方案3】:

    我认为用多边形点的 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)
    

    这对我很有效!

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2018-04-13
      • 2012-03-30
      • 2010-09-10
      • 2014-03-13
      • 1970-01-01
      相关资源
      最近更新 更多