ポイントのリストとして表される閉じた2Dポリゴンからバイナリビットマップを作成する必要があります。あなたはそれを行うための効率的で十分に単純なアルゴリズム、あるいはC++コードのほうが良いと指摘してください。2Dポリゴンをラスタライズ
ありがとうございます!
PS:プロジェクトに依存関係を追加しないようにしたいと思います。しかし、オープンソースのライブラリをお勧めするなら、私はいつもコードを見ることができるので便利です。
ポイントのリストとして表される閉じた2Dポリゴンからバイナリビットマップを作成する必要があります。あなたはそれを行うための効率的で十分に単純なアルゴリズム、あるいはC++コードのほうが良いと指摘してください。2Dポリゴンをラスタライズ
ありがとうございます!
PS:プロジェクトに依存関係を追加しないようにしたいと思います。しかし、オープンソースのライブラリをお勧めするなら、私はいつもコードを見ることができるので便利です。
あなたが望む魔法のgoogleのフレーズは、「非ゼロ巻きルール」または「偶数奇数ポリゴンフィル」です。どちらも、ほとんどの目的のために実装するのは非常に簡単で、十分に高速である
:
はのためにWikipediaのエントリを参照してください。いくつかの巧みさで、アンチエイリアス化することもできます。
複雑さはO(ピクセル単位エリア)
あなたはpygameのポリゴンの塗りつぶしルーチンをチェックアウトすることができます。 draw_fillpoly
の機能を見てください。
アルゴリズムは非常に簡単です。各セグメントがY軸に沿って交差するすべての位置を検出します。これらの交点はソートされ、次に各交点のペアが水平に塗りつぶされます。
これは複雑で交差する図形を処理しますが、明らかに大量のセグメントでこのアルゴリズムを破ることができます。 "even-odd rule"
の堅牢implimentationについては
あまりにも関連していないが、ピートあなたはパイゲームを作るために最高です:) – yairchu
はDarel Rex Finley's Efficient Polygon Fill、またはそれのBlender's versionを参照してください。
これは、そのような状況を検出するための複雑なコードを必要とせずに、自己交差線をサポートし、巻き線に依存しない(ポリゴンを反転して同じ結果をもたらす)です。
更新、Iは各Yピクセルのため上の全ての座標をループ回避Darelレックスの方法の最適化されたバージョンを作りました。
スタンドアローンの実装:
高速化の可能性が高い2540x1600地域、YMMV以上の任意の手描き落書きを使用して、その速く7.5倍(11X round
コールを削除)を中心に、簡単なテストからは、指数関数的になりますが。
@plinth:単純なポリゴンではそれほど大したものではありませんか? – yairchu
単純なポリゴンとは何ですか? @static_rttiは、いくつの点が指定されているのか、多角形が常に凸であるのかを指定しないので、一般的な解決策が正解です。 NZWとEOはバットシンプルで、スキャンライン指向のソリューションなどに役立ちます。 – plinth
@plinth:ありがとう、これは私が探していたものです!あなたがその魔法のフレーズを持っていないとき、グーグルのものは難しいかもしれません: –