2010-12-05 56 views
21

如何從2d變換矩陣中提取旋轉,縮放和平移值?我的意思是一款擁有2D轉換從2d變換矩陣中提取旋轉,縮放值

matrix = [1, 0, 0, 1, 0, 0] 

matrix.rotate(45/180 * PI) 
matrix.scale(3, 4) 
matrix.translate(50, 100) 
matrix.rotate(30/180 * PI) 
matrix.scale(-2, 4) 

現在我的矩陣具有值[A,B,C,d,TX,TY]

可以忘記上面的過程和想象,我們只有值A,b,C,d,TX,TY

我怎麼能找到通過A,b,C,d,德克薩斯州總旋轉和縮放值,TY

對不起,我的英語

謝謝您前進

編輯

我認爲這應該是一個答案的地方...

我只是想在Flash Builder(AS3)這樣

var m:Matrix = new Matrix; 
    m.rotate(.25 * Math.PI); 
    m.scale(4, 5); 
    m.translate(100, 50); 
    m.rotate(.33 * Math.PI); 
    m.scale(-3, 2.5); 

    var shape:Shape = new Shape; 
    shape.transform.matrix = m; 

    trace(shape.x, shape.y, shape.scaleX, shape.scaleY, shape.rotation); 

,輸出爲:

x = -23.6 
y = 278.8 
scaleX = 11.627334873920528 
scaleY = -13.54222263865791 
rotation = 65.56274134518259 (in degrees) 
+1

此問題最適合http://math.stackexchange.com/ - 您將得到更快的響應:-) – Bojangles 2010-12-05 21:18:57

+1

我剛纔在這裏:http://math.stackexchange.com/questions/13150/從2d轉換矩陣中提取旋轉縮放值謝謝 – 2010-12-05 21:25:13

回答

37

並非a,b,c,d,tx,ty的所有值都是y應該有一個有效的旋轉順序。我假定上述值是3×3的均勻旋轉矩陣的一部分在2D

| a b tx | 
A = | c d ty | 
    | 0 0 1 | 

其將座標[x, y, 1]成:

[x', y', 1] = A * |x| 
        |y| 
        |z| 
  • 因此設置的翻譯中成[dx, dy]=[tx, ty]
  • 規模是sx = sqrt(a² + c²)sy = sqrt(b² + d²)
  • 旋轉角度爲t = atan(c/d)t = atan(-b/a)也應該是相同的。

否則,您沒有有效的旋轉矩陣。


上述變換擴展爲:

x' = tx + sx (x Cos θ - y Sin θ) 
y' = ty + sy (x Sin θ + y Cos θ) 

時的順序是旋轉,接着規模,然後翻譯。

4

如果按比例縮放x和y中的相同數量,那麼矩陣的行列式(即ad-bc)會告訴您面積乘數會告訴您比例的線性變化 - 它將是行列式的平方根。 atan(b/a)或更好的atan2(b,a)會告訴你旋轉過的總角度。

但是,由於縮放不均勻,通常不會有辦法將一系列旋轉和縮放縮放爲單次旋轉,然後在x和y中進行單一非均勻縮放。

5

我今天遇到了這個問題,並找到了使用矩陣變換點的最簡單的解決方案。這樣,您可以先提取翻譯,然後旋轉和縮放。

這隻適用於如果x和y總是縮放相同(均勻縮放)。

由於已經經歷了一系列的變換你的矩陣m,

var translate:Point; 
var rotate:Number; 
var scale:Number; 

// extract translation 
var p:Point = new Point(); 
translate = m.transformPoint(p); 
m.translate(-translate.x, -translate.y); 

// extract (uniform) scale 
p.x = 1.0; 
p.y = 0.0; 
p = m.transformPoint(p); 
scale = p.length; 

// and rotation 
rotate = Math.atan2(p.y, p.x); 

你去那裏!