/** * Fourier Series Demo * Written by Kazuki Maeda * Date: Dec. 27, 2009 */ import mx.core.*; import mx.controls.*; import mx.events.*; // xrange=[lx:ux], yrange=[ly:uy] private const lx:Number = -2; private const ux:Number = 2; private const ly:Number = 1.5; private const uy:Number = -1.5; // axis settings private const axisColor:uint = 0x000000; private const axisWeight:uint = 0; // plot settings private const plotWeight:uint = 2; private const plotSampling:Number = 0.001; private const plotColor:uint = 0xFF0000; private var n:int; // objects private var rootCanvas:UIComponent = new UIComponent(); private var axis:Shape = new Shape(); private var plotLine:Shape = new Shape(); private function init():void { canvas.addChild(rootCanvas); rootCanvas.addChild(axis); rootCanvas.addChild(plotLine); nSlider.addEventListener(SliderEvent.CHANGE, replot); selectWave.addEventListener(ListEvent.CHANGE, replot); drawAxis(); plot(); } private function plot():void { n = nSlider.value; nText.text = "n=" + n.toString(); var plotFunction:Function; switch(selectWave.value){ case "Triangle": plotFunction = triangle; break; case "Square": plotFunction = square; break; case "Sawtooth": plotFunction = sawtooth; break; } plotLine.graphics.clear(); plotLine.graphics.lineStyle(plotWeight, plotColor, 1, false, "normal", CapsStyle.NONE); plotLine.graphics.moveTo(transformX(lx), transformY(plotFunction(lx))); for(var x:Number = lx + plotSampling; x <= ux; x += plotSampling){ plotLine.graphics.lineTo(transformX(x), transformY(plotFunction(x))); } } private function triangle(t:Number):Number{ var tmp:Number = 0; for(var k:uint = 1; k <= n; ++k) tmp += Math.sin((2*k-1)*Math.PI/2)*Math.sin((2*k-1)*Math.PI*t)/((2*k-1)*(2*k-1)); return tmp * 8 / (Math.PI*Math.PI); } private function square(t:Number):Number{ var tmp:Number = 0; for(var k:uint = 1; k <= n; ++k) tmp += Math.sin((2*k-1)*Math.PI*t)/(2*k-1); return tmp * 4 / Math.PI; } private function sawtooth(t:Number):Number{ var tmp:Number = 0; for(var k:uint = 1; k <= n; ++k) tmp += Math.sin(k*Math.PI*t)/k; return tmp * 2 / Math.PI; } private function drawAxis():void { axis.graphics.lineStyle(axisWeight, axisColor, 1, false, "normal", CapsStyle.NONE); axis.graphics.moveTo(transformX(lx), transformY(ly)); axis.graphics.lineTo(transformX(lx), transformY(uy)); axis.graphics.moveTo(transformX(ux), transformY(ly)); axis.graphics.lineTo(transformX(ux), transformY(uy)); axis.graphics.moveTo(transformX(lx), transformY(0)); axis.graphics.lineTo(transformX(ux), transformY(0)); axis.graphics.moveTo(transformX(lx), transformY(ly)); axis.graphics.lineTo(transformX(ux), transformY(ly)); axis.graphics.moveTo(transformX(lx), transformY(uy)); axis.graphics.lineTo(transformX(ux), transformY(uy)); } private function replot(event:Event):void{ plot(); } private function transformX(x:Number):Number{ return (x-lx)*canvas.width/(ux-lx); } private function transformY(y:Number):Number{ return canvas.height-(y-ly)*canvas.height/(uy-ly); }