forked from: forked from: LissajousCurve

by yotsu42keisuke forked from forked from: LissajousCurve (diff: 79)
関数に手を加えて、描画を続きから行えるようにした
♥0 | Line 78 | Modified 2010-09-12 10:58:46 | MIT License
play

ActionScript3 source code

/**
 * Copyright yotsu42keisuke ( http://wonderfl.net/user/yotsu42keisuke )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/cQFl
 */

// forked from cpu_t's forked from: LissajousCurve
// forked from cpu_t's LissajousCurve
// 関数に手を加えて、描画を続きから行えるようにした
package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.BlurFilter;
    import flash.geom.ColorTransform;
    
    [SWF(width = 400, height = 400, backgroundColor = 0x808080, frameRate = 60)]
    public class LissajousCurve extends Sprite {
        private var _bmpdata:BitmapData;
        private var _filter:BlurFilter;
        private var _cTransform:ColorTransform;
        private var _isMove:Boolean = true;
        
        public function LissajousCurve() {
            
            _bmpdata = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0x000000);
            addChild(new Bitmap(_bmpdata));
            _filter = new BlurFilter(1.05, 1.05);
            _cTransform = new ColorTransform(0.992, 0.991, 0.985);
            
            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            stage.addEventListener(MouseEvent.MOUSE_DOWN,
            function(e:MouseEvent):void {
                if (_isMove) {
                    stage.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
                    _isMove = false;
                }else {
                    stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                    _isMove = true;
                }
            });
        }
        
        private var _count:Number =100;
        private var a_lastcount:int = 0;
        private var b_lastcount:int = 0;
        private function enterFrameHandler(e:Event):void
        {
            _bmpdata.applyFilter(_bmpdata, _bmpdata.rect, _bmpdata.rect.topLeft, _filter);
            _bmpdata.colorTransform(_bmpdata.rect, _cTransform);
            a_lastcount = drawLissajousCurve(_bmpdata, 4 + Math.sin(_count) / 3, 3, 360 / 15, a_lastcount);
            b_lastcount = drawLissajousCurve(_bmpdata, 4 + Math.cos(_count) / 3, 3, 360 / 30, b_lastcount);
            _count += Math.PI / 180 / 15;
        }
        
        // リサージュ曲線を描画する
        // bmpdata:描画するBitmapData, a,b:関数の係数, count:角度の最大値(単位:度)
        private function drawLissajousCurve(bmpdata:BitmapData, a:Number, b:Number, count:int = 10000, lastcount:int = 0):int
        {
            const scale:int = stage.stageWidth / 3;
            bmpdata.lock();
            if (a > b) {
                a = a / b;
                b = 1;
            }else {
                b = b / a;
                a = 1;
            }
            var x:int, y:int;
            var sx:int = Math.floor(Math.cos(0) * scale*10);
            var sy:int = Math.floor(Math.sin(0) * scale);
            var i:Number = lastcount * Math.PI / 180, times:int = lastcount;
            var roopnum:int = 0;
            while (times < lastcount + count) {
                if (x == sx && y == sy) {
                    i = 0;
                    roopnum = times;
                }
                x = Math.floor(Math.cos(a * i) * scale) + stage.stageWidth / 2;
                y = Math.floor(Math.sin(b * i) * scale) + stage.stageHeight / 2;
                bmpdata.setPixel(x, y, 0xFFFFFF);
                bmpdata.setPixel(x+1, y, 0xFFFFFF);
                bmpdata.setPixel(x, y+1, 0xFFFFFF);
                bmpdata.setPixel(x-1, y, 0xFFFFFF);
                bmpdata.setPixel(x, y-1, 0xFFFFFF);
                i += Math.PI / 180;
                times++;
            }
            bmpdata.unlock();
            return times - roopnum;
        }
    }
}