我有以下細節我:如何從旋轉/平移/縮放值計算SVG變換矩陣?
<g transform="translate(20, 50) scale(1, 1) rotate(-30 10 25)">
需要改變上述行:
<g transform="matrix(?,?,?,?,?,?)">
誰能幫助我實現這一目標?
我有以下細節我:如何從旋轉/平移/縮放值計算SVG變換矩陣?
<g transform="translate(20, 50) scale(1, 1) rotate(-30 10 25)">
需要改變上述行:
<g transform="matrix(?,?,?,?,?,?)">
誰能幫助我實現這一目標?
翻譯(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)
注意,這裏假設你正在做的轉換中,你寫的順序。
首先得到採用的document.getElementById g組件,如果它有一個id屬性或一些其他適當的方法,然後調用consolidate例如
var g = document.getElementById("<whatever the id is>");
g.transform.baseVal.consolidate();
我試圖與目標C/iOS設備來實現這一點。有什麼一般的方法來獲得矩陣? – 2013-02-28 11:30:35
儘管彼得斯的答案解釋了這個理論,並且你如何手動計算矩陣,但我認爲羅伯茨的答案應該是被接受的答案。 el.transform.baseVal.consolidate()是你應該使用的。沒有必要重新發明輪子。 – Manfred 2016-02-26 10:32:38
@Manfred OP不能像他的評論中解釋的那樣使用它,所以爲什麼他會接受它? – 2016-02-26 10:40:31
您能否詳細說明a,cx,cy,tx和ty?所以我可以試試看。 – 2013-02-28 12:09:00
在你的例子中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
對不起,但在'旋轉(a,cx,cy)'這個點在'-cx.cos(a)'中代表什麼?來自JavaScript背景,我不明白什麼是沒有Math.cos()直接應用cos/sin到對象的意思。 – 2014-04-19 03:21:32