2013-04-16 7 views
12

私は、オープンソースのゲーム、Bitfighterの開発者です。以下のSOポストごとのように、私たちは私たちのゲーム内のAI(ロボット)で使用するためのメッシュゾーンを生成するための優れた「トライアングル」ライブラリを使用しています堅牢、高速で複雑なポリゴン寛容なライセンスを持つ三角測量C/C++ライブラリ

Polygon Triangulation with Holes

しかし、私たちは小さな思わぬ障害に走りましたDebianのために私たちのゲームをパッケージ化したいときには、 'Triangle'ライブラリを使うことで私たちのゲームは「非自由」とみなされます。

私たちは「トライアングル」ライブラリーのパフォーマンスに非常に満足していて、実際にそれを放棄する必要はありません。しかし、私たちはライセンス問題にも対処するのが好きではありません。そのため、私たちは、その「堅牢性とスピード」を「トライアングル」に合わせることができる、適切に許可された交換品を見つけるための探求に着手しました。

我々はいかなる任意の方法で一緒に配置された不規則な多角形の種類、ならびに穴を扱うことができるCまたは三角形に大規模で複雑な、領域を分割するためのC++ライブラリ、探しています。堅牢性が私たちの第一の必要条件であり、スピードはほぼ重要です。

私はpoly2triを発見したが、それはそれは一致エッジを持つポリゴンを扱うことができないバグに苦しんでいます。

我々はいくつかのライブラリを発見したが、すべては一つのこと、または別に苦しむように見える:どちらかが遅すぎる、または穴を処理するか、またはいくつかのバグに悩まされません。現在、我々はpolypartitionをテストしており、私たちは大きな期待を持っています。

偉大な「Triangle」ライブラリにはどのような選択肢がありますか?許諾ライセンスはありますか?

+0

Triangleのようなライブラリから正確に必要なものについて詳しく説明できますか?おそらく、アルゴリズムのいくつかを自分で書くことができ、必要に応じてコードを公開することができます。 –

+0

Triangleライセンスとは何ですか?あなたはJonathan Shewchukにメールを送り、彼があなたのためにそれを再認可するかどうか尋ねましたか? –

+0

@MareInfinitus私たちには壁があるレベルがあります。レベルのプレイ可能な領域全体をメッシュゾーンのナビゲーションのために三角測量する必要があるので、ロボットが移動することができます。 – raptor

答えて

13

解決策が見つかりました。結局のところpoly2triでした。優れたClipperライブラリを使用して、入力に多少のアルゴリズムの追加がありました。

次のように私たちのプロセスは、次のとおりです。

  1. を実行し、すべての私達の穴クリッパーを通じて巻きゼロ以外で労働組合を使用して(これは、内側の穴は外側のものとは反対の方向に巻かれていることを意味します)。 Clipperはまた、イプシロン内にリピートのないきれいな入力点を保証します。
  2. 私たちの穴を反時計回りと時計回りに巻いたものにフィルターします。時計回りの穴は穴が遠回りし、poly2triへの入力としての穴の残りの部分を使用して、外側の境界と見つかった各時計回りのポリゴンを三角、poly2triを使用
  3. 三角測量する必要その内部の別の同心の領域が存在したこと、それらが発見された場合を意味しました境界の1つ内にある。

結果: poly2triはちょうど約早くトライアングルとして三角測量するようで、これまでのところ、我々はそれで投げてきたすべてのものと非常に堅牢されています。

興味のある方はhere are our code changesです。

私はここに始まっ別のライブラリに、私たちの堅牢性を追加して、私たちのクリッパーツーpoly2triコードを引き出すことを試みてきた

更新:clip2tri

+0

私はちょうどフォローアップして、poly2triは速い間に実際に頑強さの問題に苦しんでいると言っています。通常は、通常はイプシロンに近い点が含まれます – raptor

+1

私は、 poly2triがクラッシュするいくつかの例私はこの組み合わせですべてのケースを解決することができました:Execute()の前にClipper :: StrictlySimple(true)を設定してください。その後、私はCleanPolygon()を使用して、結果のポリゴンと穴の両方にedgeShrink()を使用します。最後に、等しい座標を持つ隣接する頂点をチェックし、それらのうちの1つを削除します(ポリゴン/穴が3つ未満の頂点になると、ポリゴン/穴全体が破棄されます)。 –

1

CGALの2D Triangulationsパッケージを見ることができます。ポリゴンを穴で三角形分割する例はhereです。 パッケージのライセンスはGPLv3 +です。

必要に応じてこのパッケージのみを抽出することはあまり難しいことではありません。

1

小さなサイドノートとして、 :

私は最近、窓フレームを家の壁に切断するための複雑なポリゴンクリッパ&三角形分割器を実装しなければなりませんでした。

私はVatti clipperの結果に満足していましたが、poly2triで使用されたDelaunay三角測量は大きすぎて、壁面の重心座標に沿ってウィンドウ枠をスムーズにドラッグすることができませんでした。私の頭を少し傷後、私は穴で動作するように、このはるかに簡単な三角形をだましてしまった:私は何

http://wiki.unity3d.com/index.php?title=Triangulator

が水平にした最短クリッピングポリの高さによって壁面を細分化します。私の場合、彼らは常に長方形ですが、そうである必要はありません。とにかく、それは、クリッパーが通常のまたは凹面のポリでしか動作しないようにします。したがって、安価な三角測量法で逃げることができます。ここで

は作業それを示すいくつかのスクリーンショットです:

https://www.dropbox.com/sh/zbzpvlkwj8b9gl3/sIBYCqa8ak

この情報がお役に立てば幸いです。

+0

どうやって穴を受け入れるのですか? –

関連する問題