メッシュ表現の場合、Winged Edgeデータ構造よりもHalf Edgeを使用する利点は何ですか?
両方のメッシュ表現を理解していますが、唯一の違いは、ハーフエッジが方向性エッジを使用し、翼状エッジが無方向性エッジを使用することです。これまでのところ、指向性エッジを使用することの有用性を考えることはできませんが、メモリ使用量が増えるだけです。
メッシュ表現の場合、Winged Edgeデータ構造よりもHalf Edgeを使用する利点は何ですか?
両方のメッシュ表現を理解していますが、唯一の違いは、ハーフエッジが方向性エッジを使用し、翼状エッジが無方向性エッジを使用することです。これまでのところ、指向性エッジを使用することの有用性を考えることはできませんが、メモリ使用量が増えるだけです。
回答:
私が知る限り、ハーフエッジの主な利点は、エッジが各面内で一貫した方向を持つことが保証されるため、トラバーサルが少し単純になることです。
特定の面のすべての頂点またはエッジを反時計回りに繰り返し処理する問題を考えます。ハーフエッジ構造では、これはその面の任意のハーフエッジから開始し、開始したところに戻るまで「次の」ポインタを単にたどることによって実行できます。
対照的に、これを翼のあるエッジ構造で行うと、エッジが任意に方向付けられるため、少し面倒です。遭遇する特定のエッジは、反復しようとしている面に対して時計回りまたは反時計回りのいずれかを指す可能性があるため、各ステップで追加の条件チェックを実行して、現在のエッジを前方または後方にトラバースする必要があるかどうかを確認する必要があります。
他の種類の接続クエリは同様に動作します。ハーフエッジバージョンでは一貫したシーケンスでリンクをたどることができますが、ウィングエッジバージョンでは各ステップで方向チェックが必要です。
条件文が実際に翼端のパフォーマンス問題であるかどうかは、おそらく他の要因に依存します。ポインタがすべての方向にあり、データがメモリ全体に分散している「素朴な」実装の場合、キャッシュミスのオーバーヘッドにより、条件の影響が大きくなることが予想されます。一方、すべてがキャッシュ内にある密にパックされたデータ構造を使用している場合、不適切な分岐予測などが原因で条件文の影響が見られる場合があります。言うのは難しいです。
わずかなメモリオーバーヘッドが発生する場合でも、パフォーマンスをそのままにして、推論して正しいコードを書くのが簡単に思えるという理由だけで、ハーフエッジを使用します。
ちなみに、メッシュデータ構造には他にもいくつかの選択肢があり、メッシュ構造と混同されがちです。コメンターはシングルリンクとダブルリンクのどちらかについて述べましたが、当然、ハーフエッジまたはウィングドエッジのいずれかでシングルリンクまたはダブルリンクを行うことができます。(上で述べたように、クエリの過程でエッジを後方または前方にトラバースする必要がある場合があるため、winged-edgeを使用した単一のリンクがどのように機能するかはわかりませんが。)
また、頂点と面の構造がすべてのエッジのリストを格納するのか、それとも1つだけのリストを格納するのか(そして、残りを見つけるためにエッジをトラバースする必要がある)の問題もあります。頂点/面ごとのエッジの可変長リストがあると、効率的に実行したい場合(つまり、頂点/面ごとに個別のヒープ割り当てがない場合)はロジックがかなり複雑になりますが、これも、エッジがハーフエッジかどうかに依存しません。または翼端。