如何在3D中计算任意形状的中心?

max*_*yne -3 c++ opengl math 3d computational-geometry

我想知道在3D中找到任意形状中心的准确方法.在图中,我已经解释了3个案例.

  1. 在第一种情况下,我们如何计算任意点的中心?一个想法是所有点的总和除以总点数.这是唯一的方法,它是否准确?

  2. 第二是如何计算3D中不规则任意形状的近似中心?这是1的相同情况吗?

  3. 我们如何计算由任意顶点组成的弯曲/弯曲管的中心线?对于这个问题,我们必须先解决两个案例吗?

在此输入图像描述

Age*_*ien 6

解决方案实际上取决于您实际需要的内容.

如果你在一个形状中寻找所有点的平均位置,那么平均它们确实会给你这个.但是,你可以直截了当地说"在中间".例如,考虑一个框,其中一边的顶点是对面的两倍.平均位置将在该侧的一半,而不是在盒子的中间.

更有可能的是,我会说你正在寻找通过计算每个维度的最大和最小边界定义的点,然后对这两个维度进行平均.因为你用C++标记了这个,所以这里是一些示例代码:

// Define max and min
double max[DIMENSIONALITY];
double min[DIMENSIONALITY];

// Init max and min to max and min acceptable values here. (see numeric_limits)

// Find max and min bounds
for(size_t v_i = 0; v_i < num_vertices; ++v_i)
{
    for(int dim = 0; dim < DIMENSIONALITY; ++dim)
    {
        if(shape[v_i][dim] < min[dim]) min[dim] = shape[v_i][dim];
        if(shape[v_i][dim] > max[dim]) max[dim] = shape[v_i][dim];
    }
}

// Calculate middle
double middle[DIMENSIONALITY];
for(int dim = 0; dim < DIMENSIONALITY; ++dim) 
    middle[dim] = 0.5 * (max[dim] + min[dim]);
Run Code Online (Sandbox Code Playgroud)

对于任何一种解决方案,问题的维度都无关紧要.

编辑: 正如下面的评论所指出的,这可能会导致中间点位于形状本身之外.如果您需要一个位于形状的点,则必须使用替代方法.一个简单的解决方案是在每个轴上使用光线行进.