5

私はiPhoneの開発にとても慣れていません。iPhoneでFloodFillアルゴリズムを使用してアプリケーションを作成したいと思います。FloodFillについてはわかりません。FloodFillアルゴリズムの目的を説明してください。FloodFill(iPhone)のサンプルアプリケーションを提供すると、私は本当に本当に幸せです。朝からFloodFillについて調べているのですが、何も見つかりません。

私の仕事は、画像を部分的に色で塗りつぶしたいということです。つまり、1つの色を選択して画像の特定の領域をクリックすると、選択した色で色付けされます。

これをするのを手伝ってください。

編集:iPhoneのフラッドフィルアルゴリズム実装のコードを記述できません。

4

3 に答える 3

6

これは再帰的アルゴリズムです。つまり、プロセス全体のより小さな部分を実行するためにそれ自体を呼び出します。

塗りつぶしは1ピクセルから始まります。次に、隣接する4つのピクセル(上、下、左、右)をチェックします。最初に使用したものと同じ色の4つのピクセルのいずれかについて、そのピクセルから始まる別のフラッドフィルを呼び出します。

小さな写真を想像してみてください。は1つの色で、Xは別の色です。数字は参考のためにありますので、7,0が右上です。(赤/黒の構文の強調表示は無視してください!)

 01234567
0........
1.XXXX...
2.X..X...
3.X...X..
4.XXX..X.
5...X..X.
6...XXX..
7........

ここで、3,3でフラッドフィルを開始するとします。3,3が新しい色に変わります。次に、上、下、左、右をチェックします。上(3,2)の場合、同じ色(ドット)があるため、そこから別の塗りつぶしが開始されます。ダウン(3,4)の場合、色が異なるため、このブランチは停止します。左、(2,3)、右(4,3)も同じ(ドット)なので、そこからフラッドフィルの分岐が増えます。

新しい色がOであるとしましょう。これで、次のようになります。

 01234567
0........
1.XXXX...
2.X.OX...
3.XOOOX..
4.XXX..X.
5...X..X.
6...XXX..
7........

「up」ブランチは、(3,2)から新しいフラッドフィルを開始しました。ここから上はXなので、止まります。右はXなので停止し、下はOで停止しますが、左(2,2)は同じ(ドット)なので、そこから新しいフラッドフィルを開始します。

同様に、元のフラッドフィルからの「右」ブランチは(4,3)から始まりました。使用できるブランチはdown(4,4)のみです。今、私たちはこれを持っています:

 01234567
0........
1.XXXX...
2.XOOX...
3.XOOOX..
4.XXXO.X.
5...X..X.
6...XXX..
7........

したがって、フラッドフィルは(4,4)から右下に分岐することにより、継続します。これらの2つのブランチの1つは、(5,5)に分岐します。その時までに、それ以上の可能な分岐はありません。

そして、それは私のランチタイムでいっぱいです:)

于 2011-02-01T13:14:14.470 に答える
3

これは非常に興味深い質問です。意味は:

  1. 「洪水で満たされた」ポリゴン?ポリゴンとは、些細なポリゴンから洗練された偶数/奇数ルールの任意のポリゴンフィラー(ポリゴンはベジェ曲線パスによって定義される場合があります)まで、あらゆるものを意味しますか?

  2. 「ポイントを選択して塗りつぶす」タイプのアルゴリズム?ペイントプログラム(ここではMacPaint / Deluxe Paintの時代を考えています)で見られる古い「ペイント缶」フラッドフィルツールのようなものです(少なくとも、以前は見ていましたが、私にとっては長い間です)。これらのアルゴリズムは、「エッジ」(通常はフラッドフィルが開始されたものとは異なる「色」)に当たると「停止」するピクセルの些細な2D平面から、非常に高度な自動マジックエッジ検出アルゴリズムまでさまざまです。ハイエンドのペイント/写真操作プログラム(つまり、PhotoShop)で見られるかもしれません。

私はあなたが些細なケースのどれも探していないと仮定するつもりです...まあ、あなたがこれを割ろうとする前にあなたが割る必要がある他のいくつかのナッツをおそらく持っているからです。

したがって、#1の場合は、おそらくドキュメントを読むことから始める必要があります。Mac OS X / iOSには、主にPDF/PostScriptレンダリングモデルに基づく非常に洗練された2DグラフィックスAPIがあります。CoreGraphics / Quartzは自動的に「フラッドフィル」を実行し、ベジェ曲線のレベルで実行して起動できます。

#2の場合、おそらくまったく同じドキュメントを読むことから始める必要があります。とにかく、おそらくこのレベルでそれと対話する必要があるでしょう。ただし、「自動マジック」エッジ検出をどの程度高度にするかによっては、OpenGL+プログラム可能なシェーダーの方が適している場合があります。しかし、このようにレンダリングパイプを直接叩いている人は、通常、ピクセルデータの操作に使用される基本的なアルゴリズムをかなりよく理解しているので、この手法は適切ではない可能性があります。

同じコンテキストでCoreGraphicsとOpenGLを混在させることは、少し高度な手法であるため、プライマリレンダリングAPIとしてCoreGraphicsまたはOpenGLのいずれかを選択する必要があります。ただし、CoreGraphicsには、同じタイプの処理を実行するための非常に高度で洗練されたAPIもありますが、これは基本的なCoreGraphics APIの使用法をはるかに超えています(ただし、さまざまなiOSグラフィックスドキュメントを参照すると、すべての情報を見つけることができます。広範で非常によく文書化されています)。

于 2011-02-03T07:46:23.570 に答える
2

プログラムに従って、独自の実装を作成する必要があります。

お役に立てれば。

于 2011-02-03T06:58:41.643 に答える