2015/12/24(木) [n年前の日記]
#1 [dxruby] スキャンラインシードフィルによる塗り潰しの実験
Ruby + DXRuby を使って実験。
_スキャンラインシードフィルによる塗り潰しの実験
_スキャンラインシードフィルの実験その2(アルゴリズム高速化版)
以下のような感じで動作確認できる。
以下、参考ページ。
_ペイント・ルーチン (1)シード・フィル アルゴリズム
_JavaScript, Canvas スキャンライン・シードフィル アルゴリズムによる塗り潰し : Serendip - Webデザイン・プログラミング
_スキャンラインシードフィルによる塗り潰しの実験
_スキャンラインシードフィルの実験その2(アルゴリズム高速化版)
以下のような感じで動作確認できる。
ruby scanlineseedfill.rb TEST.PNG画像内をクリックすれば塗り潰しができる。
以下、参考ページ。
_ペイント・ルーチン (1)シード・フィル アルゴリズム
_JavaScript, Canvas スキャンライン・シードフィル アルゴリズムによる塗り潰し : Serendip - Webデザイン・プログラミング
[ ツッコむ ]
#2 [dxruby] キャラグラエディタのバケツツールが動くようになった
バケツツールが動かなかった理由が分かった。ハッシュを2次元配列に入れて、各ハッシュと比較して領域色か非領域色かを判別してたのだけど、ハッシュを浅いコピーで取り出してたから ―― 要するにポインタをコピーしてたから、おかしなことになってた。
指定された座標に対応するハッシュをコピーして、そのハッシュと、他の座標のハッシュと比較していくのだけど。その最初の指定座標を塗りつぶしてしまうと、領域色として扱うべきハッシュ内容が変わってしまうので、その後の比較が全部おかしくなるという。
最初の座標のハッシュは深いコピーで取り出さないといけない。
_Marshalで配列やハッシュをディープコピーする - Ruby Tips!
a = Marshal.load(Marshal.dump(hoge)) みたいな。
ちなみに Ruby 2.0 では、require 'marshal' を書くとエラーが出てしまった。いきなり Marshal.load(Marshal.dump(hoge)) と書いても動いてるので、基本機能(?)として取り込まれたのかなと想像していたり。
指定された座標に対応するハッシュをコピーして、そのハッシュと、他の座標のハッシュと比較していくのだけど。その最初の指定座標を塗りつぶしてしまうと、領域色として扱うべきハッシュ内容が変わってしまうので、その後の比較が全部おかしくなるという。
最初の座標のハッシュは深いコピーで取り出さないといけない。
_Marshalで配列やハッシュをディープコピーする - Ruby Tips!
a = Marshal.load(Marshal.dump(hoge)) みたいな。
ちなみに Ruby 2.0 では、require 'marshal' を書くとエラーが出てしまった。いきなり Marshal.load(Marshal.dump(hoge)) と書いても動いてるので、基本機能(?)として取り込まれたのかなと想像していたり。
[ ツッコむ ]
以上、1 日分です。