0

三角形モデル/メッシュのエッジを蓄積したい。たとえば、三角形の立方体には18個のエッジがあります。

見た目はとてもシンプルで簡単ですが、文字通り複雑すぎます。私は三角形のすべての隣接する情報を持っています。たとえば、隣接する頂点と三角形があり、どの三角形に共通のエッジがあるかはわかっていますが、問題は2つの三角形の間の共通のエッジをどのように抽出するかです。

考慮する必要があることの1つは、エッジのポイント/頂点の重複するインデックスがあってはならないということです。

まず、エッジの総数を数える方法です。立方体には18個のエッジがあることを忘れないでください。

たくさん試しましたが、今は諦めました。:) 何か案が?。

アップデート1:

わかりました。三角形T[i](インデックスv1、インデックスv2、インデックスv3)があり、3つのエッジv1v2、v2v3、v3v1があります。

そして、私はすべてのエッジの隣接する三角形を持っています。

T[i].index_of_sharedTri1_with_edge_v1v2, 
T[i].index_of_sharedTri2_with_edge_v2v3, 
T[i].index_of_sharedTri3_with_edge_v3v1; 

ユニークなエッジを抽出できるループを作成する必要がありますか?比較する必要のある情報は何ですか?エッジの頂点、共有トライインデックス、または何を比較する必要がありますか?私は多くの方法で試しましたが、それはとても複雑でした。

アップデート2:

GLTris *e = new GLTris[nb_Tris*3];
int n = getTotalEdges_Sorted(indices, nb_Tris, e);
cout<<n<<endl;
int ne = RemoveDublicatesFromAnSortedEdgeArray(e, n);
for(int i=0; i<ne; i++)
   e[i].Cout();

私はこれを試しましたが、完璧に機能しますが、すべてのタイプのメッシュで機能するかどうかを判断する必要があり、効率的な方法ですか?

4

3 に答える 3

2

三角形の数とそれぞれの隣接情報がある場合、エッジの数は単純に次のようになります。

3 *num_triangles-num_shared_edges

ここで、num_shared_edgesは、各三角形を反復処理し、隣接する三角形の数を合計することで累積できます。次に、それらをすべて2回カウントするので、2で割ります(これは明らかに、エッジごとに2つ以下の三角形があることを前提としています)。

一意のエッジのリストを作成する場合は、できればマップのような簡単にインデックス付けできる構造で、それらを追跡する必要があります。

手順はおおまかに次のとおりです。

  1. エッジを2つのインデックス(i1、i2)として定義します。i1<i2となるようにこれらのインデックスを並べ替えます。これで、共有エッジが一致することが保証されます。
  2. これらのエッジを保持できるある種のリスト構造を作成します。インデックスによって既存のエッジをすばやく見つけることができる必要があるため、ある種のツリーなど、検索可能な構造が必要です。c ++を使用している場合は、i1、i2ペアをキーとしてマップを使用することをお勧めします。
  3. すべての三角形を反復処理し、それぞれに3つのエッジを追加します。エッジがすでに存在する場合は追加しないでください。

これですべてです。

于 2012-12-11T17:53:18.653 に答える
1

表面が単純でオイラー標数よりも閉じている場合、エッジの数はですE = F + V - 2。あなたの例のキューブには、がV=8ありますF=12

于 2012-12-11T23:56:25.023 に答える
1

私は簡単なトリックを学びました。
最初に、頂点インデックスの順序付けられていないペアである構造を定義します(たとえば、struct{int i,j}それを保証するi<j)。次に、を作成しstd::set<UnorderedPair>ます。最後に、エッジに遭遇するたびに、それをこのセットに挿入するだけです。最後に、このセットの要素の数によって、一意のエッジの数がわかります。

于 2012-12-12T01:34:47.530 に答える