特定のサイズの境界矩形 (回転していない) に収まるように、回転した Rect 要素のスケール比を見つけるにはどうすればよいですか?
基本的に、getBoundingClientRect、setBoundingClientRect の逆が必要です。
特定のサイズの境界矩形 (回転していない) に収まるように、回転した Rect 要素のスケール比を見つけるにはどうすればよいですか?
基本的に、getBoundingClientRect、setBoundingClientRect の逆が必要です。
最初に、要素に適用される変換を取得する必要があります。<svg>.getTransformToElement
この結果と一緒にrect.getBBox()
、実際のサイズを計算できます。これを幅にすると、目的のサイズへの倍率を計算し、それを四角形の変換に追加できます。これは、実際の変換行列を新しいスケール行列で乗算する必要があることを意味します。
BUT: これは、AABB に関心がある場合の説明であり、軸に沿ったバウンディング ボックスを意味getBoundingClientRect
し、実際の回転したバウンディング ボックスの結果が提供するものであるため、この場合は長方形自体を計算する必要があります (および適用) 幅および/または高さから倍率を適用します。
頑張ってください…</p>
編集::
function getSVGPoint( x, y, matrix ){
var p = this._dom.createSVGPoint();
p.x = x;
p.y = y;
if( matrix ){
p = p.matrixTransform( matrix );
}
return p;
}
function getGlobalBBox( el ){
var mtr = el.getTransformToElement( this._dom );
var bbox = el.getBBox();
var points = [
getSVGPoint.call( this, bbox.x + bbox.width, bbox.y, mtr ),
getSVGPoint.call( this, bbox.x, bbox.y, mtr ),
getSVGPoint.call( this, bbox.x, bbox.y + bbox.height, mtr ),
getSVGPoint.call( this, bbox.x + bbox.width, bbox.y + bbox.height, mtr ) ];
return points;
};
このコードで、私はかつて同様のトリックを行いました...要素をthis._dom
参照します。2 番目の関数は、右上端から始まり、bbox の周りを反時計回りに進む点の配列を返します。<svg>
el
編集:
の結果に<element>.getBBox()
は要素に適用される変換が含まれず、新しい目的のサイズは絶対座標にあると思います。したがって、最初に必要なことは、»BBox« をグローバルにすることです。
次の方法で sx と sy の倍率を計算できます。
var sx = desiredWidth / globalBBoxWidth;
var sy = desiredHeight / globalBBoxHeight;
var mtrx = <svg>.createSVGMatrix();
mtrx.a = sx;
mtrx.d = sy;
この行列を要素の変換リストに追加するか、実際の行列と連結して置き換える必要がありますが、これは実装によって異なります。このトリックの最も混乱する部分は、同じ変換で座標を使用してスケーリング係数を計算することです (絶対的なものが便利です)。この後、スケーリングを の変換に適用します。<element>
マトリックス全体を置き換えたり、実際に適用されたものと連結したり、新しいアイテムとして変換リストに追加したりしないでください。ただし、既存のアイテムの前に挿入しないようにしてください。 . 行列連結の場合は、乗算の順序を維持してください。
最後のステップは、実装、変換の処理方法によって異なります。どの可能性があるかわからない場合は、ここを見て、これを実装する必要がある DOMInterfaces に特別な注意を払ってください。