2013-02-28 124 views

回答

44

翻譯(TX,TY)可以寫爲矩陣:

1 0 tx 
0 1 ty 
0 0 1 

量表(SX,SY)可以寫爲矩陣:

sx 0 0 
0 sy 0 
0 0 1 

旋轉(一)可以寫爲矩陣:

cos(a) -sin(a) 0 
sin(a) cos(a) 0 
0  0  1 

旋轉(一,CX,C y)是翻譯的(-CX,CY),一個度的旋轉和平移回(CX,CY),這給組合:

cos(a) -sin(a) -cx × cos(a) + cy × sin(a) + cx 
sin(a) cos(a) -cx × sin(a) - cy × cos(a) + cy 
0  0  1 

如果你只是乘以這個與翻譯矩陣你:

cos(a) -sin(a) -cx × cos(a) + cy × sin(a) + cx + tx 
sin(a) cos(a) -cx × sin(a) - cy × cos(a) + cy + ty 
0  0  1 

對應於SVG變換矩陣:

(cos(a), sin(a), -sin(a), cos(a), -cx × cos(a) + cy × sin(a) + cx + tx, -cx × sin(a) - cy × cos(a) + cy + ty)

你的情況是:matrix(0.866, -0.5 0.5 0.866 8.84 58.35)

如果包括規模(SX,SY)變換,矩陣是:

(sx × cos(a), sy × sin(a), -sx × sin(a), sy × cos(a), (-cx × cos(a) + cy × sin(a) + cx) × sx + tx, (-cx × sin(a) - cy × cos(a) + cy) × sy + ty)

注意,這裏假設你正在做的轉換中,你寫的順序。

+0

您能否詳細說明a,cx,cy,tx和ty?所以我可以試試看。 – 2013-02-28 12:09:00

+0

在你的例子中a = -30(度),cx = 10,cy = 25,tx = 20,ty = 50(sx = 1,sy = 1)。一般來說,旋轉是以旋轉(a,cx,cy)和翻譯(tx,ty)的形式給出的。 – 2013-02-28 12:13:17

+0

對不起,但在'旋轉(a,cx,cy)'這個點在'-cx.cos(a)'中代表什麼?來自JavaScript背景,我不明白什麼是沒有Math.cos()直接應用cos/sin到對象的意思。 – 2014-04-19 03:21:32

7

首先得到採用的document.getElementById g組件,如果它有一個id屬性或一些其他適當的方法,然後調用consolidate例如

var g = document.getElementById("<whatever the id is>"); 
g.transform.baseVal.consolidate(); 
+1

我試圖與目標C/iOS設備來實現這一點。有什麼一般的方法來獲得矩陣? – 2013-02-28 11:30:35

+0

儘管彼得斯的答案解釋了這個理論,並且你如何手動計算矩陣,但我認爲羅伯茨的答案應該是被接受的答案。 el.transform.baseVal.consolidate()是你應該使用的。沒有必要重新發明輪子。 – Manfred 2016-02-26 10:32:38

+0

@Manfred OP不能像他的評論中解釋的那樣使用它,所以爲什麼他會接受它? – 2016-02-26 10:40:31