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