| 1 |
package snapfit.shape |
|---|
| 2 |
{ |
|---|
| 3 |
import flash.display.Graphics; |
|---|
| 4 |
|
|---|
| 5 |
/** |
|---|
| 6 |
* ... |
|---|
| 7 |
* @author nutsu |
|---|
| 8 |
*/ |
|---|
| 9 |
public class ShapePath |
|---|
| 10 |
{ |
|---|
| 11 |
private static const __MOVE_TO:int = 1; |
|---|
| 12 |
private static const __LINE_TO:int = 2; |
|---|
| 13 |
private static const __CURVE_TO:int = 3; |
|---|
| 14 |
|
|---|
| 15 |
private var __command:Array; |
|---|
| 16 |
private var __coordinates:Array; |
|---|
| 17 |
private var __path:Array; |
|---|
| 18 |
private var __path_length:Array; |
|---|
| 19 |
private var __length:Number; |
|---|
| 20 |
|
|---|
| 21 |
private var __cmd_index:uint; |
|---|
| 22 |
|
|---|
| 23 |
public function ShapePath() |
|---|
| 24 |
{ |
|---|
| 25 |
__command = []; |
|---|
| 26 |
__coordinates = []; |
|---|
| 27 |
__path = []; |
|---|
| 28 |
} |
|---|
| 29 |
|
|---|
| 30 |
public function begin():void |
|---|
| 31 |
{ |
|---|
| 32 |
__command = []; |
|---|
| 33 |
__coordinates = []; |
|---|
| 34 |
__path = []; |
|---|
| 35 |
__path_length = []; |
|---|
| 36 |
__cmd_index = 0; |
|---|
| 37 |
__length = -1; |
|---|
| 38 |
} |
|---|
| 39 |
|
|---|
| 40 |
public function end():void |
|---|
| 41 |
{ |
|---|
| 42 |
var cmd_len:int = __cmd_index; |
|---|
| 43 |
var c:int; |
|---|
| 44 |
var ci:int = 0; |
|---|
| 45 |
var x:Number; |
|---|
| 46 |
var y:Number; |
|---|
| 47 |
var px:Number = 0; |
|---|
| 48 |
var py:Number = 0; |
|---|
| 49 |
var path_i:int = 0; |
|---|
| 50 |
__length = 0; |
|---|
| 51 |
for ( var i:int = 0; i < cmd_len; i++ ) |
|---|
| 52 |
{ |
|---|
| 53 |
c = __command[i]; |
|---|
| 54 |
switch( c ) |
|---|
| 55 |
{ |
|---|
| 56 |
case __MOVE_TO: |
|---|
| 57 |
px = __coordinates[ci]; |
|---|
| 58 |
py = __coordinates[ci + 1]; |
|---|
| 59 |
ci += 2; |
|---|
| 60 |
break; |
|---|
| 61 |
case __LINE_TO: |
|---|
| 62 |
x = __coordinates[ci]; |
|---|
| 63 |
y = __coordinates[ci + 1]; |
|---|
| 64 |
var pline:PathLine = new PathLine( px, py, x, y ); |
|---|
| 65 |
__path[path_i] = pline; |
|---|
| 66 |
__length += pline.length; |
|---|
| 67 |
__path_length[path_i] = __length; |
|---|
| 68 |
path_i++; |
|---|
| 69 |
px = x; |
|---|
| 70 |
py = y; |
|---|
| 71 |
ci += 2; |
|---|
| 72 |
break; |
|---|
| 73 |
case __CURVE_TO: |
|---|
| 74 |
x = __coordinates[ci + 2]; |
|---|
| 75 |
y = __coordinates[ci + 3]; |
|---|
| 76 |
var pbezier:QBezier = new QBezier( px, py, __coordinates[ci], __coordinates[ci + 1], x, y ); |
|---|
| 77 |
__path[path_i] = pbezier; |
|---|
| 78 |
__length += pbezier.length; |
|---|
| 79 |
__path_length[path_i] = __length; |
|---|
| 80 |
path_i++; |
|---|
| 81 |
px = x; |
|---|
| 82 |
py = y; |
|---|
| 83 |
ci += 4; |
|---|
| 84 |
break; |
|---|
| 85 |
} |
|---|
| 86 |
} |
|---|
| 87 |
} |
|---|
| 88 |
|
|---|
| 89 |
//------------------------------------------------------------------------------------------------------- |
|---|
| 90 |
|
|---|
| 91 |
public function getPointInfo( targetLength:Number ):PathVector |
|---|
| 92 |
{ |
|---|
| 93 |
if ( targetLength < 0 || targetLength>__length ) |
|---|
| 94 |
return null; |
|---|
| 95 |
|
|---|
| 96 |
var n:int = __path.length; |
|---|
| 97 |
var pre_len:Number = 0; |
|---|
| 98 |
var tmp_len:Number; |
|---|
| 99 |
for ( var i:int = 0; i < n; i++ ) |
|---|
| 100 |
{ |
|---|
| 101 |
tmp_len = __path_length[i]; |
|---|
| 102 |
if ( targetLength <= tmp_len ) |
|---|
| 103 |
{ |
|---|
| 104 |
var p:IPath = __path[i]; |
|---|
| 105 |
var t:Number = p.lengthToValue( targetLength - pre_len ); |
|---|
| 106 |
return p.vector( t ); |
|---|
| 107 |
} |
|---|
| 108 |
pre_len = tmp_len; |
|---|
| 109 |
} |
|---|
| 110 |
return null; |
|---|
| 111 |
} |
|---|
| 112 |
|
|---|
| 113 |
public function get length():Number |
|---|
| 114 |
{ |
|---|
| 115 |
return __length; |
|---|
| 116 |
} |
|---|
| 117 |
|
|---|
| 118 |
//------------------------------------------------------------------------------------------------------- |
|---|
| 119 |
|
|---|
| 120 |
public function moveTo( x:Number, y:Number ):void |
|---|
| 121 |
{ |
|---|
| 122 |
__command[__cmd_index] = __MOVE_TO; |
|---|
| 123 |
__cmd_index++; |
|---|
| 124 |
__coordinates.push( x, y ); |
|---|
| 125 |
} |
|---|
| 126 |
|
|---|
| 127 |
public function lineTo( x:Number, y:Number ):void |
|---|
| 128 |
{ |
|---|
| 129 |
__command[__cmd_index] = __LINE_TO; |
|---|
| 130 |
__cmd_index++; |
|---|
| 131 |
__coordinates.push( x, y ); |
|---|
| 132 |
} |
|---|
| 133 |
|
|---|
| 134 |
public function curveTo( cx:Number, cy:Number, x:Number, y:Number ):void |
|---|
| 135 |
{ |
|---|
| 136 |
__command[__cmd_index] = __CURVE_TO; |
|---|
| 137 |
__cmd_index++; |
|---|
| 138 |
__coordinates.push( cx, cy, x, y ); |
|---|
| 139 |
} |
|---|
| 140 |
|
|---|
| 141 |
//------------------------------------------------------------------------------------------------------- |
|---|
| 142 |
|
|---|
| 143 |
public function draw( g:Graphics ):void |
|---|
| 144 |
{ |
|---|
| 145 |
var cmd_len:int = __command.length; |
|---|
| 146 |
var c:int; |
|---|
| 147 |
var ci:int = 0; |
|---|
| 148 |
for ( var i:int = 0; i < cmd_len; i++ ) |
|---|
| 149 |
{ |
|---|
| 150 |
c = __command[i]; |
|---|
| 151 |
switch( c ) |
|---|
| 152 |
{ |
|---|
| 153 |
case __MOVE_TO: |
|---|
| 154 |
g.moveTo( __coordinates[ci], __coordinates[ci + 1] ); |
|---|
| 155 |
ci += 2; |
|---|
| 156 |
break; |
|---|
| 157 |
case __LINE_TO: |
|---|
| 158 |
g.lineTo( __coordinates[ci], __coordinates[ci + 1] ); |
|---|
| 159 |
ci += 2; |
|---|
| 160 |
break; |
|---|
| 161 |
case __CURVE_TO: |
|---|
| 162 |
g.curveTo( __coordinates[ci], __coordinates[ci + 1], __coordinates[ci + 2], __coordinates[ci + 3] ); |
|---|
| 163 |
ci += 4; |
|---|
| 164 |
break; |
|---|
| 165 |
} |
|---|
| 166 |
} |
|---|
| 167 |
} |
|---|
| 168 |
} |
|---|
| 169 |
|
|---|
| 170 |
} |
|---|