2012-12-04 42 views
-3

我想知道在3D中找到任意形状中心的准确方法。 图中我解释了3个案例。如何在3D中计算任意形状的中心?

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

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

  3. 我们如何计算由任意顶点组成的弯曲/弯曲管的中心线?对于这个问题,我们必须解决前两种情况,我认为这样呢?

enter image description here

+7

首先,你是什么意思的“中心”? – Agentlien

+1

这几乎是C++ .... – Caribou

+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]); 

无论哪种解决方案,问题的维度并不重要。

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

+0

只要多边形凹入,那么此结果可能会落在多边形之外。 – acraig5075

+0

当然,我知道这一点。但也许我应该指出。 – Agentlien

+0

射线追踪三线可以考虑但是..想象当你有这样一个弯曲的形状管?你在一个无限光线中有多于一个三角形..? – furqan