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

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

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

===============>>#1 票数:13

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

===============>>#2 票数:11

你含糊地提到“一种获得更准确的质心的方法”。 也许你在谈论一个不受异常值影响的质心。 household income in the USA is probably very high, because a small number of rich people skew the average; 例如,在美国的家庭收入大概是非常高的,因为有钱的人少数歪斜的平均值; 他们是“异常者”。 instead. 出于这个原因,统计学家使用中 获得中位数的一种方法是对值进行排序,然后在列表中间选择值。

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

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

===============>>#3 票数:8 已采纳

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

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

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

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

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

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

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

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

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

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

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

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

===============>>#4 票数:3

你可以使用增加精度求和 - Kahan求和 - 那是你的想法吗?

===============>>#5 票数:2

效率可能更高:如果你多次计算,你可以通过保留两个常设变量来加快速度

N  # number of points
sums = dict(x=0,y=0,z=0)  # sums of the locations for each point

然后在创建或销毁点时更改N和求和。 这会将事物从O(N)改变为O(1),以便在每次创建,移动或销毁点时以更多工作为代价进行计算。

===============>>#6 票数:0

一个“更准确的质心”我相信质心是按照你计算它的方式定义的,因此不会有“更准确的质心”。

===============>>#7 票数:0

是的,这是正确的公式。

如果你有大量的点,你可以利用问题的对称性(无论是圆柱形,球形,镜面)。 否则,你可以从统计数据中借用并平均随机数点,并且只是有一点误差。

===============>>#8 票数:-1

你说对了。 你在计算的是质心或平均向量。

  ask by Marcel Levy translate from so

未解决问题?本站智能推荐:

2回复

使用numpy将3d点转换为新坐标系的功能

我在空间中有n个点: points.shape == (n,3) 我有一个由点O = [ox, oy, oz]和3个不同长度的正交向量定义的新坐标系: Ox = [oxx, oxy, oxz], Oy = [oyx, oyy, oyz], Oz = [ozx, ozy, ozz] 。
3回复

为两个3d向量计算3d平面

如果我有两个向量坐标,它们代表地球表面上地球中心为(0,0,0)且Up向量为(0,0,1)的位置; 计算沿两个向量(方向v2-v1)但返回一定距离的米的3d平面的最佳方法是什么(想象一下在两个向量后面并平行于它们的虚拟剪辑平面) )。
1回复

计算3D视点是否在2D平面后面或上方

设置 在一张纸上绘制XY坐标轴。 沿X轴在其上写一个单词,使单词的中心位于origo(X / Y的正向一半,X / Y的负向另一半)。 现在,如果您将纸张上下翻转,您会发现该单词相对于X轴和Y轴都是镜像的。 如果从纸的后面看,它相对于Y轴是镜像的。 如果从背面和背面朝上看,它是
2回复

计算3D AABB的侧面

我有一个由两组点(最小/最大)定义的3D AABB。 我想定义组成AABB侧面的6个平面,以便AABB内的任何点都具有正的符号距离。 我的平面定义由法线(x,y,z)和常数D组成,对应于Ax + By + Cz + D = 0平面方程。 注意:nx,ny和nz已标准化。
2回复

用矩形的阴影计算矩形3D坐标?

有时是一个问题,矩形3D是什么旋转的,并且是透视过渡(例如在CSS中)绘制为四边形的。 但是我们想要获得通过旋转和透视图绘制为四边形的矩形(宽度,长度,欧拉角,透视图)。
2回复

使用变换计算3D对象的边界框时出现问题

所以我对我的边界框有一个非常奇怪的行为。 每次我翻译任何值为负的对象时,边界框都会被拉伸到0点。 以下是积极翻译的外观: 一切顺利。 但现在我用负Z坐标翻译它。 这是我创建边界框的代码: 我现在的问题是:我做错了什么?
1回复

计算两个3D矩阵的方向之间的角度偏移

我想知道两个3D矩阵(4x4)的方向之间的角度差。 都朝向同一方向的两个矩阵将为零,而朝向相反方向的两个矩阵将为180º。 通过“方向”,我指的是矩阵变换后的对象所面对的方向。 所以我只关心旋转,而不关心平移或缩放。 具体来说,我使用的是WebKitCSSMatrix实例,这些实例将
1回复

3D立方体,计算中心和对角线的顶点

我想知道是否存在一种计算3D立方体(x,y,z)的顶点的方法,知道:-中心(坐标Cx,Cy,Cz)-坐标“最小值”,被理解为坐标的最小顶点立方体(坐标为mx,my,mz)-坐标“ max”,定义为立方体的最大顶点(坐标为Mx,My,Mz)及其对角线(长度由最小值和最大值之间的距离给出)。
1回复

如何计算3D尺寸中某个点的切向量?

在z = 0平面上,我有一个点A(a1,b1,0)。 还有另一个点B(a2,b2,0),我将其视为圆心。 我将AB连接在一起,然后绘制一个半径为AB的圆。 3D区域中还有另一个点C(a3,b3,c3)。 如何在半径为AB的圆上找到AC的切向量?即需要计算AC在点A处的切向量。
7回复

如何计算两个3d圆上的一对最近点?

我在3d空间中有两个2d圆圈(由中心,法线和半径定义),我试图想出一对点,这是一组最接近的点之一。 我知道有1到无限数量的点对,我只需要一对匹配。 有一个简单的方法吗? 精度不是必不可少的。 两个圆的半径相同,非零值。 如果背景有用,我的整体算法在空间中采用NURBS曲线并沿曲