如何找到质量分布均匀的不规则体的重心或质心?

时间:2010-01-29 16:45:34

标签: algorithm

最近我试图解决一个小的AI问题,但由于找不到各种身体的质量中心而陷入其中。 我想知道你们中是否有人可以帮我解决这个问题。

问题解释:假设我有一个2D体,其形状非常不规则并且整个质量分布均匀。这就像身体由每个单位质量的'n'微小颗粒组成,因此虽然身体形状非常不规则但质量分布均匀。我怎样才能找到这个身体的质心或重心?

Avanish !!

3 个答案:

答案 0 :(得分:5)

计算多边形的质心:

将您的身体简化为多边形and find its centroid,因为(quoting wikipedia):

  

如果物体密度均匀,那么   它的质心与中心相同   形状的质心。

如果有很多粒子,在多边形内均匀分布,这种方法会更快。

计算所有粒子的平均位置:

如果您有n个粒子,请计算其X和Y坐标的平均值;那是质量的中心。

Quoting wikipedia again

  

系统的质心   粒子定义为平均值   他们的位置,由他们加权   群众:

alt text

您的粒子具有相同的质量,因此您的分母等于n@tkerwin's answer中的代码计算该分数。

如果您没有太多粒子,这种方法很有效。

修改

概率计算:

如果您有太多的积分来有效地计算他们的平均位置,请尝试选择一些随机点。计算它们的平均位置可以得到整个均值的极佳近似值。根据{{​​3}},您选择的点越多,您的近似值就越高。

答案 1 :(得分:3)

质心是每个粒子的平均位置,由该粒子的质量加权。由于你的粒子质量相同,你只需要取平均位置。

那是:

center_x = 0
center_y = 0
for p in particles:
    center_x += p.x
    center_y += p.y
center_x /= len(particles)
center_y /= len(particles)

答案 2 :(得分:1)

行。我现在明白了。您可以使用大量离散粒子。强调号码。

嗯,你为什么不说?

除了迭代所有点之外,你不能完全(即没有近似)这样做。至少没有提供更多相关信息。

如果您可以随机访问数据,

Adam's sampling suggestion是获得近似值的好方法。

对于单个操作而言不会更快的替代方案,但如果您不得不经常重新计算可能会有用,那就是将工作集减少到较小的一组较重点。像这样:

  1. 将空格划分为大小为N_x * N_y * N_z的{​​{1}}单元格网格。
  2. 计算每个单元格中所有点的质心总质量和位置。
  3. 丢弃任何未包含点的单元格,并将结果用作新的工作集。
  4. 为了表示改进,你需要每个单元平均有10个或更多的原始点,但不要太多,以至于引入的重点会消除你正在寻找的信号。

    如何最好地执行第2步取决于原始数据的组织方式以及您在内存中存储多少空间来存储中间结果。有很多可用的内存:

    • 准备并初始化为零四个(N_x,N_y,N_z)数组,称为(l_x,l_y,L_z)MRxRy(或一个标量数组{{1和一个向量数组Rz,这取决于你的实现语言)
    • 按时走主列表,递增每个质量的适当单元格中的值
    • 走中间阵列以计算收集的质量和位置。

    由于内存相对较少但可用于预先计算的时间很长,因此您可以在每个单元格中使用一次主列表(但如果您有这样的时间,则可能只能直接执行此操作)。