トップページ > Flash入門 > 矩形波フーリエ級数flash(1)

矩形波フーリエ級数

フーリエ級数が収束する様子を確認

ソースコード: Main.as

※画像ファイル“equation.png”が必要です。

//************************************************************************
//2012/03/22
//矩形波フーリエ級数表示flash
//Proggramed by Koten-Kairoya
//************************************************************************

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.display.Bitmap;
	import flash.text.*;
	
    //画面サイズと背景色,フレームレートを設定
    [SWF(width = "550", height = "450", frameRate = "30", backgroundColor = "0xffffcc")] 
     
	public class Main extends Sprite 
	{
		//数式の画像ファイルを読み込む
		[Embed(source = "./equation.png")]
		public var eq_Img:Class;
		public var eq_img:Bitmap = new eq_Img();
		
		//数式表示用スプライト
		public var eq_sp:Sprite = new Sprite();
				
		//グラフ表示用スプライト
		public var canvas:RectCanvas = new RectCanvas(500, 300);
		
		//テキスト表示用スプライト
		public var num_text:TextField = new TextField();
		//テキストフォーマット
		public var format:TextFormat = new TextFormat("Arial", 24, 0xFF0000);
		
		//スライドバー
		public var slidebar:vSlideBar = new vSlideBar(50,425,1);
		
		//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(canvas);
			
			//スライドバーを表示
			addChild(slidebar);
			slidebar.x = 500;
			
			//テキストを表示
			num_text.defaultTextFormat = format;
			num_text.text = "1";
			num_text.autoSize = TextFieldAutoSize.CENTER
			num_text.selectable = false;
			addChild(num_text);
			num_text.x = 100;
			num_text.y = 300;
	
			//数式を表示
			eq_sp.addChild(eq_img);
			addChild(eq_sp);
			eq_sp.x = 5;
			eq_sp.y = 305;
			
			//イベントリスナ登録
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		//フレームごとに,slidebarの値を呼んで,ボールを適当に拡大・縮小
		private function onEnterFrame(e:Event):void
		{
			//スライドバーの値をcanvasの値に移す
			canvas.num = slidebar.value / 10 + 1;
			//グラフを消す
			canvas.clear();
			//フーリエ級数を計算し,再描画
			canvas.makegraph();
			//画面上の数式テキストを更新
			num_text.text = canvas.num.toString();
		}
	}
}

ソースコード: RectCanvas.as

フーリエ級数のグラフを表示するスプライトです。

package  
{
	import flash.display.Sprite;

	public class RectCanvas extends Sprite 
	{
		//寸法
		public var Width:int;
		public var Height:int;
		//背景色
		public var backgroundColor:int = 0xffffcc;
		//級数の項数
		public var num:int = 1;
		//データ
		public var data:Array = new Array();	
		
		//コンストラクタ
		public function RectCanvas(width:int, height:int ) 
		{
			//寸法を保存
			Width = width;
			Height = height;
			
			//クリア
			clear();
			
			//グラフ描画しておく
			makegraph();
		}
		
		public function clear():void
		{
			//画面クリア
			this.graphics.clear();
			
			//背景を色付け
			this.graphics.beginFill(backgroundColor, 1);
			this.graphics.drawRect(0, 0, Width, Height);
			this.graphics.endFill();
			
			//軸を描く
			this.graphics.lineStyle(2, 0x000000);
			this.graphics.moveTo(0, Height/2);
			this.graphics.lineTo(Width, Height / 2);
			this.graphics.moveTo(Width / 2, 0);
			this.graphics.lineTo(Width / 2, Height);
			
			//データをクリア
			for (var i:int = 0; i < Width; i++ )
			{
				data[i] = 0;
			}
		}
		
		public function makegraph():void
		{
			//矩形波のフーリエ級数を作る
			for (var i:int = 0; i < Width; i++ )
			{
				for (var j:int = 1; j <= num; j++ )
				{
					data[i] += 1 / (2 * j - 1) * Math.sin((2*j-1)*4*Math.PI/Width*i + Math.PI);
				}
			}
			
			//グラフ描画
			this.graphics.lineStyle(2,0x0000ff);
			for (i = 0; i < Width-1; i++ )
			{
				this.graphics.moveTo(i, -150*data[i] + Height / 2);
				this.graphics.lineTo(i + 1, -150*data[i + 1] + Height / 2);
			}	
		}	
	}
}

