最近我试图解决一个小的AI问题,但由于找不到各种身体的质量中心而陷入其中。 我想知道你们中是否有人可以帮我解决这个问题。
问题解释:假设我有一个2D体,其形状非常不规则并且整个质量分布均匀。这就像身体由每个单位质量的'n'微小颗粒组成,因此虽然身体形状非常不规则但质量分布均匀。我怎样才能找到这个身体的质心或重心?
Avanish !!
答案 0 :(得分:5)
将您的身体简化为多边形and find its centroid,因为(quoting wikipedia):
如果物体密度均匀,那么 它的质心与中心相同 形状的质心。
如果有很多粒子,在多边形内均匀分布,这种方法会更快。
如果您有n
个粒子,请计算其X和Y坐标的平均值;那是质量的中心。
系统的质心 粒子定义为平均值 他们的位置,由他们加权 群众:
您的粒子具有相同的质量,因此您的分母等于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是获得近似值的好方法。
对于单个操作而言不会更快的替代方案,但如果您不得不经常重新计算可能会有用,那就是将工作集减少到较小的一组较重点。像这样:
N_x * N_y * N_z
的{{1}}单元格网格。为了表示改进,你需要每个单元平均有10个或更多的原始点,但不要太多,以至于引入的重点会消除你正在寻找的信号。
如何最好地执行第2步取决于原始数据的组织方式以及您在内存中存储多少空间来存储中间结果。有很多可用的内存:
(l_x,l_y,L_z)
,M
,Rx
和Ry
(或一个标量数组{{1和一个向量数组Rz
,这取决于你的实现语言)由于内存相对较少但可用于预先计算的时间很长,因此您可以在每个单元格中使用一次主列表(但如果您有这样的时间,则可能只能直接执行此操作)。