1

それで、一連の頂点がある場合、形状の重心を見つけるためのアルゴリズムは何だろうと思っていますか?

また、アルゴリズムを短くすると、複雑なポリゴンが単純な凸ポリゴンのセットとして保存され、それらの頂点を取得できます。

画像

上記の式を見つけましたが、それを翻訳する方法がわかりません......

4

4 に答える 4

3

新しい証拠に照らして、私はあなたの与えられた式が間違っていると確信しています. 別のアルゴリズムを提供させてください。私はそれを 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);
于 2011-09-14T00:30:19.123 に答える
1

ここに示されているアルゴリズムを試してください。凸多角形で機能します。

于 2011-09-14T01:06:23.317 に答える
1

一般的なアプローチは、計算が容易な部分に図形を分割し、それらの質量中心を計算して結合することです: C=sum(C[i]*mass[i])/sum(mass[i])

まず、ポリゴン内での質量の分布方法を定義する必要があります。可能な (単純な) 分布:

  1. 頂点に(均一に)集中 - 質問の式はこの場合のものです
  2. ポリゴンの境界に均一に分布 - この場合、各ラインの質量中心 (ラインのちょうど真ん中) を計算し、それをラインの長さで乗算し、それらをすべて加算して、境界線全体の長さで割る必要があります。
  3. ポリゴンの領域に均一に分布 - 理解する最も簡単な方法は、それを三角形に分割し、それぞれの重心を計算し、その面積を掛けて、それらをすべて加算し、ポリゴンの全領域で割ることです。
于 2011-09-14T05:56:05.407 に答える
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++ を介して実行しないと、どのテンプレート パラメーターが自動的に推論されるかわかりません。

于 2011-09-14T00:40:43.757 に答える