またフラクタルですw

シェルピンスキーのギャスケットはフラクタル図形の1種であり、自己相似的な無数の三角形からなる図形である。ポーランドの数学者ヴァツワフ・シェルピンスキにちなんで名づけられた。

これも有限の面積で無限の長さを持っています

※クリックでstart

Flash Player 10 にしてください

繰り返し回数は7回にしてます

拡大版
シェルピンスキーのギャスケット拡大版

というか配列の先頭を削除って効率悪すぎだよね・・・・w
連結リストとかキューとか作らないとなぁ・・・Javaにはデフォで入ってるんだけどなぁ
どこかにライブラリないかなぁ・・・?

getterとかはあえてつけてません

Triangle.as


package
{
	import flash.display.Sprite;
	import flash.geom.Point;

	public class Triangle extends Sprite
	{
		public var topP:Point;
		public var leftP:Point;
		public var rightP:Point;
		public function Triangle(topP:Point, leftP:Point, rightP:Point)
		{
			this.topP = topP;
			this.leftP = leftP;
			this.rightP = rightP;

			this.graphics.lineStyle(0, 0x000000);
			this.graphics.moveTo(topP.x, topP.y);
			this.graphics.lineTo(leftP.x, leftP.y);
			this.graphics.lineTo(rightP.x, rightP.y);
			this.graphics.lineTo(topP.x, topP.y);
			this.graphics.endFill();
		}

	}

}

SierpinskiGasket.as


package
{
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.display.Sprite;
	import flash.geom.Point;

	public class SierpinskiGasket extends Sprite
	{
		private const N:int = 7; //繰り返し回数
		private const W:int = 300;
		private const H:int = 300;
		private var lineLength:Number = 300; //三角形の一辺の長さ
		private var endP:Point; //終了ポイント
		private var count:int = 0; //繰り返し数カウント
		private var list:Array = [];
		public function SierpinskiGasket()
		{
			var topP:Point = new Point(lineLength * Math.cos( -Math.PI / 3),
										lineLength * Math.sin( -Math.PI / 3) + H - 20);
			var leftP:Point = new Point(0, H-20);
			var rightP:Point = new Point(W, H-20);
			var triangle:Triangle = new Triangle(topP, leftP, rightP);
			addChild(triangle);
			list.push(triangle);
			endP = rightP;
			lineLength /= 2;

			stage.addEventListener(MouseEvent.CLICK, onClickHandler);
		}

		private function onClickHandler(event:Event):void
		{
			stage.removeEventListener(MouseEvent.CLICK, onClickHandler);
			stage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
		}

		private function onEnterFrameHandler(event:Event):void
		{
			var parent:Triangle = list[0];
			list.splice(0, 1);
			removeChild(parent);
			var leftHalfP:Point = new Point(parent.leftP.x + lineLength * Math.cos( -Math.PI / 3),
											parent.leftP.y + lineLength * Math.sin( -Math.PI / 3));
			var rightHalfP:Point = new Point(parent.topP.x + lineLength * Math.cos(Math.PI / 3),
											parent.topP.y + lineLength * Math.sin(Math.PI / 3));
			var bottomHalfP:Point = new Point(parent.leftP.x + lineLength, parent.leftP.y);

			var topTriangle:Triangle = new Triangle(parent.topP, leftHalfP, rightHalfP);
			addChild(topTriangle);
			list.push(topTriangle);
			var leftTriangle:Triangle = new Triangle(leftHalfP, parent.leftP, bottomHalfP);
			addChild(leftTriangle);
			list.push(leftTriangle);
			var rightTriangle:Triangle = new Triangle(rightHalfP, bottomHalfP, parent.rightP);
			addChild(rightTriangle);
			list.push(rightTriangle);

			if (parent.rightP == endP)
			{
				lineLength /= 2;
				count++;
				trace(count);
				if (count == N)
				{
					stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
				}
			}
		}
	}
}
このエントリーを含むはてなブックマークはてなブックマーク - フラクタル~シェルピンスキーのギャスケット~ この記事をクリップ!Livedoorクリップ - フラクタル~シェルピンスキーのギャスケット~ BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This