forked from: Hommage in nutsu's CurveSample
マウスの軌跡を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
archived:2017-03-20 03:13:21
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);
}
}
}