2013-05-03 68 views
7

我有一個簡單的問題:我想提取翻譯(TX,TY),旋轉(R)和規模(SX,SY)值構成應用於變換矩陣我svg元素。如何提取位置,從矩陣SVG旋轉和縮放

讓我們用這個例子:

<g 
    id="myElement" 
    transform="matrix(0.93893241,0.34410162,-0.34410162,0.93893241,363.88475,-76.125919)" 
    >... </g> 

如果在JavaScript我做

document.getElementById("myElement").getCTM() 

我可以訪問到A,B,C,d,E,F值。我如何從那裏獲得tx,ty,sx,sy和r? 感謝

回答

16

此ActionScript版本的啓發:https://gist.github.com/fwextensions/2052247,我寫了一個JavaScript接口:

function deltaTransformPoint(matrix, point) { 

     var dx = point.x * matrix.a + point.y * matrix.c + 0; 
     var dy = point.x * matrix.b + point.y * matrix.d + 0; 
     return { x: dx, y: dy }; 
    } 


    function decomposeMatrix(matrix) { 

     // @see https://gist.github.com/2052247 

     // calculate delta transform point 
     var px = deltaTransformPoint(matrix, { x: 0, y: 1 }); 
     var py = deltaTransformPoint(matrix, { x: 1, y: 0 }); 

     // calculate skew 
     var skewX = ((180/Math.PI) * Math.atan2(px.y, px.x) - 90); 
     var skewY = ((180/Math.PI) * Math.atan2(py.y, py.x)); 

     return { 

      translateX: matrix.e, 
      translateY: matrix.f, 
      scaleX: Math.sqrt(matrix.a * matrix.a + matrix.b * matrix.b), 
      scaleY: Math.sqrt(matrix.c * matrix.c + matrix.d * matrix.d), 
      skewX: skewX, 
      skewY: skewY, 
      rotation: skewX // rotation is the same as skew x 
     };   
    } 

用法:decomposeMatrix(document.getElementById('myElement').getCTM())

+0

非常感謝您的回答!一旦我有電腦回來,我會嘗試一下,我會給出一個反饋。 – lviggiani 2013-05-06 11:54:17

+0

我沒有得到確切的e,f值?爲什麼? – 2014-10-19 09:48:20

+0

旋轉可以更直接地計算,參見:http://stackoverflow.com/a/4361442 – neo 2016-05-08 09:42:06