ブラウン運動
Posted by ton in AS3, Flash, 作ってみた on 06 5th, 2008| icon3No Comments »

ブラウン運動( – うんどう、Brownian motion)とは、1827年(1828年という記述もあり)、ロバート・ブラウンが、花粉が水の浸透圧で破裂し水中に流失し浮遊した微粒子を顕微鏡下で観察中に発見した現象。液体中のような媒質中(媒質としては気体、固体もあり得る)に浮遊する微粒子(例:コロイド)が、不規則(ランダム)に運動する現象である。  ※Wikipediaより

作ってみました
本当は温度や粒子の大きさが動きに関係してくるのですが簡易のため省略しています

もっと粒子の大きさを小さくして数を増やしたらすごい気持ち悪いことになったけどめちゃくちゃ重いのでここに載せるのはやめましたw
興味がある人はぜひ色々いじって試してみてくださいw

※クリックでstart

Flash Player 10 にしてください

Dot.as


package {
    import flash.display.Sprite;
    public class Dot extends Sprite{
		public var vx:Number;
		public var vy:Number;
		public var color:uint;
		function Dot(color:uint) {
			this.color = color;
			this.graphics.beginFill(color);
			this.graphics.drawCircle(0, 0, 1);
			this.graphics.endFill();
		}
	}
}

BrownianMotion.as


package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	public class BrownianMotion extends Sprite {

		private const N:int = 1000;// 粒子の数
		private const F:Number = 0.95;//抵抗
		private const MAX_R:int = 50;//粒子を初期配置する円の最大半径
		private const X:Number = 0.2;//粒子の最大移動量
		private const W:int = 300;//stageの幅
		private const H:int = 300;//stageの高さ

		private var list:Array;

		function BrownianMotion() {
			list = new Array(N);
			for (var i:int = 0; i < N; i++) {
				var mc:Dot = new Dot(Math.random()*0xffffff);
				var r:Number = Math.sqrt(Math.random()) * MAX_R;
				var angle:Number = Math.random() * (2 * Math.PI);
				mc.x = W/2 + Math.cos(angle) * r;
				mc.y = H/2 + Math.sin(angle) * r;
				mc.vx = 0;
				mc.vy = 0;
				stage.addChild(mc);
				list[i] = mc;
			}
			addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}
		private function onEnterFrameHandler(event:Event):void {
			for (var i:int = 0; i < N; i++) {
				var mc:Dot = list[i];
				mc.vx += Math.random() * X * 2 - X;
				mc.vy += Math.random() * X * 2 - X;
				mc.vx *= F;
				mc.vy *= F;

				mc.x += mc.vx;
				mc.y += mc.vy;

				if (mc.x < 0) {
					mc.x = W;
				} else if (mc.x > W) {
					mc.x = 0;
				}
				if (mc.y < 0) {
					mc.y = H;
				} else if (mc.y > H) {
					mc.y = 0;
				}
			}
		}
	}
}
このエントリーを含むはてなブックマークはてなブックマーク - ブラウン運動 この記事をクリップ!Livedoorクリップ - ブラウン運動 BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This