トップページ > 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; } } }