ベロウソフ・ジャボチンスキー反応 bytearray 使用
重いのでシングルコアの方はご注意ください
たぶんgetPixel/SetPixelがよくないと思います
(1分ほどで渦縞模様が現れます)
読めなくて分解しました。
byteArray使ってみました。あってます?
// write as3 code here..
//
// 重いのでシングルコアの方はご注意ください
// たぶんgetPixel/SetPixelがよくないと思います
// (1分ほどで渦縞模様が現れます)
//
//読めなくて分解しました。
//byteArray使ってみました。あってます?
package {
import flash.display.*;
import flash.events.*;
import flash.utils.ByteArray;
[SWF(width=100, height=100, backgroundColor=0x000000)]
public class BZReaction extends Sprite
{
// このあたりの数値を変えるとパターンが変化します
private var bmd:BitmapData;
private var bmd_back:BitmapData ;
private var max_state:Number = 150;
private var new_state:Number;
private var state:Number;
private var k1:Number = 3;
private var k2:Number = 3;
private var g:Number = 24;
public function BZReaction():void {
bmd = new BitmapData( stage.stageWidth, stage.stageHeight, false );
bmd_back = new BitmapData( stage.stageWidth, stage.stageHeight, false );
addChild( new Bitmap(bmd) );
bmd.noise(1, 0, max_state, 1, false);
stage.addEventListener( Event.ENTER_FRAME, update);
}
private function getState( i:int,j:int,di:Number, dj:Number ): Number {
return bmd.getPixel( (i + di) % stage.stageWidth, (j + dj) % stage.stageHeight) >> 16
}
private function sum_of_neighbors( i:int,j:int,f:Function ): Number {
return f(i,j,-1, -1) + f(i,j,-1, 0) + f(i,j,-1, 1) + f(i,j,0, -1) + f(i,j,0, 1) + f(i,j,1, -1) + f(i,j,1, 0) + f(i,j,1, 1)
}
private function f1(a:Number, b:Number, c:Number):void {
new_state = ( state == 0 ) ? int(a / k1) + int(b / k2): c / (a + b + 1) + g;
if ( new_state > max_state ) new_state = max_state;
}
private function f4( i:Number ):Boolean{
return ( i > 0 && i < max_state )
}
private function f2( i:int,j:int,di:Number, dj:Number ): Boolean {
return f4( getState(i,j,di, dj) )
}
private function f3( i:int,j:int,di:Number, dj:Number ): Boolean {
return getState(i,j,di, dj) == max_state
}
private var ba:ByteArray = new ByteArray;
private function update( e:Event ):void {
ba.position = 0;
bmd.lock();
for( var i:Number = 0; i < stage.stageWidth; ++ i ) {
for( var j:Number = 0; j < stage.stageHeight; ++ j ) {
state = bmd.getPixel(i, j) >> 16;
if( state >= max_state )
{
new_state = 0;
}
else
{
f1(
sum_of_neighbors( i,j,f2),
sum_of_neighbors( i,j,f3 ),
sum_of_neighbors(i,j, getState ) + state )
}
ba.writeInt(new_state << 16);
} // j
} // i
ba.position = 0;
bmd.setPixels(bmd.rect,ba);
bmd.unlock();
}
} // public function BZReaction
} // public class BZReaction
// package