web-dev-qa-db-ja.com

3D(またはn-D)重心を計算するための最良の方法は何ですか?

作業中のプロジェクトの一環として、3D空間内の一連の点の重心を計算する必要があります。今、私はそれを単純に見えるが素朴な方法でやっています-次のように、ポイントの各セットの平均を取ることによって。

centroid = average(x), average(y), average(z)

ここで、xy、およびzは、浮動小数点数の配列です。より正確な重心を取得する方法があることを思い出しているようですが、そうするための簡単なアルゴリズムは見つかりませんでした。誰かアイデアや提案がありますか?私はこれにPythonを使用していますが、他の言語の例を適応させることができます。

22
Marcel Levy

ここでの一般的なリフレインとは異なり、点群の中心を定義(および計算)する方法はいくつかあります。最初の最も一般的な解決策はすでにあなたによって提案されており、私はnotこれに何か問題があると主張します:

centroid = average(x), average(y), average(z)

ここでの「問題」は、ポイントの分布に応じて中心点が「歪む」ことです。たとえば、すべてのポイントが立方体のボックスまたはその他の幾何学的形状内にあると仮定しても、それらのほとんどがたまたま上半分に配置されている場合、中心点もその方向にシフトします。

別の方法として、これを回避するために、各次元で数学的中間(極値の平均)を使用できます。

middle = middle(x), middle(y), middle(z)

これは、ポイントの数をあまり気にしない場合に使用できますが、グローバルバウンディングボックスについてはこれだけです。ポイントの周りのバウンディングボックスの中心です。

最後に、各次元でmedian(中央の要素)を使用することもできます。

median = median(x), median(y), median(z)

これで、middleとは逆のことが行われ、実際に点群の外れ値を無視して中心点を見つけるのに役立ちますに基づく点の分布。

「適切な」中心点を見つけるためのより堅牢な方法は、各ディメンションの上位10%と下位10%を無視してから、averageまたはmedianを計算することです。ご覧のとおり、さまざまな方法で中心点を定義できます。以下に、これらの提案を念頭に置いた2つの2D点群の例を示します。

濃い青色の点は平均(平均)重心です。中央値は緑色で表示されます。そして真ん中は赤で表示されます。 2番目の画像では、私が以前に話していたことを正確に確認できます。緑の点は点群の最も密度の高い部分に「近く」、赤の点は点群の最も極端な境界を考慮して、点群から遠く離れています。点群。

enter image description hereenter image description here

12
Chris

あなたは漠然と「より正確な重心を取得する方法」について言及しています。外れ値の影響を受けない重心について話しているのかもしれません。たとえば、 平均 米国の世帯収入はおそらく非常に高いです。 非常に 金持ちは平均を歪めます。それらは「外れ値」です。そのため、統計学者は 中央値 代わりに。中央値を取得する1つの方法は、値を並べ替えてから、リストの途中で値を選択することです。

たぶんあなたはこのようなものを探していますが、2Dまたは3Dポイントを探しています。問題は、2D以降では並べ替えができないことです。自然な秩序はありません。それにもかかわらず、外れ値を取り除く方法があります。

1つの方法は、ポイントの 凸包 を見つけることです。凸包には、点のセットの「外側」にすべての点があります。これを行い、船体にあるポイントを捨てると、外れ値が捨てられ、残っているポイントはより「代表的な」重心を与えます。このプロセスを数回繰り返すこともでき、その結果はタマネギの皮をむくようなものです。実際、それは「凸包剥離」と呼ばれています。

12
AlejoHausner

いいえ、それはポイントのコレクションの重心の唯一の式です。ウィキペディアを参照してください: http://en.wikipedia.org/wiki/Centroid

12
deemer

精度を上げる合計(カハンの合計)を使用できます。それはあなたが考えていたものでしたか?

3
petr kodl

潜在的により効率的:これを複数回計算している場合は、2つの永続変数を保持することで、これをかなり高速化できます。

N  # number of points
sums = dict(x=0,y=0,z=0)  # sums of the locations for each point

次に、ポイントが作成または破棄されるたびにNと合計を変更します。これにより、ポイントが作成、移動、または破棄されるたびに、より多くの作業が必要になる計算のために、O(N)からO(1)に変更されます。

2
Gregg Lind

「より正確な重心」重心は計算方法で定義されているため、「より正確な重心」はあり得ないと思います。

0
Sarien

はい、それは正しい式です。

多数の点がある場合は、問題の対称性を利用できます(円筒形、球形、鏡面)。それ以外の場合は、統計から借用してランダムな数のポイントを平均し、わずかなエラーが発生する可能性があります。

0
Jamie-Ryan