forked from: Hommage in nutsu's CurveSample

by dizgid
マウスの軌跡をcurveToで描画する
* // nutsuさんのCurveSampleをfrocessingライブラリ無しで作ってみる
* http://wonderfl.kayac.com/code/2fa2ac8e026592bde603b9afe340c71060f07960
* [Shift]キーでの直線/曲線の切り替えは省略
*
* 参考:任意の点を通る曲線
* http://ides.jp/blog/?p=19
♥0 | Line 41 | Modified 2009-07-02 12:39:51 | MIT License
play

ActionScript3 source code

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

// forked from Kay's Hommage in nutsu's CurveSample 
/*
 * マウスの軌跡をcurveToで描画する
 * // nutsuさんのCurveSampleをfrocessingライブラリ無しで作ってみる
 * http://wonderfl.kayac.com/code/2fa2ac8e026592bde603b9afe340c71060f07960
 * [Shift]キーでの直線/曲線の切り替えは省略
 *
 * 参考:任意の点を通る曲線
 * http://ides.jp/blog/?p=19
 */

package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.Event;
	[SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
	public class CurveSample extends Sprite {
		
		private var points:Vector.<Number>;
		private var commands:Vector.<int>;
		
		public function CurveSample():void {
			stage.addEventListener(MouseEvent.MOUSE_DOWN, init);
			stage.addEventListener(MouseEvent.MOUSE_UP,   finish);
		}
		private function init(e:MouseEvent):void {
			commands = new Vector.<int>();
			points = new Vector.<Number>();
			commands.push(1);		// Command: LineTo
			points.push(mouseX,mouseY);
			addEventListener(Event.ENTER_FRAME, render);
		}
		private function finish(e:MouseEvent):void {
			removeEventListener(Event.ENTER_FRAME, render);
		}
		private function render(e:Event):void {
			points.push(mouseX,mouseY);
			
			/*
			// 直線の場合ここから --------------------------------------
			commands.push(2);		// Command: LineTo
			// 直線の場合ここまで --------------------------------------
			*/
			
			// 曲線の場合ここから --------------------------------------
			var pL:uint = points.length;
			// 1つおきにコマンドを入れ、直前の座標(通過点)をコントロールポイントとして修正
			// 開始点 -> [通過点] -> 終了点=開始点 -> [通過点] -> ......
			if (pL % 4 != 0) {
				commands.push(3);	// Command: CureveTo
				// 最後の値   points[pL-1] : y
				// その前      points[pL-2] : x
				// コントロール points[pL-3] : y
				// コントロール points[pL-4] : x
				points[pL-4] = getControlPosition(points[pL-6],points[pL-4],points[pL-2]);	// x
				points[pL-3] = getControlPosition(points[pL-5],points[pL-3],points[pL-1]);	// y
			}
			// 曲線の場合ここまで --------------------------------------
			graphics.clear();
			graphics.lineStyle(1,0xffffff);
			graphics.drawPath(commands,points);
		}
		
		private function getControlPosition(a:Number, b:Number, c:Number):Number {
			var cp:Number;
			cp = b * 2 - (a + c) / 2;
			return (cp);
		}
	}
}