GraphicsPathからgetRect
August 27, 2009
最近GraphicsPathと戯れているのですが、その関連で書いたGraphicsPathからシェイプの矩形を取得する関数を貼っておきます。滅多に使うことはないと思いますが、たまにはエントリーしてみるということで。
使い方は以下の通りです。
var gp:GraphicsPath = new GraphicsPath(...); ... var rect:Rectangle = getGraphicsPathRect( gp.commands, gp.data );
つまり描画と関係なく矩形をいただこうということです。DisplayObjectのgetRect()と同じようなノリです。
関数は以下の通りです。
function getGraphicsPathRect( commands:Vector.<int>, data:Vector.<Number> ):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()でパスデータを取得したい…何故できない…。
