Frocessing勉強中(フラクタル)
FrocessingWork3
@author naoto koshikawa
/**
* Copyright naoto5959 ( http://wonderfl.net/user/naoto5959 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/q5XK
*/
package
{
import flash.events.Event;
import frocessing.display.*;
import net.user1.utils.getRandInt;
[SWF(width=465,height=465,backgroundColor=0x000000, frameRate=12)]
/**
* FrocessingWork3
* @author naoto koshikawa
*/
public class FrocessingWork3 extends F5MovieClip2D
{
//----------------------------------------------------------------------
// static properties
//----------------------------------------------------------------------
/**
* 三角形は三辺なので3は固定
*/
private static const TRIANGLE:int = 3;
//----------------------------------------------------------------------
// properties
//----------------------------------------------------------------------
/**
* 正三角形は1:2:ルート3の三角形を
* 2つくっつけた図形なのでそれらの辺の長さを定義
*/
private var side1:Number;
private var side2:Number;
private var route3:Number;
//----------------------------------------------------------------------
// methods
//----------------------------------------------------------------------
/**
* コンストラクタ
*/
public function FrocessingWork3()
{
}
/**
* 再帰する前の準備
* @param event
*/
public function draw():void
{
var distanceX:Number = mouseX - stage.stageWidth / 2;
var distanceY:Number = mouseY - stage.stageHeight / 2;
var sideSize:Number = Math.sqrt(distanceX * distanceX + distanceY * distanceY) * 2;
var angle:Number = Math.atan2(distanceY, distanceX);
// 1:2:ルート3のうち比率2を求める
side2 = sideSize;
// 1:2:ルート3のうち比率1をを求める
side1 = side2 / 2;
// 1:2:ルート3のうち比率ルート3を求める
route3 = side1 * Math.sqrt(3);
colorMode(HSV, 12, 30, 1);
noFill();
translate(stage.stageWidth / 2, stage.stageHeight / 2 + route3 / 6);
rotate(angle);
// 再帰関数実行
var max:Number = int(sideSize / 100);
if (5 < max) max = 5;
recursiveDraw(2 + max);
}
/**
*
* @param recursionLevel 残りの再帰数
*/
private function recursiveDraw(recursionCount:int):void
{
if (recursionCount-- <= 0) return;
// スケールを半分にする
scale(0.5);
for (var i:int = 0; i < TRIANGLE; i++)
{
// 現在のキャンバスの状態を記憶する
pushMatrix();
// 中心点を三角形の中心点分移動
translate(0, - route3 * (2/ 3));
// 三角形は上の点、下の右の点、下の左の点、の順で描画
stroke(getRandInt(1,12), 10, 1);
triangle(0, -route3 * (2/3), side1, route3 / 3, -side1, route3 / 3);
// 再帰関数の実行
recursiveDraw(recursionCount);
// キャンバスの状態を復元する
popMatrix();
rotate(2 * Math.PI / TRIANGLE);
}
}
}
}