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

时间:2012-12-04 08:08:58

标签: c++ math opengl 3d computational-geometry

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

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

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

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

  4. enter image description here

1 个答案:

答案 0 :(得分: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]);

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

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