− スピログラフ −
    下部のソースコードは改変自由です。描画を速くするため、ビットマップを使用しています。
//****************************************************************************************
// ファイル名:SpiroGraph.as(スピログラフ)
// Flex3でコンパイルして swf ファイルを作るための ActionScript3 によるコード
// コンパイルは mxmlc -default-size 500 500 -default-frame-rate=30 -default-background-color=0x000000 SpiroGraph.as
// All rights reserved. Copyright (C) 2008 YokahiYokatoki
//****************************************************************************************

package
{
	import flash.display.*;
	import flash.events.TimerEvent;
	import flash.utils.Timer;

	//----------------------------------------------------------------
	public class SpiroGraph extends Sprite
	{
		private var num:int=0;
		private var NT:int=50000;
		private var px:Array=new Array();
		private var py:Array=new Array();

		private var bitmapData:BitmapData;
		private var bitmap:Bitmap;

		//------------------------------------------------------------
		public function SpiroGraph()
		{
			for(var j:int=0; j<4; j++)
			{
				px[j]=new Array();
				py[j]=new Array();
			}

			num=0;
			var myTimer0:Timer=new Timer(3000, 30); //(ミリ秒、回数)
			myTimer0.addEventListener(TimerEvent.TIMER, onTimer0);
			myTimer0.start();
		}

		//----------------------------------------------------------------
		public function setData():void
		{
			const PI:Number=Math.PI; // 円周率
			var R0:Number=110.0; // 外円の半径
			var r:Number=0; // 内円の半径
			var a:Number=0; // 軌跡を描く点の半径
			var s:Number=0;
			for(var i:int=0; i< NT; i++){px[num][i]=0; py[num][i]=0;} // 初期化

			var pat:Number=Math.floor(Math.random()*2);
			if(pat==0)
			{
				r=0.001*(300+Math.floor(Math.random()*699))*R0;
				a=0.1*(8+Math.random()*10)*r;
				s=0.005;
			}
			else if(pat==1)
			{
				r=0.05*(2+Math.random()*10)*R0;
				a=0.05*(5+Math.random()*10)*r;
				s=0.002;
			}
			for(var t:int=0; t< NT; t++)
			{
				px[num][t]=(R0-r)*Math.cos(PI*s*t)+a*Math.cos(PI*s*(R0/r-1)*t);
				py[num][t]=-(R0-r)*Math.sin(PI*s*t)+a*Math.sin(PI*s*(R0/r-1)*t);
				if(t>1 && px[num][t]==R0-r+a && py[num][t]==0){break;} // 始点に戻ったら終了
			}
		}

		//------------------------------------------------------------
		public function onTimer0(event:TimerEvent):void
		{
			setData();
			var myTimer1:Timer=new Timer(1, 10); // (ミリ秒、回数)
			myTimer1.addEventListener(TimerEvent.TIMER, onTimer1);
			myTimer1.start();
			num++;
			if(num>=4)
			{
				num=0;
				bitmapData.dispose(); // ビットマップのバッファを開放する
			}
		}

		//------------------------------------------------------------
		public function onTimer1(event:TimerEvent):void
		{
			for(var t:int=0; t< NT; t++)
			{
				px[num][t]*=1.08;
				py[num][t]*=1.08;
			}
			repaint();
		}

		//----------------------------------------------------------------
		public function repaint():void
		{
			bitmapData=new BitmapData(500, 500, false, 0x000000);
			bitmap=new Bitmap(bitmapData);
			stage.addChild(bitmap);

			var X:int=250; // 中心座標
			var Y:int=250;

			const PI:Number=Math.PI; // 円周率
			var cl0:Number=0;
			var cl1:Number=0;
			var cl2:Number=0;
			var cl00:String;
			var cl11:String;
			var cl22:String;
			var cl:int=0;
			var xx:int=0;
			var yy:int=0;

			var rnd:int=Math.floor(Math.random()*2);
			if(rnd==0)
			{
				var rnd0:int=1+Math.floor(Math.random()*3);
				var rnd1:int=1+Math.floor(Math.random()*3);
				var rnd2:int=1+Math.floor(Math.random()*3);
				for(var i:int=255; i>=0; i--)
				{
					cl0=Math.floor((255-i)/rnd0);
					cl1=Math.floor((255-i)/rnd1);
					cl2=Math.floor((255-i)/rnd2);
					if(cl0<16){cl00='0'+cl0.toString(16);} else {cl00=cl0.toString(16);}
					if(cl1<16){cl11='0'+cl1.toString(16);} else {cl11=cl1.toString(16);}
					if(cl2<16){cl22='0'+cl2.toString(16);} else {cl22=cl2.toString(16);}
					cl=parseInt('0x'+cl00+cl11+cl22, 16);
					for(var j:int=0; j<360; j++)
					{
						xx=X+Math.floor(i*Math.cos(PI/180*j));
						yy=Y+Math.floor(i*Math.sin(PI/180*j));
						bitmapData.setPixel(xx, yy, cl);
					}
				}
			}
			for(var k:int=0; k<4; k++)
			{
				cl0=40+Math.floor(Math.random()*215);
				cl1=40+Math.floor(Math.random()*215);
				cl2=40+Math.floor(Math.random()*215);
				if(cl0<16){cl00='0'+cl0.toString(16);} else {cl00=cl0.toString(16);}
				if(cl1<16){cl11='0'+cl1.toString(16);} else {cl11=cl1.toString(16);}
				if(cl2<16){cl22='0'+cl2.toString(16);} else {cl22=cl2.toString(16);}
				cl=parseInt('0x'+cl00+cl11+cl22, 16);
				for(var l:int=0; l< NT; l++)
				{
					if(px[k][l]==0 && py[k][l]==0){break;}
					xx=X+Math.floor(px[k][l]);
					yy=Y+Math.floor(py[k][l]);
					bitmapData.setPixel(xx, yy, cl);
				}
			}
		}
	}
}

Copyright(C) 2008 YokahiYokatoki