| INDEX |

最近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()でパスデータを取得したい…何故できない…。

コメントは受け付けていません。

| INDEX |