昨日のローレンツ・アトラクタが時限式ブラクラだと言われたので軽くしてみました
でも前の記事は修正しないよ^p^

重くなる原因はベクターを描画し続けているからです
なので20秒ごとにbitmapにうつしてベクターを全消し を繰り返すようにしてみました
でもbitmapにしたら線がつぶれて拡大したとき細かい線が全然見れなくなる
拡大して見るのが好きだったのにー・・・w
ベクターのままで重くならないようにするにはどうすればいいんだろう・・・
誰か教えてくだしぁ

※クリックでstart/stop

Flash Player 10 にしてください

ソース 関係ないとこもちょこちょこ変えててごめんなさいw


package {
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Stage;
	import flash.display.StageScaleMode;
	import flash.utils.Timer;

	public class Lorenz extends Sprite{
		private const P:Number = 10;
		private const R:Number = 28;
		private const B:Number = 8 / 3;
		private const D:Number = 0.01;

		private const SCALE:Number = 5;
		private const CENTER_X:Number = 150;
		private const CENTER_Y:Number = 150;

		private var _x:Number = 1;
		private var _y:Number = 1;
		private var _z:Number = 1;

		private var dx:Number;
		private var dy:Number;
		private var dz:Number;

		private var tmpX:Number;
		private var tmpY:Number;
		private var tmpZ:Number;

		private var map:Sprite;
		private const color:uint = 0xa4cdf7;
		private var circle:Sprite;
		private var isRunning:Boolean = false;

		private var bitmapData:BitmapData;
		private var bitmap:Bitmap

		private var timer:Timer;

		public function Lorenz() {
			bitmapData = new BitmapData(CENTER_X * 2, CENTER_Y * 2);
			bitmap = new Bitmap(bitmapData);
			stage.addChild(bitmap);

			map = new Sprite();
			map.graphics.lineStyle(0, color);
			map.graphics.moveTo(CENTER_X, CENTER_Y);
			stage.addChild(map);

			circle = new Sprite();
			circle.x = CENTER_X;
			circle.y = CENTER_Y;
			circle.graphics.beginFill(0x23dc5f);
			circle.graphics.drawCircle(0, 0, 5);
			circle.graphics.endFill();
			stage.addChild(circle);

			stage.addEventListener(MouseEvent.CLICK, onClickHandler);

			timer = new Timer(20000);
			timer.addEventListener(TimerEvent.TIMER, onTick);
			timer.start();
		}

		private function onClickHandler(event:MouseEvent):void {
			if (isRunning) {
				stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
				isRunning = false;
			} else {
				stage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
				isRunning = true;
			}
		}

		private function onEnterFrameHandler(event:Event):void {
			dx = P * (_y - _x);
			dy = _x * (R - _z) - _y;
			dz = _x * _y - B * _z;

			_x += D * dx;
			_y += D * dy;
			_z += D * dz;

			tmpX = _x * SCALE + CENTER_X;
			tmpY = _y * SCALE + CENTER_Y;
			tmpZ = _z * SCALE;
			map.graphics.lineTo(tmpX, tmpY);
			circle.x = tmpX;
			circle.y = tmpY;
		}

		private function onTick(event:TimerEvent):void{
			bitmapData.draw(map);
			map.graphics.clear();
			map.graphics.lineStyle(0, color);
			map.graphics.moveTo(circle.x, circle.y);
		}
	}
}
このエントリーを含むはてなブックマークはてなブックマーク - ローレンツ・アトラクタ(2) この記事をクリップ!Livedoorクリップ - ローレンツ・アトラクタ(2) BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This