凸多角形を追加および削除するにはどうすればよいですか?


12

2つの2D凸ポリゴンが互いに重なり合っています。それらを減算して追加するアルゴリズムを探しています。結果は、単一の凹多角形、または(さらに良い)凹結果を形成する最大の凸多角形(三角形など)でなければなりません。

ここに画像の説明を入力してください

左:最初に重なり合うポリゴン。中央:追加後の凹型ポリゴン。右:凹型結果を形成する凸型ポリゴンのセット。パフォーマンス上の理由から、三角形よりも大きい凸型ポリゴンを取得することをお勧めします。 2つの重なり合うポリゴンは、左側と同じ画像になりますが、重なり合う領域は結果のポリゴンの一部ではありません。)

これどうやってするの?


ここで2Dについて話していますか?なぜなら、3Dではポリゴンを結合することはあまり意味がないからです。
concept3d 14

はい、申し訳ありませんが、私は2Dについて話しています!2Dよりも3Dの方が理にかなっていない理由はわかりませんが。
セバスチャンバース14年

2
2つのポリゴンを3Dで追加します。フラットの場合、同じ平面上にない限り意味がありません。ボリューム(ソリッド)がある場合は別の話になります。
concept3d

わかった、わかった。私はグラフィックスについてではなく、衝突オブジェクトについて考えていました。説明をありがとう。
セバスチャンバース14年

さらに、交差するすべてのポイントを見つけて、頂点をセットに追加します。このセットは、重複を防ぐために重要です。次に、他の2つの図形の頂点を1つおきにセットに追加します。このセットには、加算シェイプのすべての頂点が含まれます。
ヴォーンヒルツ14年

回答:


9

TL; DR BSPツリーを使用してブール演算を実装する必要があります。

まあ、私たちは話しているようです ここで建設的な立体幾何です。私はCSGを商用レベルで実装しているので、それについて1つか2つ知っています。

CSGに関する古典的な論文は、 BSPツリーの結合と多面体集合操作の生成れます。正直に言うと、ここで説明するのは多すぎますが、簡単に言えば、このアルゴリズムは、各ポリゴンメッシュからのBSPツリー。2番目のステップは、これらのBSPツリーをマージすることです。1つのツリーを取得して、他のツリーに挿入するだけです。次に、アルゴリズムは、ノードを分割および減算するために各リーフノードを処理する方法の説明に進みます。最終形状に不要なノードは削除され、他のノードには適切な親が与えられます。

ちょっと待って!その論文は基本的にポリゴンメッシュと3Dプレーンについて語っています。

アルゴリズムは任意の次元に一般化できるため、2Dの場合、平面の代わりにラインセグメントをバイナリパーティションとして使用するのは簡単です。したがって、2つのポリゴンがマージされるよりも、各ポリゴンがBSPツリーに変換されます。最後に、結果のツリーをトラバースして最終的なポリゴンを生成し、

このアルゴリズムとCSGは一般にレンダリングとメッシュフェースを直接処理せず、実際にはレンダリングの準備が整っていないため、最終的なBSPツリーのフェースを抽出する必要があることに注意してください。また、レイトレーシングはCSGの結果をレンダリングするためのより簡単なアプローチであり、抽出して実際に分割するのではなく、レイがツリーをトラバースするだけでよいことがわかります。、顔するのでは(バイナリパーティションのみを扱うことを思い出してください)。

数値の堅牢性について。幾何学的計算には2つのタイプがあることに注意してください。

  • 構築に基づくものは、前の操作の結果に基づいて形状を構築します。たとえば、新しい操作でy = sqrt(x)使用yします。これは構築と呼ばれます。問題は、数値誤差が急速に蓄積することです。
  • あるいは、代わりに述語を使用する操作があります。基本的に、構造を使用する代わりに、条件がtrue / falseであるかどうかを尋ね、異なる操作で同じ値を使用します。従来のテストには、インサークルとオリエンテーションテストが含まれます。これは、特に単精度または倍精度を使用している場合は数値エラーの疑いもありますが、通常ははるかに良い結果が得られます。速度と精度が異なる他のソリューションが存在します。これは、正確な結果を得るために平面ベースのジオメトリを使用することにより、構築を回避する最近の論文の1つです。論文からも引用します。

ポリゴンメッシュの平面ベースの表現の概念は、最初に杉原と入里によって説明されました[SI89]。この種類の表現は、ブール式の評価のようにメッシュで表されるソリッドのトポロジを変更するタスクに関して、1つの重要な利点を提供します。結果の多面体を取得するために新しいプライマリジオメトリ情報を構築する必要はありません。

ここに画像の説明を入力してください

最後に、BSP CSGの実装を開始したい場合は、BSP Faqsから開始することをお勧めします。


