トップページ > Flash入門 > グラフを描く(3)

フーリエ級数のグラフ

矩形波

フーリエ変換入門でいろいろ描いているグラフをFlashでも描いてみます。

package
{
    import flash.display.*;
    import flash.events.Event;
    import flash.events.TextEvent;
    import flash.text.*;
     
    //画面サイズと背景色,フレームレートを設定
    [SWF(width = "600", height = "300", frameRate = "60", backgroundColor = "0xffffcc")] 
     
    public class Main extends Sprite 
    {
                 
        //グラフ表示用スプライト
        public var sprite:Sprite = new Sprite();    
         
        //フーリエ級数演算反復回数
        public var N:int = 10;
         
        //main関数
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
         
        //コンストラクタ
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
 
            //とりあえずスプライトを表示
            addChild(sprite);
 
            //位相用の変数
            var pre_phase:Number = 0;
            var next_phase:Number = 0;
 
            //yの値用の変数
            var pre_y:int = 0;
            var next_y:int = 0;
             
            //振幅
            var amplitude:Number = 130;
             
            //オフセット
            var offset:Number = 150;
             
            //座標軸を描く
            sprite.graphics.lineStyle(2, 0x000000);
            sprite.graphics.moveTo(300, 0);
            sprite.graphics.lineTo(300, 300);
            sprite.graphics.moveTo(0, 150);
            sprite.graphics.lineTo(600, 150);
             
            //グラフの色は青
            sprite.graphics.lineStyle(2, 0x0000FF);
         
            for (var i:int = 0; i < 599; i++ )
            {
                pre_phase = Math.PI /   150  * i;
                next_phase = Math.PI /  150  * (i + 1);
                 
                //yの値を計算
                pre_y = -amplitude * fourier(pre_phase) + offset;
                next_y = -amplitude * fourier(next_phase) + offset;
                 
                //1点ずつ描画する
                sprite.graphics.moveTo(i, pre_y);
                sprite.graphics.lineTo(i+1, next_y);
            }
             
        }
         
        //フーリエ級数演算をする関数
        private function fourier(phase:Number):Number 
        {
            //計算用変数
            var temp:Number = 0;
             
            for (var i:int = 1; i < N; i++ )
            {
                temp +=  1 / (2 * (i-1) + 1) * Math.sin(phase * (2 * (i-1) + 1));
            }
             
            //計算結果を返す
            return temp;
        }   
    }
}

デルタ関数(くし関数)

package 
{
	import flash.display.*;
	import flash.events.Event;
	import flash.events.TextEvent;
	
    //画面サイズと背景色,フレームレートを設定
    [SWF(width = "600", height = "300", frameRate = "60", backgroundColor = "0xffffcc")] 
	
	public class Main extends Sprite 
	{
				
		//グラフ表示用スプライト
		public var sprite:Sprite = new Sprite();	
		
		//フーリエ級数演算反復回数
		public var N:int = 20;
		
		//main関数
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		//コンストラクタ
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point

			//とりあえずスプライトを表示
			addChild(sprite);

			//位相用の変数
			var pre_phase:Number = 0;
			var next_phase:Number = 0;

			//yの値用の変数
			var pre_y:int = 0;
			var next_y:int = 0;
			
			//振幅
			var amplitude:Number = 10;
			
			//オフセット
			var offset:Number = 250;
			
			//座標軸を描く
			sprite.graphics.lineStyle(2, 0x000000);
			sprite.graphics.moveTo(300, 0);
			sprite.graphics.lineTo(300, 300);
			sprite.graphics.moveTo(0, offset);
			sprite.graphics.lineTo(600, offset);
			
			//グラフの色は赤
			sprite.graphics.lineStyle(2, 0xFF0000);
		
			for (var i:int = 0; i < 599; i++ )
			{
				pre_phase = Math.PI /   50  * i;
				next_phase = Math.PI /  50  * (i + 1);
				
				//yの値を計算
				pre_y = -amplitude * fourier(pre_phase) + offset;
				next_y = -amplitude * fourier(next_phase) + offset;
				
				//1点ずつ描画する
				sprite.graphics.moveTo(i, pre_y);
				sprite.graphics.lineTo(i+1, next_y);
			}
			
		}
		
		//フーリエ級数演算をする関数
		private function fourier(phase:Number):Number 
		{
			//計算用変数
			var temp:Number = 0;
			
			for (var i:int = 1; i < N; i++ )
			{
				temp +=  Math.cos(phase * i);
			}
			
			temp += 0.5;
			
			//計算結果を返す
			return temp;
		}	
	}
}

三角波

package
{
    import flash.display.*;
    import flash.events.Event;
    import flash.events.TextEvent;
     
    //画面サイズと背景色,フレームレートを設定
    [SWF(width = "600", height = "300", frameRate = "60", backgroundColor = "0xffffcc")] 
     
    public class Main extends Sprite 
    {
                 
        //グラフ表示用スプライト
        public var sprite:Sprite = new Sprite();    
         
        //フーリエ級数演算反復回数
        public var N:int = 10;
         
        //main関数
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
         
        //コンストラクタ
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
 
            //とりあえずスプライトを表示
            addChild(sprite);
 
            //位相用の変数
            var pre_phase:Number = 0;
            var next_phase:Number = 0;
 
            //yの値用の変数
            var pre_y:int = 0;
            var next_y:int = 0;
             
            //振幅
            var amplitude:Number = 110;
             
            //オフセット
            var offset:Number = 150;
             
            //座標軸を描く
            sprite.graphics.lineStyle(2, 0x000000);
            sprite.graphics.moveTo(300, 0);
            sprite.graphics.lineTo(300, 300);
            sprite.graphics.moveTo(0, offset);
            sprite.graphics.lineTo(600, offset);
             
            //グラフの色は緑
            sprite.graphics.lineStyle(2, 0x00FF00);
         
            for (var i:int = 0; i < 599; i++ )
            {
                pre_phase = Math.PI /   50  * i;
                next_phase = Math.PI /  50  * (i + 1);
                 
                //yの値を計算
                pre_y = -amplitude * fourier(pre_phase) + offset;
                next_y = -amplitude * fourier(next_phase) + offset;
                 
                //1点ずつ描画する
                sprite.graphics.moveTo(i, pre_y);
                sprite.graphics.lineTo(i+1, next_y);
            }
             
        }
         
        //フーリエ級数演算をする関数
        private function fourier(phase:Number):Number 
        {
            //計算用変数
            var temp:Number = 0;
             
            for (var i:int = 1; i < N; i++ )
            {
                temp +=  1 / Math.pow(i,2) *Math.sin(0.5*Math.PI*i)*Math.sin(i*phase);
            }
             
            //計算結果を返す
            return temp;
        }   
    }
}



前へ 戻る