v
頂点( )とサーフェス( )のリストを持つ多面体がありs
ます。この多面体を一連の四面体に分割するにはどうすればよいですか?
このための組み込みのMATLABコマンドがあるかどうかを特に知りたいです。
OPが「メッシュ」(Steinerポイントを追加)または四面体化(四面体への分割、Steinerポイントを追加なし)を望んでいたかどうかはわかりません。凸多面体の場合、シュタイナー点(「中心」点など)を追加する必要はありません。
スタックオーバーフローでは、gnoviceの投稿(WTF、SO?)にコメントすることはできませんが、「凸多面体の表面はドロネーテッセレーションの制約です」というステートメントの証明はかなり単純です。定義上、シンプレックスまたはサブシンプレックスはポイントセットにポイントが厳密に含まれていないシンプレックスに外接するn球がある場合に限り、DelaunayTesselationのメンバー。表面の三角形の場合、最小の外接球を作成し、それを多面体から離れて「無限大」に向かって外側に「パフ」します。最終的には他のポイントは含まれなくなります。(実際、外接球の限界は半空間です。したがって、凸包は常にドローネテッセレーションのサブセットです。)
DTの詳細については、岡部らを参照してください。al、「Spatial Tesselations」、またはShewchukによる論文のいずれか
(私の論文はこのようなものでしたが、私はそれを私がすべきよりも覚えていません...)
凸型の場合(サーフェスが互いに覆われる原因となる凹みがない)と三角形メッシュの場合、簡単な解決策は、多面体の中心を計算してから、すべての面の3つのコーナーを新しい中心に接続することです。
三角形メッシュがない場合は、最初に三角形分割する必要があります。Delaunay三角形分割が役立つ場合があります。
穴や洞窟がある場合、これは任意に複雑になる可能性があります。
組み込み関数DELAUNAY3を試してみることをお勧めします。ドキュメントリンクに示されている例は、頂点と多面体の中心点を使用して3Dドロネーテッセレーションを作成するという点でアーロンの回答に似ていますが、 shabbychefは、余分なポイントを含めなくてもテッセレーションを作成できると指摘しています。次に、 TETRAMESHを使用して、結果の四面体要素を視覚化できます。
コードは次のようになります(頂点座標値のN行3v
列の行列であると想定)。
v = [v; mean(v)]; %# Add an additional center point, if desired (this code
%# adds the mean of the vertices)
Tes = delaunay3(v(:,1),v(:,2),v(:,3)); %# Create the triangulation
tetramesh(Tes,v); %# Plot the tetrahedrons
コメントで多面体が凸であると言ったので、三角測量を行うためにサーフェスを制約として指定することを心配する必要はありません(shabbychefは、以下の私のコメントよりも厳密で簡潔な証拠を提供するようです) 。
注:ドキュメントによると、DELAUNAY3は将来のリリースで削除され、DelaunayTriが効果的に使用されます(ただし、現在、拘束されたエッジの定義は2D三角形分割のみに制限されているようです)。完全を期すために、DelaunayTriを使用して、凸包(つまり多面体表面)も視覚化する方法を次に示します。
DT = DelaunayTri(v); %# Using the same variable v as above
tetramesh(DT); %# Plot the tetrahedrons
figure; %# Make new figure window
ch = convexHull(DT); %# Get the convex hull
trisurf(ch,v(:,1),v(:,2),v(:,3),'FaceColor','cyan'); %# Plot the convex hull