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

●で作る反応拡散系

ビットマップ上のランダムな点を選択し、
その色が一定の閾値より濃いかどうかを調べ、
濃い場所には、大きくて薄い●と、小さくて濃い●の両方を書きます。
これを繰り返すと縞状、網目状、迷路状、鱗状、斑状、水玉状などの
多様なパターンが現れます。
集まろうとする局所的な強い力と、拡散しようとする大域的な弱い力が
うまい具合に作用しあった結果と思われます。
Get Adobe Flash player
by kefir 07 Jan 2009
    Embed
// ビットマップ上のランダムな点を選択し、
// その色が一定の閾値より濃いかどうかを調べ、
// 濃い場所には、大きくて薄い●と、小さくて濃い●の両方を書きます。
// これを繰り返すと縞状、網目状、迷路状、鱗状、斑状、水玉状などの
// 多様なパターンが現れます。
// 集まろうとする局所的な強い力と、拡散しようとする大域的な弱い力が
// うまい具合に作用しあった結果と思われます。

package {
  import flash.display.*
  import flash.events.*
  import flash.geom.*
  import flash.text.*
  
  [SWF(width=300, height=300, backgroundColor=0x000000)]
  public class ReactDiffuse extends Sprite
  {
    public function ReactDiffuse():void {
        var bmd:BitmapData = new BitmapData( stage.stageWidth, stage.stageHeight, false, 0x00ffffff );
        
        // このあたりの数値を変えるとパターンが変化します
        var threshold:Number = 128;
        var rad_inner:Number = 3;
        var rad_outer:Number = 6;
        
        addChild( new Bitmap(bmd) );

        var tf:TextField = new TextField();
        
        // outer circle
        tf.htmlText = '<font size="' + rad_outer * 2 + '">●</font>';
        tf.textColor = 0xffffff;
        var circle_outer:BitmapData = new BitmapData( 36, 36, true, 0x00000000 );
        circle_outer.draw(tf);
        tf.textColor = 0x080808;
        var circle_outer_alpha:BitmapData = new BitmapData( 36, 36, true, 0x00000000 );
        circle_outer_alpha.draw(tf);
        circle_outer_alpha.copyChannel( circle_outer_alpha, circle_outer_alpha.rect, new Point(0, 0), 1, 8 );
        
        // inner circle
        tf.htmlText = '<font size="' + rad_inner * 2 + '">●</font>';
        var circle_inner:BitmapData = new BitmapData( 36, 36, true, 0x00000000 );
        circle_inner.draw(tf);
        tf.textColor = 0x202020;
        var circle_inner_alpha:BitmapData = new BitmapData( 36, 36, true, 0x00000000 );
        circle_inner_alpha.draw(tf);
        circle_inner_alpha.copyChannel( circle_inner_alpha, circle_inner_alpha.rect, new Point(0, 0), 1, 8 );
        
        bmd.noise(0, 0, 0xFF, 0, true);

        stage.addEventListener( Event.ENTER_FRAME, function( e:Event ):void {
      	if ( Math.random() > 0.2 ) return; // CPU対策
        for( var i:Number = 0; i < stage.stageWidth; ++ i ) {
          for( var j:Number = 0; j < stage.stageHeight; ++ j ) {
            if ( Math.random() > 0.9 /* ランダムな点を選択 */ ) {
              if( ( bmd.getPixel(i, j) & 0xff ) < threshold ) {
                bmd.copyPixels(
                  circle_outer, 
                  circle_outer.rect, 
                  new Point(i-2 - rad_outer, j-1 - rad_outer), 
                  circle_outer_alpha, 
                  new Point(0, 0) );
                bmd.copyPixels(
                  circle_inner, 
                  circle_inner.rect, 
                  new Point(i-2 - rad_inner, j-1 - rad_inner), 
                  circle_inner_alpha, 
                  new Point(0, 0) );
              }
            }
          }
        }
      } )
    } // public function ReactDiffuse
  } // public class ReactDiffuse
} // package