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