schwarzの雑記 このページをアンテナに追加 RSSフィード

06/06/06 (Tue)6月6日の雑記

[] 22:22 6月6日の雑記 - schwarzの雑記 を含むブックマーク

ペイントにある「塗りつぶしツール」の働きをしてくれるメソッドを研究中。

まずは何も考えず再帰で組むとこうなります。

class Bitmap
  #---------------------------------------------------------
  # ● 指定した座標x, yと隣接し同じ色の部分をcolorで塗りつぶす
  #---------------------------------------------------------
  def fill(x, y, color)
    
    # 塗りつぶしていく部分の色
    before_color = get_pixel(x, y)
    
    # (x, y)の点をcolorで塗る
    set_pixel(x, y, color)
    
    # 上下左右に同じ色があれば再帰で塗る
    if get_pixel(x-1, y) == before_color
      fill(x-1, y, color)
    end
    if get_pixel(x+1, y) == before_color
      fill(x+1, y, color)
    end
    if get_pixel(x, y-1) == before_color
      fill(x, y-1, color)
    end
    if get_pixel(x, y+1) == before_color
      fill(x, y+1, color)
    end  
    
  end
end

これで、塗りつぶす部分が小さい図形ならうまくいきます。

しかし一辺の長さが3桁ぐらいのデカい図形になると、お馴染み(?)のstack level too deepが発生します。再帰が深すぎるということです。


となると、やはりループでラインごとに考えていくとかそういうことになりそうです。

もっと練っていくこととします。

まあ、調べればいろいろ出てきそうな感じですが、それで分かっても勉強にならないですし。

ゲスト