ポリゴンを三角形に分解するためのアルゴリズムまたはライブラリ(より良い)を探しています。これらの三角形をDirect3Dアプリケーションで使用します。利用可能な最良のオプションは何ですか?
これが私がこれまでに見つけたものです:
この分野での経験のある方のご意見をお待ちしています。
編集:これは2Dポリゴンです。
Jonathan Shewchukの 三角形ライブラリ は驚異的です。過去に三角測量の自動化に使用しました。小さな三角形や狭い三角形などを回避するように依頼することができるので、三角形分割だけでなく、「良い」三角形分割を考え出すことができます。
そこにいくつかのライブラリの選択肢を与えるには:
ポリブール。私はこれを試したことはありませんが、有望に見えます: http://www.complex-a5.ru/polyboolean/index.html
一般的なポリゴンクリッパー。これは実際には非常にうまく機能し、三角測量やクリッピングやホールホールを実行します。 http://www.cs.man.ac.uk/~toby/alan/software/
私の個人的な推奨事項:GLU(OpenGLユーティリティライブラリ)のテッセレーションを使用します。コードは堅実で、GPCよりも高速で、生成される三角形が少なくなります。 libを使用するために、初期化されたOpenGL-Handleまたはこのようなものは必要ありません。
OpenGLシステムライブラリをDirectXアプリケーションに含めたくない場合は、解決策もあります。SGIOpenGLリファレンス実装コードをダウンロードして、そこから三角測量器を取り出します。 OpenGL-Typedef名と列挙型の完全な手を使用しています。それでおしまい。コードを抽出して、1時間か2時間でスタンドアロンのlibを作成できます。
一般に、私のアドバイスは、すでに機能するものを使用し、独自の三角測量を書き始めないことです。
耳クリッピングまたはスイープラインアルゴリズムについて読んだ方は、自分でロールするのは魅力的ですが、計算ジオメトリアルゴリズムは、安定して動作し、クラッシュせず、常に意味のある結果を返すような方法で書くのは非常に困難です。 。数値の丸め誤差は累積し、最終的にはあなたを殺します。
私は協力している会社のために三角測量アルゴリズムをCで書きました。コアアルゴリズムを機能させるには2日かかりました。あらゆる種類の縮退入力で動作させるには、さらに2年かかりました(フルタイムで作業していませんでしたが、信頼してください-必要以上の時間を費やしました)。
CGALには必要なツールがあります: 制約付き三角形分割
ポリゴンの境界線(穴の境界線を含む)を制約として指定するだけです(すべての頂点を挿入してから、制約をVertex_handlesのペアとして指定することをお勧めします)。
次に、任意のトラバーサルアルゴリズムによって三角形分割の三角形にタグを付けることができます。無限の頂点に入射する三角形から始めて、それを外側にタグ付けし、制約を越えるたびに反対のタグに切り替えます(以前にタグを付けていた場合は内側)三角形を外部として、以前に三角形を内部としてタグ付けしていた場合は外部)。
Poly2triライブラリは、三角測量に必要なものであることがわかりました。私が試した他のライブラリ(libtessを含む)よりもはるかにクリーンなメッシュを生成し、穴もサポートします。たくさんの言語に変換されました。ライセンスは New BSD なので、どのプロジェクトでも使用できます。
穴は自分で比較的簡単に追加できます。基本的に、CGALに従って、入力ポイントの凸包に三角形分割し、中心が任意の穴ポリゴンの内側(または任意の外部境界の外側)にある三角形を削除します。大規模なデータセットの多数の穴を処理する場合、マスキング手法を使用して、このプロセスを大幅に高速化できます。
編集:この手法の一般的な拡張は、最長のエッジまたは最小の内角が指定された値を超えるハルの弱い三角形を間引くことです。これにより、より良い凹型の船体が形成されます。
libtess2を試す
https://code.google.com/p/libtess2/downloads/list
元のSGI GLUテッセレーター(リベラルライセンス)に基づいています。多くの小さなmallocに関するいくつかのメモリ管理の問題を解決します。
これは、有限要素解析における一般的な問題です。 「自動メッシュ生成」と呼ばれています。 Googleが発見した このサイト には、商用およびオープンソースソフトウェアへのリンクがあります。彼らは通常、ある種のCAD開始するジオメトリの表現を想定しています。
耳のクリッピング方法を使用して、C#で3Dポリゴン triangulator を実装しました。使いやすく、穴をサポートし、数値的に堅牢で、(自己交差していない)凸型/非凸型のポリゴンをサポートしています。
別のオプション(非常に柔軟なライセンス)は、アルゴリズムをVTKから移植することです。
このアルゴリズムはかなりうまくいきます。直接使用することも可能ですが、VTKへのリンクが必要になるため、必要以上のオーバーヘッドが発生する可能性があります(他にも多くのNice機能があります)。
制約(穴/境界など)をサポートし、必ずしもXY平面にあるとは限らないサーフェスを三角形分割します。また、他では見られなかったいくつかの機能もサポートしています(アルファ値に関する注意を参照)。