TetGenLink を使う

このセクションでは,いくつかの TetGenLink の用途を示す.

凸包

TetGenLink を使うには,まずロードしなければならない.

ランダムな点を生成して表示する.

これで3Dの点の凸包を計算することができるようになる.TetGenConvexHullは点および表面三角形のリストを返す.

各表面三角形は3つの整数のリストである.この3つの整数は座標を指す.GraphicsComplexを使ってプロットすることができる.

表面メッシュをワイヤーフレームとして可視化するためには,Polygonの代りにLineを使うとよい.

ドロネー(Delaunay)の三角形分割

TetGenLink を使うには,まずロードしなければならない.

3Dデータを生成する.

TetGenDelaunayを使うとデータのドロネー三角形分割が計算できる.

結果は,点および四面体のリストである.四面体のリストは座標の位置を指す4つの整数のリストである.四面体をワイヤーフレームとして可視化するために,サポート関数を使う.

点データの表面三角形分割を生成するためには,まずTetGenインスタンスを作成しなければならない.

TetGenインスタンスに点を設定するためにはTetGenSetPointsを使う.

四面体分割はTetGenTetrahedralizeで行う.

表面座標と表面三角形を抽出するためには,それぞれTetGenGetPointsTetGenGetFacesを使う.

以下で表面メッシュを可視化することができる.

ボックスのメッシュ(基本)

ボックスから四面体メッシュを生成するためには,まずボックスの角の点を設定する.

角の点がどのように連結しているかを指定するためには,ファセットを指定する.

TetGenLink を使うためには,まずロードする.

メッシュを作成するために,TetGenのインスタンスが生成される.この入力インスタンスに四面体分割されるオブジェクト表面を記述する点とファセットが含まれる.

TetGenインスタンスに角の点とファセットを設定するためには,それぞれTetGenSetPointsTetGenSetFacetsを使う.

点とファセットを設定する操作が成功したら,完了時に0が返される.

四面体分割はTetGenTetrahedralizeコマンドで実行される.四面体分割はTetGenの入力インスタンスに対して有効である.結果のメッシュに対する必要事項を指定するために,パラメータの列(TetGen文字列コード)を与えることができる."p"文字列は区分的な線形複合体を四面体分割し,"q"スイッチは高質メッシュ生成を要求する.半径の直径に対する比の最小値を指定することもできる.デフォルトは2.0である."a"スイッチに数値が続く場合,最大の四面体体積の制約条件が適用される.TetGenが一旦メッシュ生成過程を終了すると,新しいTetGenインスタンスが返される.出力インスタンスにはメッシュの全情報が含まれる.

出力インスタンスから座標と表面三角形を抽出するためには,TetGenGetPointsTetGenGetFacesを使う.

三角形分割された表面の可視化はGraphicsComplexで実行することができる.

四面体を抽出するためにはTetGenGetElementsを使う.

簡単なサポート関数により,ワイヤーフレームメッシュを可視化することができる.

すべてのTetGenインスタンスのリストはTetGenExpressionsでアクセスできる.

TetGenDeleteコマンドでTetGenの入力インスタンスと出力インスタンスを削除してクリーンアップする.

ボックスのメッシュ(発展)

TetGenLink を使うためには,まずロードしなければならない.

次はボックスをメッシュ化するより細かい例である.ここではボックスの中の穴,空洞のある表面の隙間,異なる領域や座標の属性マーカー,面や要素を作成するためのTetGenへの入力の指定方法を説明する.また,メッシュの調整も例示する.

座標を指定し,それを表示することから始める.

次に入力インスタンスを作成し,点を設定する.

次にファセットのリストを作成する.この例題の第3のファセットのように,ファセットのリストに2つ以上の項目が含まれている場合,第1のファセットは境界のファセットを表し後続のファセットは境界のファセットの開口部を示す.

ここではファセットの開口部のアウトラインが描かれた1つのファセットが表示される.

TetGenの入力インスタンスでファセットを設定することができる.

TetGenがファセットを開くためには,ファセットの穴を設定する.

次にTetGenSetFacetHolesコマンドでTetGenの入力インスタンスにファセットの穴を設定する.

次は境界となるファセットとファセットの穴の位置を描いたものである.

次のステップではマーカーを指定することができる.TetGenはマーカーと呼ばれる伝播機能を提供する.マーカーはメッシュオブジェクトのグループ化された部分にアクセスするのに便利である.このグループ化は境界条件およびメッシュの領域を指定するのに使うことができる.TetGenでは点,面,要素のマーカーを指定することができる.

まず,それぞれの座標点にマーカーと呼ばれる整数を割り当てる.一旦メッシュが作成されると,TetGenはTetGenの入力インスタンスで指定されたマーカーに従って,新規作成された座標点のそれぞれをマークする.ファセットおよび領域もこれと同様にマークされる.

次の表に従って,それぞれのノードとファセットに整数を割り当てる.これは表面の異なる部分を一緒にグループ化する.
1 下部
2 上部
3
4 空洞/穴
9 中央部

点のマーカーは次のように設定され可視化される.

