forked from: flash on 2010-2-22
forked from flash on 2010-2-22 (diff: 1)
ActionScript3 source code
/**
* Copyright harema ( http://wonderfl.net/user/harema )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/1xXE
*/
// forked from 9re's flash on 2010-2-22
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.geom.Rectangle;
import flash.events.Event;
public class FlashTest extends Sprite {
private static const NUM_DIVIDE:int = 10;
private var _points:Array = [];
private var _samplePoints:Array;
public function FlashTest() {
var tf:TextField = new TextField;
tf.text = 'click stage!!';
tf.width = tf.textWidth + 4;
tf.height = tf.textHeight + 4;
tf.selectable = false;
tf.mouseEnabled = false;
addChild(tf);
_samplePoints = [
];
for (var i:int = 0; i < 9; ++i) {
_samplePoints
}
stage.addEventListener(MouseEvent.CLICK, function ():void {
var point:Point = new Point;
point.x = mouseX;
point.y = mouseY;
point.addEventListener(MouseEvent.MOUSE_DOWN, function (e:MouseEvent):void {
e.stopImmediatePropagation();
point.startDrag(false, new Rectangle(0, 0, 465, 465));
});
point.addEventListener(MouseEvent.MOUSE_UP, function (e:Event):void {
e.stopImmediatePropagation();
drawCurves();
});
function whileDragging(e:MouseEvent):void {
e.updateAfterEvent();
drawAuxLines();
}
addChild(point);
_points.push(point);
drawCurves();
});
}
// draw curves
private function drawCurves():void {
graphics.clear();
graphics.lineStyle(2, 0xff0000);
var stack:Array = [];
var controlPoint:Point;
for (var i:int = 0; i < _points.length; ++i) {
var p:Point = _points[i];
switch(i % 3) {
case 0:
graphics.moveTo(p.x, p.y);
break;
case 1:
stack.push(p);
break;
case 2:
controlPoint = stack.pop();
graphics.curveTo(controlPoint.x, controlPoint.y, p.x, p.y);
break;
default:
break;
}
}
drawAuxLines();
}
private function drawAuxLines():void {
var start:Point;
var control:Point;
var end:Point;
var p:Point, q:Point;
var i:int = 0;
var j:int;
graphics.lineStyle(1, 0, 0.6);
while (i + 2 < _points.length) {
start = _points[i++];
control = _points[i++];
end = _points[i++];
for (j = 0; j <= NUM_DIVIDE; ++j) {
p = this.divideLineAtRatio(control, end , 1 - j / NUM_DIVIDE);
q = this.divideLineAtRatio(control, start, j / NUM_DIVIDE);
graphics.moveTo(p.x, p.y);
graphics.lineTo(q.x, q.y);
}
}
}
// dividing line
private function divideLineAtRatio(p0:Point, p1:Point, ratio:Number):Point {
var p:Point = new Point(false);
p.x = f(p0.x, p1.x, ratio);
p.y = f(p0.y, p1.y, ratio);
function f(t0:Number, t1:Number, r:Number):Number {
return t0 * (1 - r) + t1 * r;
}
return p;
}
}
}
import flash.display.Sprite;
class Point extends Sprite {
private static const SIZE:int = 5;
public function Point(drawCircle:Boolean = true) {
if (drawCircle) {
graphics.beginFill(0xff0000);
graphics.drawCircle(0, 0, SIZE);
graphics.endFill();
}
buttonMode = true;
tabEnabled = false;
}
}