3Dを除いて前にこれと似た質問があります。船体の実際の形状ではなく、ボリュームだけが必要です。
より正確には、3Dで小さなポイントセット(たとえば、10〜15)が与えられます。これらはすべて、ポイントセットの凸包上にあることがわかっています(したがって、それらはすべて「重要」であり、ハルを定義します)。船体の体積だけを計算したいのですが、実際の多面体を計算する必要はありません。これを行うための効率的なアルゴリズムはありますか?
3Dを除いて前にこれと似た質問があります。船体の実際の形状ではなく、ボリュームだけが必要です。
より正確には、3Dで小さなポイントセット(たとえば、10〜15)が与えられます。これらはすべて、ポイントセットの凸包上にあることがわかっています(したがって、それらはすべて「重要」であり、ハルを定義します)。船体の体積だけを計算したいのですが、実際の多面体を計算する必要はありません。これを行うための効率的なアルゴリズムはありますか?
回答:
Shuhao Caoの提案に打ち勝つことができるとしたら、私は驚きます。船体の三角形分割ができたら、船体を計算してから、ボリュームを計算します。インクリメンタルアルゴリズムまたはギフトラッピングアルゴリズムを使用してハルを計算できます。本当に簡単なコードが必要な場合は、考えられるすべての三角形に対してn 4ループを作成して、それらが船体にあるかどうかを確認できます。以下のためのn = 15、これはかなり速いまだ、あなたは簡単にショートカットを実装することができます。すべての三角形の面ができたら、頂点vを1つ選び、各三角形Tとvで四面体を作成します。そのボリュームは4 ×頂点座標の 4行列式。
MATLABにおける小テストは、頂点の数を、各コンポーネントは、中に一様乱数である[ 0 、1 ]:
N = 100;
p=rand(N,3);
tic;
T = delaunayTri(p(:,1),p(:,2),p(:,3));
t = T.Triangulation;
e1 = p(t(:,2),:)-p(t(:,1),:);
e2 = p(t(:,3),:)-p(t(:,1),:);
e3 = p(t(:,4),:)-p(t(:,1),:);
V = abs(dot(cross(e1,e2,2),e3,2))/6;
Vol = sum(V);
time_elapse = toc;
結果:
time_elapse =
0.014807
Vol =
0.67880219135839
私はそれはあなたがそれを実行したい場合には、適度に高速であると言うだろう回、それだけで3時間未満かかります。これは次のようなものです。
time_elapse =
3.244278
Vol =
0.998068316875714
福田公明の多面体計算FAQから:
Vポリトープ(またはHポリトープ)の体積の計算は#Pハードであることがわかっています。[DF88]および[Kha93]を参照してください。凸状体の体積を近似する理論的に効率的なランダム化アルゴリズムがあります[LS93]が、実装は利用できないようです。凸状ポリトープのさまざまな体積計算アルゴリズムの比較研究[BEF00]があります。それは、多くの異なるタイプのポリトープに対してうまく機能する単一のアルゴリズムがないことを示しています。
[DF88] MEダイアーとAMフリーズ。多面体のボリュームを計算する複雑さ。SIAM J. Comput。、17:967-974、1988。
[Kha93] LG Khachiyan。ポリトープ体積計算の複雑さ。J. Pachの編集者、「離散および計算幾何学の新しいトレンド」、91〜101 ページ。Springer Verlag、ベルリン、1993年。
[LS93] L. LovaszとM. Simonovits。凸状のボディをランダムに歩き、ボリュームアルゴリズムを改善しました。 ランダム構造とアルゴリズム、4:359-412、1993。
[BEF00] B. Bueler、A。Enge、およびK. Fukuda。凸状ポリトープの正確な体積計算:実用的な研究。G. KalaiおよびGM Zieglerの編集者、Polytopes-Combinatorics and Computation、DMV-Seminar 29、131-154ページ。Birkhauser、2000年。
これは、ダイアーとフリーズの論文のタイトルにもかかわらず、より高い次元の困難の中で3D問題の詳細を埋めているように見えるかもしれません。アブストラクトから:「ファセットのリストまたは頂点のリストとして指定された多面体の体積を計算することは、行列のパーマネントを計算するのと同じくらい難しいことを示しています。」