forked from: flash on 2010-2-22

by harema forked from flash on 2010-2-22 (diff: 1)
♥0 | Line 113 | Modified 2010-02-22 23:22:04 | MIT License
play

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;
	}
}