2009-08-27 26 views
6

ポイントのリストとして表される閉じた2Dポリゴンからバイナリビットマップを作成する必要があります。あなたはそれを行うための効率的で十分に単純なアルゴリズム、あるいはC++コードのほうが良いと指摘してください。2Dポリゴンをラスタライズ

ありがとうございます!

PS:プロジェクトに依存関係を追加しないようにしたいと思います。しかし、オープンソースのライブラリをお勧めするなら、私はいつもコードを見ることができるので便利です。

答えて

10

あなたが望む魔法のgoogleのフレーズは、「非ゼロ巻きルール」または「偶数奇数ポリゴンフィル」です。どちらも、ほとんどの目的のために実装するのは非常に簡単で、十分に高速である

はのためにWikipediaのエントリを参照してください。いくつかの巧みさで、アンチエイリアス化することもできます。

+0

@plinth:単純なポリゴンではそれほど大したものではありませんか? – yairchu

+2

単純なポリゴンとは何ですか? @static_rttiは、いくつの点が指定されているのか、多角形が常に凸であるのかを指定しないので、一般的な解決策が正解です。 NZWとEOはバットシンプルで、スキャンライン指向のソリューションなどに役立ちます。 – plinth

+0

@plinth:ありがとう、これは私が探していたものです!あなたがその魔法のフレーズを持っていないとき、グーグルのものは難しいかもしれません: –

3
  • Triangulate your polygon
  • ラスター三角形の各三角形が持っていない場合
    • (あなたはGPUを使用している場合、それはそれはGPUの原始的な操作ですが、代わりにあなたのためにそれを行うことができます) x軸に平行な線分を2つの三角形に分割し、x軸に平行な線を持ち、median-yの点を通ります。
    • 残りのタスクは次のような三角形を描画します。 x軸に平行な線分です。このような三角形は、左辺セグメントと右辺セグメントを有する。
    • 三角形の走査線(min-yからmax-y)を反復する。各yについて、その走査線の左および右のセグメントの点を計算する。これら2つの点(単純なmemset)をスキャンラインセグメントに入れます。

複雑さはO(ピクセル単位エリア)

+0

どのように結果の三角形をラスタライズしますか?毎回画像全体をトラバースすることによって、1つずつ?それは非常に遅くなる可能性はありますか? –

+0

@static_rtti:毎回画像全体をトラバースするとはどういう意味ですか? – yairchu

+0

@static_rtti:三角形をラスタライズする方法の説明を追加しました – yairchu

4

あなたはpygameのポリゴンの塗りつぶしルーチンをチェックアウトすることができます。 draw_fillpolyの機能を見てください。

アルゴリズムは非常に簡単です。各セグメントがY軸に沿って交差するすべての位置を検出します。これらの交点はソートされ、次に各交点のペアが水平に塗りつぶされます。

これは複雑で交差する図形を処理しますが、明らかに大量のセグメントでこのアルゴリズムを破ることができます。 "even-odd rule"

の堅牢implimentationについては

+0

あまりにも関連していないが、ピートあなたはパイゲームを作るために最高です:) – yairchu

2

Darel Rex Finley's Efficient Polygon Fill、またはそれのBlender's versionを参照してください。

これは、そのような状況を検出するための複雑なコードを必要とせずに、自己交差線をサポートし、巻き線に依存しない(ポリゴンを反転して同じ結果をもたらす)です。


更新、Iは各Yピクセルのため上の全ての座標をループ回避Darelレックスの方法の最適化されたバージョンを作りました。

スタンドアローンの実装:

  • C99
  • Rust(テストあり)。

高速化の可能性が高い2540x1600地域、YMMV以上の任意の手描き落書きを使用して、その速く7.5倍(11X roundコールを削除)を中心に、簡単なテストからは、指数関数的になりますが。

関連する問題