/** * Ultradiscretization Demo (+ \to \max) * 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 = -3; private const ux:Number = 3; private const ly:Number = -2; private const uy:Number = 4; // grid settings private const gridAxisColor:uint = 0x000000; private const gridAxisWeight:uint = 2; private const gridMajorColor:uint = 0x444444; private const gridMajorWeight:uint = 0; private const gridMajorInterval:Number = 1; private const gridMinorColor:uint = 0xCCCCCC; private const gridMinorWeight:uint = 0; private const gridMinorInterval:Number = 0.2; // plot settings private const plotWeight:uint = 3; private const plotSampling:Number = 0.01; private var plotColor:uint; private var epsilon:Number; // objects private var rootCanvas:UIComponent = new UIComponent(); private var grid:Shape = new Shape(); private var plotLine:Shape = new Shape(); private function init():void { canvas.addChild(rootCanvas); rootCanvas.addChild(grid); rootCanvas.addChild(plotLine); epsilonSlider.addEventListener(SliderEvent.CHANGE, sliderChange); drawGrid(); plot(); } private function plot():void { epsilon = epsilonSlider.value; if(epsilon == 0) epsilon = 0.0045; epsilonText.text = "ε=" + epsilon.toFixed(2); plotLine.graphics.clear(); determinePlotColor(); plotLine.graphics.lineStyle(plotWeight, plotColor, 1, false, "normal", CapsStyle.NONE); plotLine.graphics.moveTo(transformX(lx), transformY(epsilon*Math.log(Math.exp(-1/epsilon)+Math.exp(lx/epsilon)))); for(var x:Number = lx+plotSampling; x <= ux; x += plotSampling) plotLine.graphics.lineTo(transformX(x), transformY(epsilon*Math.log(Math.exp(-1/epsilon)+Math.exp(x/epsilon)))); } private function drawGrid():void { // minor tics grid.graphics.lineStyle(gridMinorWeight, gridMinorColor, 1, false, "normal", CapsStyle.NONE); for(var x:Number = lx; x <= ux; x += gridMinorInterval){ grid.graphics.moveTo(transformX(x), transformY(ly)); grid.graphics.lineTo(transformX(x), transformY(uy)); } for(var y:Number = ly; y <= uy; y += gridMinorInterval){ grid.graphics.moveTo(transformX(lx), transformY(y)); grid.graphics.lineTo(transformX(ux), transformY(y)); } // major tics grid.graphics.lineStyle(gridMajorWeight, gridMajorColor, 1, false, "normal", CapsStyle.NONE); for(x = lx; x <= ux; x += gridMajorInterval){ grid.graphics.moveTo(transformX(x), transformY(ly)); grid.graphics.lineTo(transformX(x), transformY(uy)); } for(y = ly; y <= uy; y += gridMajorInterval){ grid.graphics.moveTo(transformX(lx), transformY(y)); grid.graphics.lineTo(transformX(ux), transformY(y)); } // axis grid.graphics.lineStyle(gridAxisWeight, gridAxisColor, 1, false, "normal", CapsStyle.NONE); grid.graphics.moveTo(transformX(0), transformY(ly)); grid.graphics.lineTo(transformX(0), transformY(uy)); grid.graphics.moveTo(transformX(lx), transformY(0)); grid.graphics.lineTo(transformX(ux), transformY(0)); } private function determinePlotColor():void{ var tmp:Number; if(0 < epsilon && epsilon <= 0.5){ tmp = epsilon / 0.5; plotColor = 0x0000FF + int(0xFF * tmp) * 0x000100; } else if(0.5 < epsilon && epsilon <= 1.0){ tmp = (epsilon - 0.5) / 0.5; plotColor = 0x00FFFF - int(0xFF * tmp) * 0x000001; } else if(1.0 < epsilon && epsilon <= 1.5){ tmp = (epsilon - 1.0) / 0.5; plotColor = 0x00FF00 + int(0xFF * tmp) * 0x010000; } else if(1.5 < epsilon && epsilon <= 2.0){ tmp = (epsilon - 1.5) / 0.5; plotColor = 0xFFFF00 - int(0xFF * tmp) * 0x000100; } } private function sliderChange(event:SliderEvent):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); }