三角測量(転載)

転送:https://blog.csdn.net/cloudqiu/article/details/78877311

三角形の要約を書く、実際には3年間の上にドラッグ。これは私がまとめた記事をドラッグ最長です。多分、将来のこの態様は、チャンスがないではない、書いてはいけません。プロジェクトチームへの初めに、プロジェクトは単に初期の段階に入った私は、グリッド関連の資料を読むためにいくつかの時間を持つことができたので、我々は、十分な緊急性はそれほど高くない持っていない、70の論文、冊子ポリゴンメッシュ加工。まだ非常に苦痛当時、このエリアには経験がありません。

CADプログラムは、非常に基本的な、重要な機能は、平面グラフィックグリッドを行うことです。そして、様々なメッシュの中で、三角形メッシュが特に重要です。だから、それは、三角測量アルゴリズムを習得する必要があります。ゲーム、シーンに導入芸術(実質的に三角形メッシュ)を作るだけで、一般的な3Dモデルプログラマの必要性では、いくつかのケースがあるゲームグリッド・エンジンに再処理する必要があります。だから、それはいくつかの三角測量のプロセスに精通していることが最善です。非常に多く、複数の三角形に分割された方法を平面図形分割を載せていきたいと思います。新しい固定小数点または他のパラメータの場合はもちろんのこと、そしてさらに多くの方法を分割します。私たちの最も一般的に使用されるドロネー三角形分割アルゴリズム。アルゴリズムlibにC / C ++は多いです。あなたは、Pythonを使用している場合は、scipyのダウンロードパッケージには、これだけはこの1つを提供scipyのダウンロード、最も広く使用されている三角測量アルゴリズムの一つであるドロネー三角形分割アルゴリズムを提供します。これは、使用するのは簡単ですが、あなたはこれを達成するための最初の時間アルゴリズムのために所有したい場合は、何の推定値は1週間に完了することはできないがあります。

アルゴリズムのライブラリを使用して、我々はすぐに機能のタッチを実現することができますが、データ構造のためのビジネス層は間違いなく独自の要件です。我々はプロジェクトを推定時間のほとんどは、ビジネス・プロセスの一部と関連しています。アルゴリズムに関しては、私が実現する時間がありません。唯一のアイデアを得ることができ、あなたが使用することを学びます。scipy.spatial.Delaunayのみ最も簡単な関数は、例えばCGAL、などの制御のような機能の点が、C / C ++ LIB、かどうかを制御線カム角、辺の長さ、全体的な均一性を、見ていない三角形などが持っています達成。三角形はもちろん、Pythonのラッパーは、こちらからダウンロードすることができますがあります。次のプログラムは、このLIBを使用しています。参考chapt3 / triangulation.pyプログラムは、我々はすぐに三角測量のプログラムを実現することができます。

01


三角測量のプロセスは、我々は一般的にいくつかの一般的なニーズを持っています:

穴の中のグラフィックス

三角形の頂点線や曲線を描画すると、この行の秋を生成する必要があります。

いくつかの三角形の高いパターン密度を必要とするいくつかの領域は、いくつかの領域は、密度の低い値を必要とします。

生成された角度三角形、辺の長さ、均一性、新たな制御点で必要とされる場合。

もちろん、実際の需要はこれ以上複雑にすることができます。こうした窓、ドアと壁のように、この需要があまりにも一般的ないくつかの穴を、バックルgrpahic平面の真ん中で、衣服の空洞があります。それは穴ですので、それは確かに三角測量に参加していません。三角測量アルゴリズムは、最も重要なパラメータは、個別の頂点の数で受け付けます。あなたは穴バックルグラフにしたい場合は、この穴は唯一の頂点情報で記述することができます。


02


例えば図、中間中空四角形、及び任意の点の内部を指定する四角形の四辺の使用を必要とし、四辺のための頂点対によって記述することができます。赤十字は、中空部の下の点の一例です。実際には、このプロセスは非常に簡単で、まず、全体のグラフィック三角測量は、その後、中空の部分は、それを食べました。データ構造の三角形のlibのPythonのバージョンは、人々が話して、あまりにも少し説明する文書に入力しました。triangle.get_data(「face.1」)で出力限り、我々は輝く例を行うことができるようになります。制御アルゴリズムは、B = triangle.triangulateとしての機能、に渡さ三角形のlibの列に主に依存している(A「pqa0.015c」)、文字列の各文字の意味は読み取り専用限り、文書を見ることができます、または非常に良い使用。以下に、穿孔グラフィカルな三角測量計算の一例です。chapt3 / complicateTriangulation.pyを参照してください


