炎のエフェクト
をテンプレートにして作成
home
>
サイトマップ
開始行:
RIGHT:寄稿:東條遼平
* 値を混ぜて平均化 [#g14d9cba]
せっかくJavaを使うので動くものを作ってみました。
大変簡単な割に結構炎に見えるというのが大変嬉しいところで...
原理はというと火種をいくつか用意して、画面を更新する度に
ぼかしながら画面上部へ向かって押し上げていくだけです。
例えば上のプログラムでは(x-1,y-1)の値を決めるときには(x-1...
(x, y-1)、(x, y+1)の平均をとっています(画面の左上が原点で...
座標となっている事に注意)。それではソースコードを見てみま...
//カラーパレット作成
color = new Color[128];
for(int i=0, index=0; i<32; i++, index++)
color[index] = new Color(i*8, 0, 0);
for(int i=0, index=32; i<32; i++, index++)
color[index] = new Color(255, i*8, 0);
for(int i=0, index=64; i<64; i++, index++)
color[index] = new Color(255, 255, i*4);
恐らくこの部分が一番重要です。
この部分では使う色を事前に作成しています。
もちろんRGBそれぞれの値を別々に上のアルゴリズムに基づいて...
いいのですが、こちらの方が簡潔でよりうまく炎に見えてくれ...
この場合はcolorの配列のインデックスに対して上のアルゴリズ...
もちろんindexの値が小さい程暗い色にする必要があります。
ちなみに色の設定の出来によって結果の質が大きく左右されま...
//色をぼやかせて上に押し上げる
for(int i=1; i< height-1; i++){
for(int j=1; j< width-1; j++){
pallet[(i-1)*width + j] = (pallet[i*width + j] +
pallet[i*width + j-1] +
pallet[i*width + j+1] +
pallet[(i-1)*width + j] +
pallet[(i+1)*width + j])/5;
}
}
この部分が前述のアルゴリズムの部分です。
palletの配列はcolorの配列のインデックスを保持しています。
ただし、これだけではうまく炎に見えません。
というのも現実の炎にはゆらぎが存在するからです。
そこで火種の部分を点滅させてみます。
つまりランダムに火種を作ればいいのです。
とは言え、画面のいたるところに火種が散らばってもうまくい...
あらかじめ火種を作る場所を決めておきます。その上で乱数に...
毎回判断することにします。
seedparam = new int[width * height];
//ランダムにパラメータを作成
for(int i=(height-2)*width; i<width*height; i++) {
seedparam[i] = (int)(128*Math.random());
}
seedparamの配列のインデックスはRGB情報を保持させるimageの...
に対応しています。つまり上のソースでは画像の最後の2行を...
決めています。パラメータを128段階にしていますが、これは毎...
ランダムに閾値を設け、その閾値よりも値が大きければ火種と...
毎回閾値がランダムに変化するために結果的に火種がランダム...
ちなみにソース内に数値をべた書きしていて申し訳ないのです...
ここでの128は適当な値で、colorの配列数とは関係ありません...
//閾値をランダムに変化させ、火種をランダムに点火させる
for(int i=0; i<width*height; i++){
if(seedparam[i]!=0&&seedparam[i]>(int)(firelevel*Ma...
pallet[i] = 127;
}else if(seedparam[i]!=0){
pallet[i] = 0;
}
}
ここでseedparamがゼロで無い部分は火種となり得る場所ですの...
ランダムに閾値を変化させ、閾値を越えればパレットの中で一...
インデックスである127を代入しておきます。越えなければ火種...
ゼロにしておきます。
炎のアルゴリズムの説明は以上ですが、それ以外の部分を一部...
mims = new MemoryImageSource(width, height, image, 0, wi...
mims.setAnimated(true);
buffer = createImage(mims);
imageはRGBが保持されているint型の一次元配列です。
これを引数としてMemoryImageSourceのインスタンス生成をし、
createImageに放りこむ事でImageのオブジェクトを返してくれ...
またsetAnimatedにtrueを入れることでimageの配列を変更した...
mims.newPixels();
とすればImageオブジェクトにimageが反映されます。
$ appletviewer FireEffect.java
でアプレットを起動できます。
- &ref(FireEffect.java);
終了行:
RIGHT:寄稿:東條遼平
* 値を混ぜて平均化 [#g14d9cba]
せっかくJavaを使うので動くものを作ってみました。
大変簡単な割に結構炎に見えるというのが大変嬉しいところで...
原理はというと火種をいくつか用意して、画面を更新する度に
ぼかしながら画面上部へ向かって押し上げていくだけです。
例えば上のプログラムでは(x-1,y-1)の値を決めるときには(x-1...
(x, y-1)、(x, y+1)の平均をとっています(画面の左上が原点で...
座標となっている事に注意)。それではソースコードを見てみま...
//カラーパレット作成
color = new Color[128];
for(int i=0, index=0; i<32; i++, index++)
color[index] = new Color(i*8, 0, 0);
for(int i=0, index=32; i<32; i++, index++)
color[index] = new Color(255, i*8, 0);
for(int i=0, index=64; i<64; i++, index++)
color[index] = new Color(255, 255, i*4);
恐らくこの部分が一番重要です。
この部分では使う色を事前に作成しています。
もちろんRGBそれぞれの値を別々に上のアルゴリズムに基づいて...
いいのですが、こちらの方が簡潔でよりうまく炎に見えてくれ...
この場合はcolorの配列のインデックスに対して上のアルゴリズ...
もちろんindexの値が小さい程暗い色にする必要があります。
ちなみに色の設定の出来によって結果の質が大きく左右されま...
//色をぼやかせて上に押し上げる
for(int i=1; i< height-1; i++){
for(int j=1; j< width-1; j++){
pallet[(i-1)*width + j] = (pallet[i*width + j] +
pallet[i*width + j-1] +
pallet[i*width + j+1] +
pallet[(i-1)*width + j] +
pallet[(i+1)*width + j])/5;
}
}
この部分が前述のアルゴリズムの部分です。
palletの配列はcolorの配列のインデックスを保持しています。
ただし、これだけではうまく炎に見えません。
というのも現実の炎にはゆらぎが存在するからです。
そこで火種の部分を点滅させてみます。
つまりランダムに火種を作ればいいのです。
とは言え、画面のいたるところに火種が散らばってもうまくい...
あらかじめ火種を作る場所を決めておきます。その上で乱数に...
毎回判断することにします。
seedparam = new int[width * height];
//ランダムにパラメータを作成
for(int i=(height-2)*width; i<width*height; i++) {
seedparam[i] = (int)(128*Math.random());
}
seedparamの配列のインデックスはRGB情報を保持させるimageの...
に対応しています。つまり上のソースでは画像の最後の2行を...
決めています。パラメータを128段階にしていますが、これは毎...
ランダムに閾値を設け、その閾値よりも値が大きければ火種と...
毎回閾値がランダムに変化するために結果的に火種がランダム...
ちなみにソース内に数値をべた書きしていて申し訳ないのです...
ここでの128は適当な値で、colorの配列数とは関係ありません...
//閾値をランダムに変化させ、火種をランダムに点火させる
for(int i=0; i<width*height; i++){
if(seedparam[i]!=0&&seedparam[i]>(int)(firelevel*Ma...
pallet[i] = 127;
}else if(seedparam[i]!=0){
pallet[i] = 0;
}
}
ここでseedparamがゼロで無い部分は火種となり得る場所ですの...
ランダムに閾値を変化させ、閾値を越えればパレットの中で一...
インデックスである127を代入しておきます。越えなければ火種...
ゼロにしておきます。
炎のアルゴリズムの説明は以上ですが、それ以外の部分を一部...
mims = new MemoryImageSource(width, height, image, 0, wi...
mims.setAnimated(true);
buffer = createImage(mims);
imageはRGBが保持されているint型の一次元配列です。
これを引数としてMemoryImageSourceのインスタンス生成をし、
createImageに放りこむ事でImageのオブジェクトを返してくれ...
またsetAnimatedにtrueを入れることでimageの配列を変更した...
mims.newPixels();
とすればImageオブジェクトにimageが反映されます。
$ appletviewer FireEffect.java
でアプレットを起動できます。
- &ref(FireEffect.java);
ページ名:
home
>
Modified by
物理のかぎプロジェクト
PukiWiki 1.4.5_1
Copyright © 2001-2005
PukiWiki Developers Team
. License is
GPL
.
Based on "PukiWiki" 1.3 by
yu-ji
Powered by PHP 5.3.29HTML convert time to 0.002 sec.