前言撤回日記

Peter De Jong Attractor with AS3.0

090411peterdejong.jpg
ジワジワと描画されます。停止・再描画は画面クリック。


なんかあいかわらず書くこともないので今さら感あふれるエントリーでお茶を濁す。

昨年、FlashをCS4の販売直前にCS3にアップデートした。我ながらアホかと思うものの目算が外れただけで何の考えもなしにそうしたワケではない。他人様にはどーでもいい話であるが。

で、実際にはアップデート前からさして不満はなかったのだけれども、ActionScript3.0もそろそろやっとかないとキャッチアップできなくなる、という危機感から購入してみたという。Flexなどやってられん。

その後しばらく時間を投資して多少は慣れてきたので、以前にActionScript2.0で作ってココに載せたPeter De Jongアトラクタをプロットする作例を3.0で書き直したモノを載っけておきます。

今回はコードと.Flaファイルもさらしものに。

サンプル(.zip)ファイル


var p:Point = new Point();
var mtrx:Matrix = new Matrix();
var _x:Number, _y:Number, dx:Number, dy:Number, a:Number, b:Number, c:Number, d:Number;
_x = _y = 1;
dx = dy = 0;
var stageW:uint = stage.stageWidth;
var stageH:uint = stage.stageHeight;
var step:uint = 10000;//一度に描くドットの数
var flag:Boolean = true;
var eraser:Rectangle = new Rectangle(0, 0, stageW, stageH);//消しゴム
var bgColor:uint = 0x00000000;
var bmd:BitmapData = new BitmapData(stageW, stageH, false, bgColor);
var bm:Bitmap = new Bitmap(bmd);

addChild(bm);

//インク
var point_mc:Shape = new Shape();
point_mc.graphics.beginFill(0xFFFFFF, 0.1);
point_mc.graphics.drawRect(0, 0, 1, 1);

//BitmapData上のピクセルにインクを置く
function plot(m):void {
var m = m;
bmd.draw(point_mc, m);
}
//BitmapDataをクリア
function clearBitmapData() {
bmd.fillRect(eraser, bgColor);
}

//初期値をランダムでセット
//(これだとカオスが発生するとは限らないが……)
function init():void {
clearBitmapData();
a = (Math.floor(Math.random()*100))*0.1-2.5;
b = (Math.floor(Math.random()*100))*0.1-2.5;
c = (Math.floor(Math.random()*100))*0.1-2.5;
d = (Math.floor(Math.random()*100))*0.1-2.5;
}

//Peter De Jong アトラクタを書く
function makePeterDeJong(e:Event):void {
for (var i:uint = 0; i< = step; i++) {
_x = Math.sin(a * dy) - Math.cos(b * dx);
_y = Math.sin(c * dx) - Math.cos(d * dy);
dx = _x;
dy = _y;
mtrx.tx = (stageW/4) * _x + stageW/2;
mtrx.ty = (stageH/4) * _y + stageH/2;
plot(mtrx);
}
}

//マウスクリックで描画開始・停止
function action(e:MouseEvent):void {
if(flag){
flag = false;
init();
addEventListener(Event.ENTER_FRAME, makePeterDeJong);
} else {
flag = true;
removeEventListener(Event.ENTER_FRAME, makePeterDeJong);
}
}

//描画
action(null);
flag = false;

stage.addEventListener(MouseEvent.CLICK, action);


前のバージョンではプロットの際にいちいちlineTo()していたのでオブジェクトがどんどん増加していた。
そのため処理が遅くなって負荷も向上したため数万プロットで処理を停止するようにしていたが、今回はBitmapData上に描いているのでいつまで実行させてもパフォーマンス落ちないはず。

個人的にはステージサイズを大きくしてプロットしたあと画面をキャプチャし、そこからPhotoshopブラシを作るとかして遊んでます。

Copyright © 2004 elbro.net