最近GraphicsPathと戯れているのですが、その関連で書いたGraphicsPathからシェイプの矩形を取得する関数を貼っておきます。滅多に使うことはないと思いますが、たまにはエントリーしてみるということで。
使い方は以下の通りです。
var gp:GraphicsPath = new GraphicsPath(...); ... var rect:Rectangle = getGraphicsPathRect( gp.commands, gp.data );
つまり描画と関係なく矩形をいただこうということです。DisplayObjectのgetRect()と同じようなノリです。
関数は以下の通りです。
function getGraphicsPathRect( commands:Vector., data:Vector. ):Rectangle { var minX:Number = Number.MAX_VALUE; var minY:Number = Number.MAX_VALUE; var maxX:Number = Number.MIN_VALUE; var maxY:Number = Number.MIN_VALUE; var di:int = 0; var len:int = commands.length; var px:Number = 0; var py:Number = 0; for ( var i:int = 0; i < len; i++ ) { var c:int = commands[i]; if ( c == GraphicsPathCommand.LINE_TO || c == GraphicsPathCommand.MOVE_TO ){ px = data[di]; di++; py = data[di]; di++; } else if ( c == GraphicsPathCommand.CURVE_TO ){ var tx:Number = px; var ty:Number = py; var cx:Number = data[di]; di++; var cy:Number = data[di]; di++; px = data[di]; di++; py = data[di]; di++; var xt:Number = ( tx - cx ) / ( px + tx - 2 * cx ); var yt:Number = ( ty - cy ) / ( py + ty - 2 * cy ); if ( xt > 0 && xt < 1 ) { xt = tx*(1-xt)*(1-xt) + 2*cx*xt*(1-xt) + px*xt*xt; if ( xt > maxX ) maxX = xt; if ( xt < minX ) minX = xt; } if ( yt > 0 && yt < 1 ) { yt = ty*(1-yt)*(1-yt) + 2*cy*yt*(1-yt) + py*yt*yt; if ( yt > maxY ) maxY = yt; if ( yt < minY ) minY = yt; } } else if ( c == GraphicsPathCommand.WIDE_LINE_TO || c == GraphicsPathCommand.WIDE_MOVE_TO ){ di += 2; px = data[di]; di++; py = data[di]; di++; } if ( px > maxX ) maxX = px; if ( px < minX ) minX = px; if ( py > maxY ) maxY = py; if ( py < minY ) minY = py; } return new Rectangle( minX, minY, maxX - minX, maxY - minY ); }
非常にまんまなので、もっと最適化できそうな気がしますがとりあえずコレで暫。
関係ありませんが、Graphics.copyFrom()でパスデータを取得したい…何故できない…。