2013-02-28 86 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