再帰関数
再帰関数
何回呼ばれるかを記憶したり、呼ばれた回数によって分岐したりしてる。
再帰の一番最初の初期化ってこれでいいのかな。うまい方法あるのかな。
画面中央より左側をクリックすると、繰り返す数値を -10 します
画面中央より右側をクリックすると、繰り返す数値を +10 します
/**
* Copyright cpu_t ( http://wonderfl.net/user/cpu_t )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/bSEE
*/
// 再帰関数
//
// 何回呼ばれるかを記憶したり、呼ばれた回数によって分岐したりしてる。
// 再帰の一番最初の初期化ってこれでいいのかな。うまい方法あるのかな。
//
// 画面中央より左側をクリックすると、繰り返す数値を -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() {
this.x = this.y = 465 * .5;
g = this.graphics;
stage.addChild(tf = new TextField());
tf.text = "100";
g.lineStyle( -1, 0);
g.moveTo(0, 0);
draw(100, 0, 0, 0);
stage.addEventListener(MouseEvent.MOUSE_DOWN, md);
}
private var lineNum:int = 100;
private function md(e:MouseEvent):void
{
if (mouseX < 0) lineNum -= 10;
else lineNum += 10;
if (lineNum <= 0) lineNum = 10;
tf.text = lineNum.toString();
g.clear();
g.lineStyle( -1, 0);
g.moveTo(0, 0);
draw(lineNum, 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
);
}
}
}