环形包裹(x和y包裹)2D阵列上的一组位置的质心?

时间:2016-11-22 14:30:01

标签: python algorithm math

我有一个平坦的欧几里德矩形表面但是当一个点移动到右边界时,它将出现在左边界(在相同的y值处)。反之亦然,跨越顶部和底部边界。我希望能够计算出一组点的质心。有问题的一组点大多聚集在一起。

我知道我可以通过平均所有x和y值来计算一组点的质心。我如何在环绕地图中做到这一点?

2 个答案:

答案 0 :(得分:1)

如果簇大小相对较小(小于网格的一半),则可以使用简单的方法:

让表面宽度和高度分别为W和H.想象一下,表面尺寸是三倍的,所以你有-W..2 * W和-H..2 * H轴范围。展开包装值。

 XMin = X[0];  XMax = X[0]
 the same for Y

 for i = 1..N-1
    Check distance from X[i] to XMax and XMin
    Get largest of them D
    If D is larger than W/2, shift X[i] by W
    //example1: W=100, Xmin = 70, XMax = 90, X[i]=10 => X[i]=20+100 = 120 
    //example2: W=100, Xmin = 5, XMax = 12, X[i]=98 => X[i]=98-100 = -2 
    the same for Y
    update Min/Max
    Calc (W + Average(X[i])) %% W  //modulo operation

答案 1 :(得分:0)

我之前为Ramachandran情节做过这个。我会检查,但我似乎记得我使用的算法是:

  1. 假设您的Euclidian区域的原点为(0,0)
  2. 移动集合中的所有点,使其完全位于区域内
  3. 计算质心
  4. 按原始
  5. 的反向移回质心

    因此,假设您的点在X轴上分开,您会发现点集的最小X坐标大于该区域的中点轴。然后找到 d 到Y轴边缘的距离。然后通过 d 移动整个群集。