Composite lissajous movement
forked from forked from: Draw circle by Quadratic Bezier curve (diff: 87)
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) );
}
}