找到2D复杂多边形的中心(质量)

时间:2011-09-14 00:23:17

标签: c++ algorithm centroid

所以我想知道如果我有一组顶点,找到一个形状质心的算法是什么?

此外,如果它使算法更短,我的复杂多边形将保存为一组简单的凸多边形,并且您可以获得它们的顶点。

an image

我找到了上面的等式,但我不知道如何翻译......

4 个答案:

答案 0 :(得分:2)

根据新的证据,我坚信你给出的公式是错误的。请允许我提供不同的算法。我试图让它看起来像C ++ ish,但我确信我有些不对劲。如果你想挑剔那些,那没关系。如果你想对它们进行投票,我无法阻止你,但我宁愿你编辑它们以使帖子更好。 : - )

// use doubles if appropriate
float xsum = 0.0;
float ysum = 0.0;
float area = 0.0;
for(int i = 0; i < points.size - 1; i++) {
    // I'm not a c++ guy... do you need to use pointers? You make the call here
    Point p0 = points[i];
    Point p1 = points[i+1];

    double areaSum = (p0.x * p1.y) - (p1.x * p0.y)

    xsum += (p0.x + p1.x) * areaSum;
    ysum += (p0.y + p1.y) * areaSum;
    area += areaSum;
}

float centMassX = xsum / (area * 6);
float centMassY = ysum / (area * 6);

答案 1 :(得分:1)

尝试给定here的算法。它适用于凸多边形。

答案 2 :(得分:1)

一般方法是将图形拆分为更容易计算的部分,计算它们的质量中心并将它们组合:C = sum(C [i] * mass [i])/ sum(mass [i])

首先,您应该定义质量在多边形中的分布方式。可能的(简单)分布:

  1. 集中在顶点(统一) - 您的问题中的公式适用于此情况
  2. 均匀分布在多边形的边界上 - 在这种情况下,你应该计算每条线的质心(它只是线的中间),乘以线长,加上所有线并除以整个边长
  3. 在多边形区域上均匀分布 - 最简单的理解方法是将其拆分为三角形,计算每个三角形的质量中心,乘以其面积,加上所有这些,除以多边形的整个区域

答案 3 :(得分:0)

您可以使用简单的平均函数,大致如下:

template <typename T, typename iterator> T avg(iterator const& begin, iterator const& end) {
  T result;
  size_t size(0);
  for (iterator it = begin; it != end; ++it) {
    result += *it;
    size++;
  }
  return result/size;
}

现在,假设你的值在一个集合中,你可以这样做:

std::set<double> xs; // assuming your values are in there
double x = avg<double,std::set<double>::iterator>(xs.begin(), xs.end());

没有通过g ++运行它,我不确定,哪些模板参数可以自动推断。