所以我想知道如果我有一组顶点,找到一个形状质心的算法是什么?
此外,如果它使算法更短,我的复杂多边形将保存为一组简单的凸多边形,并且您可以获得它们的顶点。
我找到了上面的等式,但我不知道如何翻译......
答案 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])
首先,您应该定义质量在多边形中的分布方式。可能的(简单)分布:
答案 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 ++运行它,我不确定,哪些模板参数可以自动推断。