凸面の多角形または多面体のBSPがリストであることを考えると、クールですが、直感に反します。素晴らしい紙。
3Dave 14年

@DavidLivelyはい、ただし、面でないルートプレーンを選択することにより、バランスの取れたツリーにすることができます。実はこれは、彼らがについて話していないという課題の一部である
concept3d

ああ、それは理にかなっています。ハイブリッドBSPの並べ替え。
3Dave 14年

@DavidLivelyまた、BSPのレンダリングは実際には簡単ではありませんが、OPの質問は単純なケースであり、数百万のポリゴンのジオメトリを持つより複雑なケースでは、一度ツリーの構築を完了すると、まだ完了していません。
concept3d 14年

@ concept3dこれは5年前の答えなので、これがあまり面倒ではないことを願っていますが、私が本当に理解していない2つのことがあります:点が平面/線の左にあるか右にあるかを判断しようとすると、プレーン/ラインが自明なプレーン/ラインに対応するように単純に全体を回転させてから、回転したポイントの座標だけを考慮する方が簡単ではないでしょうか?BSPツリーの代わりにSutherland–Hodgmanアルゴリズムを使用してはどうですか?このアプローチに非常によく似ています。
ジョンP

1

あなたの例で行く:

ポリゴンAの開始頂点を選択し、交差するエッジの時計回り(または反時計回り)のチェックを開始します。交差点がない場合は、結果のポリゴンに前の頂点を追加します。交差点がある場合は、交差する点を結果のポリゴンに追加し、同じ巻き順でポリゴンBの繰り返しを開始します。同じことを行い、交差が発生した場合は再びポリゴンAに交換します。

新しいポリゴンのすべての頂点を蓄積したら、三角形分割アルゴリズムを実行します。耳のクリッピング方法は、実装が簡単ですが、そこに速いのオプションがあります。

重要:開始する頂点が他のポリゴンの内側にないことを確認してください(ポリゴンテストのポイントについてはこの記事参照してください)。

交差をチェックするために各エッジを反復処理するのは、O(n ^ 2)アルゴリズムです。これらの頂点にリンクされたエッジは交差するエッジになるため、最初に他のポリゴンの内側にある頂点を見つけることで、速度を上げることができます。


0

凹型ポリゴンが必要な場合は、2つの入力ポリゴンの間の最も近いエッジを選択して、2つの新しいエッジを追加します。

ここに画像の説明を入力してください

は少し複雑になります:

ここに画像の説明を入力してください

1つのアプローチは、2番目のポリゴンから最初のポリゴンに頂点を1つずつ追加し、最初のポリゴンをすべてを包含するコンテナに進化させるという点で反復的です。

基本的に:

  • 2番目のポリゴンの頂点を反復処理します。
  • 各頂点Vについて、最初のポリゴンのエッジを反復処理します。
  • すべて頂点に面するエッジの「範囲」を見つける
  • その範囲を定義する外側の頂点のペアを取り、それらを接続する範囲内のすべてのエッジを削除します
  • それらの外側の頂点から(2番目のポリゴンから)新しい頂点に2つの新しいセグメントを描画し、新しいエッジが正しい方向を向いていることを確認します。
  • 2番目のポリゴンから次の頂点に進む

最初の頂点のプロセスを示す図を次に示します。

ここに画像の説明を入力してください

より高速な方法は、他の多角形に面していない各多角形のエッジのリストを見つけ、他のすべてを削除し、残りのラインストリップの端点を互いに接続することです。

おそらく、他の誰かがいくつかの減算のアドバイスでチャイムすることができます。


これは問題(追加)の半分にしか対処していないようです。また、アルゴリズムがどのように機能するかを指摘したり、ポリゴンが重なった場合に最適化することもできます。

このアルゴリズムは、ターゲットポリゴンの「内側」にある頂点を暗黙的に無視します。これにより、2番目のポリゴンのエッジが最初のポリゴンと交差する問題も補正されます。
3Dave 14年

それはマージフェーズ(マージハルアルゴリズムのポイント4.にほぼ等しくなります。私の場合、ポリゴンを結合した後、より多くの領域を囲むのは正しい解決策ではありません。正しい解決策は、両方のポリゴンを重ならない、触れない
セバスチャンバース14年

@luftgewehrindianer Ah-うん、それは大きな違いを生む。おそらく私は質問を誤解したでしょう。結果が凸であるか凹であるかを気にせずに、ポリゴンを一緒に追加しようとしていますか?または、交差点に基づいて凸集合を生成しますか?(
差し当たりの

@DavidLively同じ色で、境界線のない2つの凸ポリゴンを想像してください。それらが重なると、1つの新しい凸または凹ポリゴンのように見えます。彼は結合された形状の三角形分割を見つけようとします。両方のポリゴンの間に領域を追加しないでください。
ダニジャー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.