2012-11-17 100 views

回答

1

首先,您需要獲取應用於該元素的變換,使用<svg>.getTransformToElement以及rect.getBBox()的結果可以計算實際大小。寬度,您可以將比例因子計算爲所需的大小,並將其添加到矩形的變換中。這意味着你應該將實際的變換矩陣乘以一個新的尺度矩陣。

但是:這是對您對AABB感興趣的情況的描述,意思是軸對齊的邊界框,getBoundingClientRect爲真實的旋轉邊界框提供了什麼結果,所以矩形本身在這種情況下,您需要從寬度和/或高度計算(並應用)比例因子。

好運...

編輯::

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<svg>el的元素。第二個函數返回一個點陣列,從右上角開始,沿着bbox逆時針方向。

編輯:

<element>.getBBox()結果不包括被施加到元件的變換和我想,新的所需尺寸是絕對座標。所以你需要做的第一件事就是製作»BBox«全球。

比可以計算出比例係數由SX和SY:

var sx = desiredWidth/globalBBoxWidth; 
var sy = desiredHeight/globalBBoxHeight; 

var mtrx = <svg>.createSVGMatrix(); 
mtrx.a = sx; 
mtrx.d = sy; 

比你要這個矩陣附加到元素的轉換列表,或與實際的串接,並取代它,取決於你的實現。這個技巧中最令人困惑的部分是確保您計算具有相同轉換(其中絕對值方便)的座標的縮放因子。在這之後您應用的縮放比例調整改造<element>的,不用更換整個矩陣,與實際應用的一個串聯,或將其追加到轉換列表作爲新的項目,但要確保你不會對現有之前插入項目。在矩陣連接的情況下,確保保持乘法的順序。

最後一步取決於你的實現,你如何處理轉換,如果你不知道你有什麼可能,請看看here並特別注意你需要實現的DOMInterfaces。

+0

感謝您的快速回答。我想,在嘗試幾乎所有我想到的事情之後,我都會失去一個榜樣,但這樣做太多了。 – Emil

+0

我仍然沒有看到旋轉元素的比例如何與擬合邊界框正確關聯。 – Emil

+0

你的第一篇文章給了我足夠的線索來達到一個非常相似的代碼(我甚至以類似的方式命名變量哈哈:))。 現在,這似乎工作,但是,矩陣現在由於某種原因偏斜。 – Emil