またフラクタルです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);
}
}
}
}
}
