root/as3/snapfit/trunk/src/snapfit/shape/ShapePath.as

リビジョン 2161, 3.9 kB (コミッタ: nutsu, コミット時期: 3 年 前)

パス上の長さから位置だしとか

Line 
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 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。