forked from: 再帰関数
再帰関数
何回呼ばれるかを記憶したり、呼ばれた回数によって分岐したりしてる。
再帰の一番最初の初期化ってこれでいいのかな。うまい方法あるのかな。
画面中央より左側をクリックすると、繰り返す数値を -10 します
画面中央より右側をクリックすると、繰り返す数値を +10 します
/**
* Copyright 9re ( http://wonderfl.net/user/9re )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/4jar
*/
// forked from cpu_t's 再帰関数
// 再帰関数
//
// 何回呼ばれるかを記憶したり、呼ばれた回数によって分岐したりしてる。
// 再帰の一番最初の初期化ってこれでいいのかな。うまい方法あるのかな。
//
// 画面中央より左側をクリックすると、繰り返す数値を -10 します
// 画面中央より右側をクリックすると、繰り返す数値を +10 します
//
package {
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
[SWF(width = 465, height = 465, backgroundColor = 0xFFFFFF, frameRate = 60)]
public class FlashTest extends Sprite {
private var tf:TextField;
private var g:Graphics;
public function FlashTest() {
var sp:Sprite = new Sprite;
sp.y = 465 * .5;
sp.x = (465 - linelength * 2) * 0.5;
g = sp.graphics;
stage.addChild(tf = new TextField());
addChild(sp);
startDrawing();
stage.addEventListener(MouseEvent.MOUSE_DOWN, md);
}
private var lineNum:int = 100;
private function md(e:MouseEvent):void
{
if (mouseX < 465 * .5) lineNum -= 10;
else lineNum += 10;
if (lineNum <= 0) lineNum = 10;
startDrawing();
}
private function startDrawing():void {
tf.text = lineNum + '';
g.clear();
g.lineStyle( -1, 0);
g.moveTo(0, 0);
draw(lineNum + 1, 0, 0, 0);
}
private const linelength:Number = 200;
private var firstn:int = -1;
private function draw(n:int, px:Number, py:Number, ang:Number):void
{
if (n < 0)
{
firstn = -1;
return;
}
else if (firstn == -1) firstn = n;
g.lineTo(px, py);
draw(
--n,
px + Math.cos(ang) * linelength,
py + Math.sin(ang) * linelength,
n % 2 == 0 ?
ang + 180 / firstn * (firstn - n) * Math.PI / 180 :
ang + (180 - 180 / firstn * (firstn - n)) * Math.PI / 180
);
}
}
}