package snapfit.shape { import flash.display.Graphics; /** * ... * @author nutsu */ public class ShapePath { private static const __MOVE_TO:int = 1; private static const __LINE_TO:int = 2; private static const __CURVE_TO:int = 3; private var __command:Array; private var __coordinates:Array; private var __path:Array; private var __path_length:Array; private var __length:Number; private var __cmd_index:uint; public function ShapePath() { __command = []; __coordinates = []; __path = []; } public function begin():void { __command = []; __coordinates = []; __path = []; __path_length = []; __cmd_index = 0; __length = -1; } public function end():void { var cmd_len:int = __cmd_index; var c:int; var ci:int = 0; var x:Number; var y:Number; var px:Number = 0; var py:Number = 0; var path_i:int = 0; __length = 0; for ( var i:int = 0; i < cmd_len; i++ ) { c = __command[i]; switch( c ) { case __MOVE_TO: px = __coordinates[ci]; py = __coordinates[ci + 1]; ci += 2; break; case __LINE_TO: x = __coordinates[ci]; y = __coordinates[ci + 1]; var pline:PathLine = new PathLine( px, py, x, y ); __path[path_i] = pline; __length += pline.length; __path_length[path_i] = __length; path_i++; px = x; py = y; ci += 2; break; case __CURVE_TO: x = __coordinates[ci + 2]; y = __coordinates[ci + 3]; var pbezier:QBezier = new QBezier( px, py, __coordinates[ci], __coordinates[ci + 1], x, y ); __path[path_i] = pbezier; __length += pbezier.length; __path_length[path_i] = __length; path_i++; px = x; py = y; ci += 4; break; } } } //------------------------------------------------------------------------------------------------------- public function getPointInfo( targetLength:Number ):PathVector { if ( targetLength < 0 || targetLength>__length ) return null; var n:int = __path.length; var pre_len:Number = 0; var tmp_len:Number; for ( var i:int = 0; i < n; i++ ) { tmp_len = __path_length[i]; if ( targetLength <= tmp_len ) { var p:IPath = __path[i]; var t:Number = p.lengthToValue( targetLength - pre_len ); return p.vector( t ); } pre_len = tmp_len; } return null; } public function get length():Number { return __length; } //------------------------------------------------------------------------------------------------------- public function moveTo( x:Number, y:Number ):void { __command[__cmd_index] = __MOVE_TO; __cmd_index++; __coordinates.push( x, y ); } public function lineTo( x:Number, y:Number ):void { __command[__cmd_index] = __LINE_TO; __cmd_index++; __coordinates.push( x, y ); } public function curveTo( cx:Number, cy:Number, x:Number, y:Number ):void { __command[__cmd_index] = __CURVE_TO; __cmd_index++; __coordinates.push( cx, cy, x, y ); } //------------------------------------------------------------------------------------------------------- public function draw( g:Graphics ):void { var cmd_len:int = __command.length; var c:int; var ci:int = 0; for ( var i:int = 0; i < cmd_len; i++ ) { c = __command[i]; switch( c ) { case __MOVE_TO: g.moveTo( __coordinates[ci], __coordinates[ci + 1] ); ci += 2; break; case __LINE_TO: g.lineTo( __coordinates[ci], __coordinates[ci + 1] ); ci += 2; break; case __CURVE_TO: g.curveTo( __coordinates[ci], __coordinates[ci + 1], __coordinates[ci + 2], __coordinates[ci + 3] ); ci += 4; break; } } } } }