それで、一連の頂点がある場合、形状の重心を見つけるためのアルゴリズムは何だろうと思っていますか?
また、アルゴリズムを短くすると、複雑なポリゴンが単純な凸ポリゴンのセットとして保存され、それらの頂点を取得できます。
上記の式を見つけましたが、それを翻訳する方法がわかりません......
新しい証拠に照らして、私はあなたの与えられた式が間違っていると確信しています. 別のアルゴリズムを提供させてください。私はそれを C++ 風に見せようとしましたが、いくつか間違っていると確信しています。それらについてつまらないことをしたい場合は、それで問題ありません。それらに反対票を投じたい場合は、私はあなたを止めることはできませんが、投稿を改善するためにそれらを編集して削除してください. :-)
// 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);
ここに示されているアルゴリズムを試してください。凸多角形で機能します。
一般的なアプローチは、計算が容易な部分に図形を分割し、それらの質量中心を計算して結合することです: C=sum(C[i]*mass[i])/sum(mass[i])
まず、ポリゴン内での質量の分布方法を定義する必要があります。可能な (単純な) 分布:
おおよそ次のように、単純な平均関数を使用できます。
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++ を介して実行しないと、どのテンプレート パラメーターが自動的に推論されるかわかりません。