最高の「バケット充填」アルゴリズムとは何ですか?


16

私は画像処理にかなり慣れていないので、現在、塗りつぶし機能を備えたペイントのようなアプリケーションに取り組んでいます。ただし、バケットフィルに最適なアルゴリズムが何であるかはわかりません。

このサイトで見つけた例を実装しましたが、ユーザーが既に同じ色で既に塗りつぶされている領域を塗りつぶそうとすると、無限ループの問題が発生しました。

現在、左、右、上、下を埋めることでこの問題を回避しています。ただし、ピクセルが左に塗りつぶされると、右に塗りつぶせないようにしたので、次のような形状になります。

例

バケットツールを赤い点で使用すると、適切に塗りつぶされません。

したがって、これらの問題をすべて解決するアルゴリズムまたはアルゴリズムへのリンクを誰かが知っていることを望んでいます。

追加情報:これは、ペイントツールとしてJavascriptを使用して実装されます。Canvas要素を利用してオンラインで使用されます。


このベクターまたはビットマップはベースですか?私がイメージして、ビットマップを想定しますが、念の作ってるんだ...
デミアンブレヒト

1
間違って実装していると思います。ドキュメントをざっと読みましたが、画像の例によれば、これは上記のような画像を埋めるはずです。彼のコードをコピーして貼り付けましたか、それとも書き直しましたか?
RLH

グラフの横断を考えてください。
Bwmat

@RLH:私のセットアップで動作させるために、いくつかの変更を加えて彼のコードをコピーして貼り付けました。
イヴァン

@Ivan:「無限ループ」の問題を解決する前に、新しいアルゴリズムの検索を開始しないでください。既存の実装でそれを修正することさえできない場合、すべてをゼロから書き直すとき、あなたは間違いなくはるかに多くの問題に直面するでしょう。
ドックブラウン

回答:


21

実際には、Flood Fillアルゴリズムと呼ばれるものを探しているようです。それがあなたがそれのための例のトンを見つけていない理由かもしれません。アルゴリズムについてはWikipediaページにいくつかのFlood Fillメソッドがリストされています。非再帰的な「キュー」メソッドのいずれかを強くお勧めします。


I highly recommend one of the non-recursive, 'queued' methods.-理由を説明してください。
エルファイヤー

1
@Elfayer関数が呼び出されるたびに(たとえば、 "X()"が "Y()"を呼び出す)、元の関数( "X()")からのパラメーターとメモリの場所がスタックに格納されます。そのため、大きく複雑なスペースを埋める場合、再帰的な関数呼び出しが多くなります。コンパイラと言語に応じて、これはスタックオーバーフローまたは過剰なメモリ消費につながる可能性があります。
boxcartenant

-1

現在同じことをしています。しかし、あなたが指摘する問題に遭遇したとき、ペイントしようとしている同じ色の領域上でツールがクリックされた場合、単に関数を終了することを選択しました(これはms-paintの動作のようです) 。

キューメソッドは、プログラミングの経験がある人にとって非常に直感的でなければなりません。

ペイントと同じ色のスポットを囲む領域をペイントすることが懸念される場合は、次のことができます。

  • 背景色を確認してください。
  • クリックした同じ色のスポットの端を検索します。
  • 周囲のポイントをスポットに並べます。
  • この(この場合)白いドットで満たされたキューを使用して、通常の実行を続行します。

ご希望の場合は、こちらの(かなり恥ずかしい)コードを ご覧ください

速くなるにはほど遠いですが、うまくいきます...


なぜダウン投票なのですか?:(メソッドが特に「高速」ではないことはわかっていますが、それは機能し、提案された解決策も実行します:(
フアンパブロアルバレスアルファロ

1
この投稿は読みにくい(テキストの壁)。それをより良い形に編集してもいいですか?
グナット

2
マジ?読むのが難しかったので、人々は大量に投票しましたか?編集を選択しないのはなぜですか?コンテンツに問題があるわけではありません。
l46kok

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.