PyGame QIXクローン、塗りつぶし領域


8

私はPyGameで遊んでいます。

今私はQIXクローンを実装しようとしています。

ゲームループがあり、画面上でプレーヤー(カーソル)を移動できます。

QIXでは、プレーヤーの動きによって画面に痕跡(尾)が残り、ポリラインが作成されます。

画面境界を持つポリラインがポリゴンを作成する場合、領域は塗りつぶされます。

どうすればこの動作を実現できますか?

尾をどのようにメモリに保存しますか?

塗りつぶす必要のある閉じた形状を構築するときにそれを検出する方法は?

私は正確な実用的なソリューションを必要としません、いくつかのポインター、アルゴ名はクールでしょう。

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

開始時、灰色の境界線のみがあり、プレーヤーがカーソルを移動できます。

  • 最初のシナリオ:

ユーザーは、カーソルをポイントAからポイントBに移動し、赤いマルチラインをポイントCまで描画します。この時点で、境界を越えているため、ポイントAは自動的にポイントCに接続され、塗りつぶされるべきポリゴンが作成されます(私の図面上のそのオレンジ色のもの)。ポリゴンの塗りつぶしはPyGameでは非常に簡単です。私がポイントのシーケンスを提供し、残りはPyGameが処理するためです。

  • 2番目のシナリオ:

ユーザーはボーダーをポイントDに移動し、そこからラインEに線を引きます。前のポリゴンのラインと交差しているため、ラインとボーダーで別のポリゴンを作成できるので、それも塗りつぶす必要があります。(緑色のもの)。

  • 3番目のシナリオ:

プレイヤーはポリゴン上をさらに移動し(既存のポリゴンライン上を移動できます)、ポイントGからポイントFにラインを描画します。ここでも、境界線と既存のラインのため、別のポリゴン(青色のポリゴン)を塗りつぶす必要があります。


たぶん(同様の質問が)ここにいくつかの答えがあります:gamedev.stackexchange.com/questions/26377/...
tigrou

おかげで、リンクは原始的なユースケースを示しています。私は質問を更新したので、達成しようとしていることがより明確かもしれません
アストロパニック

回答:


5

これが私がそれに取り組む方法です:

  1. 常に、ポリゴンで表される単一のオープンエリアがあります。他のすべての領域は無関係です。
  2. ポリゴンの周囲からポリゴンの内部に移動すると、線が始まります。
  3. ポリゴンの内部から周囲に戻ると、線が止まります。
  4. ラインを停止すると、ポリゴンが2つのポリゴンに分割されます。
  5. 次に、2つのポリゴンのどちらを塗りつぶし、どちらをオープンエリアとして保持するかを決定します。Qixでは、Qix(敵)がいた側が開いたままで、反対側が埋められました。

ポリゴンをどのように細分割しますか?ラインの端点を使用してポリゴンの周囲を2つのセクションに分割し、新しいラインを使用してこれらの2つのセクションを新しいポリゴンに完成させます。

たとえば、オープンエリアがポイントを持つポリゴンであるとし[p0, p1, p2, p3, p4, p5]ます。開始点Aは〜の間にp1ありp2、終了点Bは〜の間にp3ありp4ます。描かれた新しい線は[A, s, t, u, v, B]です。私たちは、最初の2つのセグメントにポリゴンを分割[A, p2, p3, B]して[B, p4, p5, p0, p1, A]。これらの2つのセグメントが一緒になって元のポリゴンを形成します。次に、それぞれに新しい行を接着し(1回前方、1回後方)、[A, p2, p3, B, v, u, t, s]およびを形成し[B, p4, p5, p0, p1, A, s, t, u, v]ます。これらのポリゴンの1つを塗りつぶし、もう1つを新しいオープンエリアとして保持します。

私はこれを実装しておらず、それが機能するかどうかはわかりませんが、それは私が使用するアプローチです:ポリゴン塗りつぶしの代わりにポリゴンサブディビジョン。


1

これは、複数の個別のサブステップが関係する問題です。これが私が提案することの概要です:

  • プレーヤーが複数の線の交差を形成するまで待ちます
  • 交差点の両側からピクセルを取得します
  • 彼らが互いに接続できるかどうかを確認するためにPathfind
  • 相互に接続できないピクセルは別の領域です
  • 塗りつぶしを実行して、領域内のすべてのピクセルを取得します

ゲームのピクセルの状態をNumpy配列(numpy dot scipy dot org)に保存します。色はRGBの3つの個別の配列にすることができますが、私が焦点を当てる配列はライン/ラインなし配列です。ゼロで初期化し、ゲームフィールドのサイズに設定します。プレーヤーがピクセルを通過するたびに、配列内の対応する項目を1に設定します。これらを異なる色で画面に表示する必要があります、あなたのセリフだから!

プレーヤーのピクセルが動くたびに、それが既存のラインを通過した(そしてその隣にラインを引いた)かどうかを確認します。もしそうなら、私は可能な各分割からピクセルを取得します:

. . . | . 
. . . | . 
. . . | x 
. . x < -

ドットは空のピクセル、ラインは(明らかに)ライン、Xは選択したい空のピクセルです。これは次の方法で行うことができます。

  • プレーヤー/交差点に隣接するすべての空のピクセルをリストに追加します。
  • リスト内の次のアイテムが(ゲームフィールドで)隣接している場合、ピクセルを削除してリストをループします。

交差点の考えられるすべての側面からピクセルを取得したら、考えられる各ペアでA *を実行します。(詳細については、http://www-cs-students.stanford.edu/~amitp/gameprog.html#pathsまたはGoogle a-starを参照してください。)ペア間にパスが見つかった場合は、接続されているピクセルの1つを削除しますリストから。

すべてのペアのループとパスの後、残っているピクセルはそれぞれ別の閉じた領域にあるはずです!各領域のすべてのピクセルを取得するには、その領域のピクセルから塗りつぶしを実行します。http://en.wikipedia.org/wiki/Flood_fillを参照してください

幸運を!


0

あなたのエリアは単なる一連のポイントです。困難な作業は、一連のポイントを(通常は)凹面の多角形を形成し、それらを三角形にして、レンダリングしておそらくテクスチャをそれらに投影できるようにすることです。詳細については、http://en.wikipedia.org/wiki/Polygon_triangulationを参照してください


1
三角測量の問題ではないので、PyGameがそれを処理します。質問を画像で更新し、いくつかのユースケースを見て、要点を理解してください。とにかくありがとう
アストロパニック2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.