ソースコード: vSlideBar.as

※画像ファイル“OrangeBar.png”が必要です。

//************************************************************************
//2012/03/22
//縦方向スライドバークラス
//Proggramed by Koten-Kairoya
//************************************************************************

package
{
    import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.Bitmap;
    import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.*;
	
    public class vSlideBar extends Sprite 
    {
		
		//画像ファイルを読み込む
		[Embed(source = "./OrangeBar.png")]
		public var bar_Img:Class;
		public var bar_img:Bitmap = new bar_Img();

		//寸法
		public var Width:int;
		public var Height:int;
		//バー描画用スプライト
		public var bar:Sprite = new Sprite();
		//スライドバーの値
		public var value:int = 0;
		//ドラッグ中フラグ
		public var click_flag:Boolean = false;
		//座標保存用
		public var pre_y:int = 0;
		public var delta_y:int = 0;
		//背景色
		public var backgroundColor:int = 0xffe4b5;
		//軸の色
		public var axisColor:int = 0x3f3f3f;

		//================================================================         
        //コンストラクタ。引数は,横方向寸法,スライドバーの最大値初期位置。
		public function vSlideBar(width:int, height:int, ini_pos:int) 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point

			//バーを用意
			bar.addChild(bar_img);
			
			//寸法を保存。縦の寸法はバーの寸法を加えた値
			this.Width = width;
			this.Height = bar.height + height;

			//矩形描画
			this.graphics.beginFill(backgroundColor, 1);
			this.graphics.drawRect(0, 0, Width,  Height);
			this.graphics.endFill();
			
			//スライドの軸を描画
			this.graphics.lineStyle(2, axisColor);
			this.graphics.moveTo(Width / 2, 0);
			this.graphics.lineTo(Width/2,  Height);
			
			//バーを表示
			addChild(bar);
			
			//バーの初期位置を設定
			bar.x = Width/2 - bar.width/2
			bar.y = Height - bar.height - ini_pos;
			
			//初期値を設定
			value = ini_pos;
			
			//イベントリスナを登録
			bar.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			bar.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			bar.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
			bar.addEventListener(MouseEvent.ROLL_OUT, onMouseRollout);
			this.addEventListener(MouseEvent.ROLL_OUT, onMouseRollout );
        }

		//バーの上でマウス左ボタンが押されると呼ばれる関数
		private function onMouseDown(e:MouseEvent):void
		{
			//フラグを立てて,クリック中の状態にする
			click_flag = true;
			//ドラッグ処理開始
			bar.startDrag();
		}
		
		//バーの上でマウス左ボタンが離された時に呼ばれる関数
		private function onMouseUp(e:MouseEvent):void
		{
			//フラグを下げて,クリック中の状態をやめる
			click_flag = false;
			//ドラッグ処理終了
			bar.stopDrag();
		}
		
		//マウスが動いたときに呼ばれる関数
		private function onMouseMove(e:MouseEvent):void
		{
			//クリック中の場合は処理を行う
			if (click_flag == true)
			{
				//ドラッグを一度やめる
				bar.stopDrag();
				//横方向には動かさない。常に中心。
				bar.x = width / 2 - bar.width / 2;
				
				//バーがスライドバーエリア外に出た場合は,もとに戻す
				if(bar.y+delta_y <=0 )
				{
					bar.y = 0;
				}
				if (bar.y  >= Height - bar.height)
				{
					bar.y = Height - bar.height;
				}
				
				//ドラッグ処理再開
				bar.startDrag();
				//valueの値を更新
				value = Height - bar.height - bar.y;
			}
		}

		//スライドバーの領域からマウスが離れた場合
		private function onMouseRollout(e:MouseEvent):void
		{
			//クリック中フラグを下げる
			click_flag = false;
			//ドラッグ終了
			bar.stopDrag();
			//バーの横ズレを修正
			bar.x = Width/2 - bar.width/2;
		}
	}
}



戻る  次へ