当前位置:  开发笔记 > 编程语言 > 正文

计算3D(或nD)质心的最佳方法是什么?

如何解决《计算3D(或nD)质心的最佳方法是什么?》经验,为你挑选了3个好方法。

作为工作项目的一部分,我必须计算3D空间中一组点的质心.现在我正以一种看似简单但天真的方式做到这一点 - 通过取每组点的平均值,如:

centroid = average(x), average(y), average(z)

其中x,yz是浮点数的数组.我似乎记得有一种方法可以获得更准确的质心,但我还没有找到一个简单的算法.任何人有任何想法或建议吗?我正在使用Python,但我可以调整其他语言的示例.



1> deemer..:

不,这是点集合的质心的唯一公式.请参阅维基百科:http://en.wikipedia.org/wiki/Centroid



2> AlejoHausner..:

你含糊地提到"一种获得更准确的质心的方法".也许你在谈论一个不受异常值影响的质心.例如,平均在美国的家庭收入可能是非常高的,因为少数非常富有的人歪曲的平均值; 他们是"异常者".因此,统计学家使用中位数.获得中位数的一种方法是对值进行排序,然后在列表中间选择值.

也许你正在寻找类似的东西,但是对于2D或3D点.问题是,在2D和更高版本中,您无法排序.没有自然秩序.然而,有办法摆脱异常值.

一种方法是找到点的凸包.凸包在点集的"外部"上具有所有点.如果你这样做,并扔出船体上的点,你将抛弃异常值,剩下的点将给出一个更"代表性"的质心.您甚至可以多次重复此过程,结果就像剥洋葱一样.事实上,它被称为"凸壳剥皮".


在美国的家庭收入可能是非常高的,因为少数
富有的人歪曲的平均值; 他们是"异常者".因此,统计学家使用中

3> Chris..:

与此处的常见副词相反,有不同的方法来定义(和计算)点云的中心.您已经提出了第一个也是最常见的解决方案,我不会认为这有什么问题:

centroid = average(x), average(y), average(z)

这里的"问题"是它会根据你的分布点"扭曲"你的中心点.例如,如果您假设所有点都在一个立方体框或其他几何形状内,但大部分都恰好位于上半部分,那么您的中心点也会向该方向移动.

作为替代方案,您可以使用每个维度中的数学中间值(极值的平均值)来避免这种情况:

middle = middle(x), middle(y), middle(z)

当你不太关心点的数量时,你可以使用它,但更多的是关于全局边界框,因为这就是 - 你的点周围的边界框的中心.

最后,您还可以median在每个维度中使用(中间的元素):

median = median(x), median(y), median(z)

现在,这将middle与实际情况相反,实际上可以帮助您忽略点云中的异常值,并根据点的分布找到中心点.

找到"好"中心点的更有力的方法可能是忽略每个维度中的顶部和底部10%,然后计算averagemedian.如您所见,您可以通过不同方式定义中心点.下面我将向您展示2个2D点云的示例,并考虑到这些建议.

深蓝色点是平均(平均)质心.中位数以绿色显示.中间显示为红色.在第二张图片中,您将看到我之前正在谈论的内容:绿点"更接近"点云的最密集部分,而红点距离它更远,考虑到最极端的边界.点云.

在此输入图像描述 在此输入图像描述

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有