In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

ベロウソフ・ジャボチンスキー反応 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