我对快速计算简单,凸,(非相交)2D多边形的旋转无关中心感兴趣。
以下示例(左侧)显示平均中心(所有点的总和除以总数),以及右侧所需的结果。
我已经考虑过的一些选项。
我找到了一种工作得相当好的方法,(用边长来衡量点数) - 但这意味着每个边缘的平方根调用 - 我想避免。
< em>(即使我对此并不完全满意,也会发布答案。)
注意,我知道这个问题的相似性:
What is the fastest way to find the "visual" center of an irregularly shaped polygon?
然而,必须处理凸多边形会显着增加问题的复杂性。
答案 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)
这对我来说很好!