それぞれのファセットに整数のマーカーを与えることができる.

点のマーカーとファセットのマーカーの両方がTetGenの入力インスタンスで設定される.

ファセットとそれに帰属したマーカーを視覚的に探求するために,Manipulateを使うことができる.選択したり選択を外したりすることで,割り当てられたマーカーに従ってファセットを可視化することができる.

TetGenはまずオブジェクト全体をメッシュにすることで動作し,第2のステップで穴や空洞からメッシュを削除する.空洞もまた,その場所を指定するための点が必要である.開口部を指定する点は不十分である.TetGenでどこに穴を置くかを指定するためにはTetGenSetHolesを使う.

2つの異なる材料領域は,それぞれに点を置きそれらに領域番号を割り当てることにより指定することができる.点のマーカーおよびファセットのマーカーとは異なり,領域属性は実数である.領域の制約条件を使うと,異なる領域におけるメッシュの粗さを指定することができる.

指定された異なる点すべての位置である.

ファセットからメッシュを生成するめには,上のようにオプション"p"と"q"を与える.オプション"a"と"A"は,領域属性で指定した最大の要素サイズに必要とされる.スイッチ"n"はTetGenに近傍を計算させ,スイッチ"e"は辺を計算させる.スイッチすべてのリストはhttp://tetgen.orgを参照のこと.

座標と座標マーカーはTetGenGetPointsおよびTetGenGetPointMarkersを使って抽出することができる.

マーカー0が存在することに注意する.マーカー0の属性を持つ座標は内部座標である.

面を抽出しそれを可視化するためにはTetGenGetFacesを使う.

面のマーカーを抽出するためにはTetGenGetFaceMarkersを使う.

Manipulateを使ってファセットとそのマーカーを調べることができる.

TetGenGetElementsは出力インスタンスから四面体を得る.

効率よく四面体を可視化するためには,次のサポート関数を使う.これはすべての四面体の面を分類する.分類されたすべての面の和集合を見付けることで,重複する内部の面を削除する.非常に大きいメッシュの場合,この方法を使うことでグラフィックスの描画時間が短くなる.

下部のメッシュの方が上部よりも細かいことに注目いただきたい.これは異なる領域制約条件を指定したために起ったものである.

要素の属性を抽出するためにはTetGenGetElementAttributesを使う.

属性10の領域に属する要素を選ぶことができる.その要素はボックスの下部にあるものである.

TetGenはオブジェクトの辺を提供することもできる.TetGenに辺を計算させるためには,上の四面体分割の段階でオプション「e」を指定する必要がある.

また,近隣要素のリストも得ることができる.近傍リストの各項目は4つの近隣四面体のリストである.ある四面体が境界にある場合は,その項目はに設定される.

境界の四面体の位置は以下のようになる.

既存のメッシュを調整するためには,TetGenインスタンスに対して再びTetGenTetrahedralizeが呼ばれる.しかし,今度は「r」スイッチで調整を要求し,「a」スイッチで四面体の新しい最大体積を指定する.ここで「a」スイッチは領域の制約条件をオーバーライドする.

生成されたTetGenインスタンスをクリーンアップする.

工学例題

TetGenLink を使うためには,まずロードしなければならない.

機械部品の工学表面メッシュをダウンロードする.これでWebからデータを取得することができ,その後のインターネットアクセスがなくてもデータが使用できる.

四面体分割をするためにはTetGenのインスタンスを生成する.

表面メッシュのデータがTetGenインスタンスにインポートされる.

TetGenインスタンスの点とファセットにアクセスできる.

四面体分割のステップは次のように与えられる.

出力インスタンスから座標を抽出するためには,TetGenGetPointsTetGenGetFacesを使う.

メッシュオブジェクトの表面はGraphicsComplexで表示することができる.

四面体要素はTetGenGetElementsコマンドで抽出することができる.

オブジェクトの四面体それぞれの体積を計算するためには,まずサポート関数を書く.

合計の体積は次のように計算することができる.

塊の中心は,コンパイルされた関数を使って計算することができる.

塊の中心は,オブジェクト内の赤い点として可視化することができる.

塊の中心までの距離に従ってオブジェクトの表面を色付けするためには,それぞれの座標から塊の中心間での距離を計算するサポート関数を書く.

その後,距離のリストが再スケールされる.

表面はVertexColorsを指定し,ColorDataを利用することにより彩色される.

表面を計算するためには,コンパイルされた関数を書く.

オブジェクトの全表面は,次のように計算できる.

Cコンパイラがある場合は,更なるスピードアップのために,オプションCompilationTarget->"C"を使うとよい.

考えられる問題

TetGenLink を使うためには,まずロードしなければならない.

結果的に四面体分割が失敗する場合に考えられる問題は,交差するファセットにより引き起こされることがある.表面メッシュに交差する面があるかどうかを検出するためには,TetGenDetectIntersectingFacetsを使うことができる.交差するファセットがある場合,TetGenDetectIntersectingFacetsは点および交差するファセットのリストを返す.

その後,交差するファセットを表示することができる.