Composite lissajous movement

by aobyrne forked from forked from: Draw circle by Quadratic Bezier curve (diff: 87)
♥0 | Line 185 | Modified 2011-03-31 15:19:13 | MIT License
play

ActionScript3 source code

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

// forked fronm abyrne's forked from: forked from: Draw circle by Quadratic Bezier curve
// forked from aobyrne's forked from: Draw circle by Quadratic Bezier curve
// forked from kenz's Draw circle by Quadratic Bezier curve
package
{    
    import com.bit101.components.PushButton;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.filters.BlurFilter;
     import flash.geom.Point;
  
    import net.hires.debug.Stats;
    
        [SWF( width="465", height="465", backgroundColor="0xffffff", frameRate="30" )]
    
    import flash.display.Graphics;
    public class DrawBezierCircleMovement extends Sprite
    {
            // ポイントの数
            private const POINT_NUMBER:uint = 2;
            
            // 円の半径
            private const RADIUS:uint = 150;
            
            // 中心点
            private var _centerX:uint, _centerY:uint;
            
            // radian
            private var _radian:Number;
            
            private var _list:Array;
            
            // canvas
        private var _apCanvas:Sprite;
        private var _cpCanvas:Sprite;
        private var _lineCanvas:Sprite;
        //private var _borderCanvas:Sprite;
        private var bmd:BitmapData;
        private var bm:Bitmap;
        private var bf:BlurFilter;
        private var _isPlaying:Boolean;
        private var pushButton:PushButton;
        private var pointRadius:Number;
        private var radiansPerGrade:Number;
            
        public function DrawBezierCircleMovement()
        {
                bm = new Bitmap();
                bmd = new BitmapData(stage.stageWidth,stage.stageHeight,true,0x00ff0000);
                bm.bitmapData = bmd;
                addChildAt(bm,0);        
               _centerX = stage.stageWidth >> 1;
                _centerY = stage.stageHeight >> 1;
                
                _list = [];
                _radian = 2 * Math.PI / POINT_NUMBER;
                
                
                
                populateList();    
                
            _apCanvas = new Sprite();
            _cpCanvas = new Sprite();
            _lineCanvas = new Sprite();
            //_borderCanvas = new Sprite();
            
            addChild( _lineCanvas );
            addChild( _apCanvas );
            addChild( _cpCanvas );
            //addChild( _borderCanvas );
            
                pointRadius = 1;
                radiansPerGrade = Math.PI / 180;
                bf = new BlurFilter(2, 2, 1); 
            
            new PushButton(this,100, 0, "step", step);
            pushButton = new PushButton(this, 200, 0, '', play);
            new PushButton(this, 300, 0, "reset", doReset);
            /* 
            addEventListener( Event.ENTER_FRAME, loop, false, 0, true );
            isPlaying = true;
            /*/
            loop(null);
            isPlaying = false;
            //*/
                addChild( new Stats() )
        }
        
        private function populateList():void 
        {
            // 円の中心からコントロールポイントまでの距離
            var _rc:Number;
            // コントロールポイントn とコントロールポイントn+1 の間の角度
            var _d:Number;
            var _cp:p;
            for ( var i:int = 0; i < POINT_NUMBER; i++ )
            {
                _d = ( _radian * ( i + 1 ) ) - ( _radian * i );
                _d = _radian;
                _rc = POINT_NUMBER>2 ? RADIUS / Math.cos( _d * .5 ):RADIUS;
                _cp = new p(
                 _centerX + _rc * Math.cos( _radian * ( i + 1 ) - _d * .5 ),
                 _centerY + _rc * Math.sin( _radian * ( i + 1 ) - _d * .5 ) 
                 );
                _list.push( _cp );
            }
        
        }
        
        
            private function loop( e:Event ):void
            {
                // コントロールポイント
                var _cp:p;
                var _np:p;
                
                //_borderCanvas.graphics.clear();
                //_borderCanvas.graphics.lineStyle(1,0);
                //graphics.beginFill( 0x0000ff, 1 );
                //_borderCanvas.graphics.moveTo( ( _list[0].x + _list[1].x ) * .5, ( _list[0].y + _list[1].y ) * .5 );
                
            _apCanvas.graphics.clear();
            _apCanvas.graphics.beginFill(0xff3300 );
            
            _cpCanvas.graphics.clear();
            _cpCanvas.graphics.beginFill( 1 );
            
            _lineCanvas.graphics.clear();
            _lineCanvas.graphics.lineStyle( 1, 0x666666 );
            
                
                var i:int = POINT_NUMBER; 
                var anchorY:Number; 
                var anchorX:Number;
                while ( --i >= 0 )
                {
                    _cp = _list[i];
                    
                    _cp._radX = _cp._ax * radiansPerGrade;
                    _cp._radY = _cp._ay * radiansPerGrade;
                    
                _cp.x = _cp._cx + _cp._rx * Math.sin( _cp._radX );
                _cp.y = _cp._cy + _cp._ry * Math.sin( _cp._radY );
                _cp._ax += _cp._sx;
                _cp._ax %= 360;
                _cp._ay += _cp._sy
                _cp._ay %= 360;
                
                var debug:Boolean = !_isPlaying;
                _np = _list[ concatenator(i,_list.length) ];
                if(debug)trace( "i : " + i );
                if(debug)trace( "(( i + 1 ) % ( _list.length )) : " + (( i + 1 ) % ( _list.length )) );
                anchorX = ( _cp.x + _np.x ) * .5;
                anchorY = ( _cp.y + _np.y ) * .5;
                //_borderCanvas.graphics.curveTo( _np.x, _np.y, anchorX, anchorY );
                if(POINT_NUMBER>2 || i==0)_apCanvas.graphics.drawCircle( anchorX, anchorY, pointRadius );
                _cpCanvas.graphics.drawCircle( _np.x, _np.y, pointRadius );
                if(POINT_NUMBER>2 || i==0)_lineCanvas.graphics.moveTo( _cp.x, _cp.y );
                if(POINT_NUMBER>2 || i==0)_lineCanvas.graphics.lineTo( _np.x, _np.y );
                
                }
            //trace("--------------------------------");
            //graphics.endFill();
            
            _apCanvas.graphics.endFill();
            _cpCanvas.graphics.endFill();
            //_lineCanvas.graphics.endFill();
            
            doTrack();
            }
        private function doReset(e:Event):void 
        {
            if (isPlaying) 
            {
                removeEventListener( Event.ENTER_FRAME, loop);
                isPlaying = false;
            }
            _list.length = 0;
            populateList();
            bmd = new BitmapData(stage.stageWidth,stage.stageHeight,true,0x00ff0000);
            bm.bitmapData = bmd;
            
        }
            
            private function concatenator(current:int,base:int):int 
            {
                return ( current + 1 ) % ( base )
            }
            
        private function step(e:Event):void 
        {
            if (!isPlaying) 
            {
                loop(e);
            }
        }
        
        private function play(e:Event):void 
        {
            if (!isPlaying)
            {
                addEventListener( Event.ENTER_FRAME, loop, false, 0, true );
                isPlaying = true;
            }
            else 
            {
                removeEventListener( Event.ENTER_FRAME, loop);
                isPlaying = false;
            }
        }
        private function doTrack():void
        {
            bmd.draw(_cpCanvas);
            bmd.draw(_apCanvas);
            //bmd.draw(_borderCanvas);
            //bmd.applyFilter(bmd, bmd.rect, new Point(0,0), bf);
            //bmd.applyFilter(bmd, bmd.rect, new Point(0,0), cmf);
            //bmd.scroll(0, 5);
            
        }
            
            
            public function get isPlaying():Boolean 
            {
                return _isPlaying;
            }
            
            public function set isPlaying(value:Boolean):void 
            {
                pushButton.label = value?'stop':'play';
                _isPlaying = value;
            }
    }
}


import flash.geom.Point;

class p extends Point
{
    public var _cx:Number, _cy:Number;
    public var _radX:Number, _radY:Number;
    public var _rx:Number, _ry:Number;
    public var _ax:Number, _ay:Number;
    public var _sx:Number, _sy:Number;
    
    public function p( x:Number, y:Number )
    {
        this.x = _cx = x;
        this.y = _cy = y;
        var preRy:Number = Math.random() * 40;
        var preRx:Number = Math.random() * 40;
        _rx = ( preRx | 0 ) + 40;
        _ry = ( preRy | 0 ) + 40;
        _ax = _ay = 0;
        _sx = Number( ( Math.random() * 8 + 1 ).toFixed(1) );
        _sy = Number( ( Math.random() * 9 + 1 ).toFixed(1) );
    }
}