03


より簡単には、三角形パッチ上の三角形の位置の頂点よりも使いやすいかを決定します。例えば、我々は、直線セグメント列Buniuバックルにファブリックことを期待します。別の例は、直線セグメントとファブリックを縫合のみ線分は、アナログコンパレータを円滑確実にするために、三角形の辺に縫合された物理シミュレーションを、参加するために他のように布です。前記三角形限界の2つだけの頂点によって同様に、線分最大面積と最小急性角、それはまた、三角形の辺の長さを制限することができる場合には、線分がこの制限に応じて分割されます。下記に示すように、


04


レンダリングとシミュレーションのために、私たちは皆、主に計算およびリソース使用量を減らすために、いくつかの場所でいくつかの場所、いくつかのいくつかの疎に密なメッシュをしたいです。適切に処理、振幅減少の1回のまたは2オーダーは難しいことではありません。だから、必要性は明白です。直接第2の方法では、入力された頂点を増加させる方法は、アルゴリズム内に実装、制約領域によって与えられます。もちろん、最初は非常に簡単です。


05


私たちは今、技術の研究開発プログラムは、クロスシミュレーションであるに焦点を当て、実際には、種類クロスシミュレーション、有限要素解析とみなすことができます。私たちは、グリッドのためのいくつかの要件があります(正三角形のような可能な限り)このような小さな急性角が存在しない、均一な大きさに。有限要素解析の他の推定値は、グリッド上のより厳しい制約がある場合があります。または三次元空間、問題はレベルが上昇することを困難をメッシュにする必要があります。一般的な開発作業は、手の届かないところにもあります。

我们的项目一直在使用C语言版本的triangle 这个lib来做三角化。非常小巧,简单,只有一个入口函数,一个函数就可以完成三角化的工作。

void triangulate(char *, struct triangulateio *, struct triangulateio *, struct triangulateio *);

算法本身可能很复杂,但是lib的使用还算比较简单。第一个参数是字符串,控制了“三角形内角大小,边长,均匀程度”等参数,第二个参数是输入,第三个参数是三角化输出,第四个参数是voronoi输出,一般置为NULL即可。这里要提一下,为什么有voronoi这个参数呢?是因为voronoi tessellation和 delaunay triangulation是对偶的,相当于同一个计算结果换了一种描述而已。但是,每一个参数本身是非常复杂的,定义如下:

struct triangulateio {
    REAL *pointlist; /* In / out */
    REAL *pointattributelist; /* In / out */
    int *pointmarkerlist; /* In / out */
    int numberofpoints; /* In / out */
    int numberofpointattributes; /* In / out */
    
    int *trianglelist; /* In / out */
    REAL *triangleattributelist; /* In / out */
    REAL *trianglearealist; /* In only */
    int *neighborlist; /* Out only */
    int numberoftriangles; /* In / out */
    int numberofcorners; /* In / out */
    int numberoftriangleattributes; /* In / out */
    
    int *segmentlist; /* In / out */
    int *segmentmarkerlist; /* In / out */
    int numberofsegments; /* In / out */
    
    REAL *holelist; /* In / pointer to array copied out */
    int numberofholes; /* In / copied out */
    
    REAL *regionlist; /* In / pointer to array copied out */
    int numberofregions; /* In / copied out */
    
    int *edgelist; /* Out only */
    int *edgemarkerlist; /* Not used with Voronoi diagram; out only */
    REAL *normlist; /* Used only with Voronoi diagram; out only */
    int numberofedges; /* Out only */
};

三角頂点(及び数)、頂点属性、三角形(出力)、ライン、孔、地域性は、三角形の側(出力)のみ四、五が有効である:実際には、唯一、総括します。これらのうち、唯一pointlistが必要であり、非常に複雑で心配しないでください。Pythonの引数関数いくつかの上記の例示に対応するコール:A = dictの(頂点=頂点、セグメント=セグメント、正孔= holeMarkerPos)、3つの2次元アレイのみ。

  Youtubeで行うために説明する工程ビデオアニメーションのアルゴリズムは、より直感的に見えます。

http://www.cs.cmu.edu/~quake/triangle.html

http://dzhelil.info/triangle/index.html三角形のPythonラッパー

https://people.eecs.berkeley.edu/~jrs/papers/imrtalk.pdf

https://people.eecs.berkeley.edu/~jrs/papers/triangle.pdf

----------------

おすすめ

転載: www.cnblogs.com/gispathfinder/p/12501214.html