我有以下细节我:如何从旋转/平移/缩放值计算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