//****************************************************************************************
// ファイル名: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);
}
}
}
}
}
|