2013-05-03 18 views
7

Basit bir sorunum var: Çeviri (tx, ty), rotation (r) ve scale (sx, sy) değerlerini ayıklamak için uygulanan bir dönüştürme matrisini oluşturmak istiyorum. svg öğesi. Matristen konum, dönüş ve ölçek nasıl çıkarılır SVG

şu örneği verelim: javascript ben

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

do

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

, ben a, b, c, d, e, f değerlere erişebilir. Oradan tx, ty, sx, sy ve r'yi nasıl alabilirim? Bu sayede ActionScript sürümü esinlenerek

cevap

16

: https://gist.github.com/fwextensions/2052247, ben bir JavaScript port yazdı:

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 
     };   
    } 

Kullanımı: decomposeMatrix(document.getElementById('myElement').getCTM())

+0

Cevabınız için çok teşekkür ederiz! Bilgisayarımı geri alacağım kadar deneyeceğim ve bir geri bildirim vereceğim. – lviggiani

+0

tam e, f değerleri alamıyorum? niye ya ? –

+0

Döndürme daha doğrudan hesaplanabilir, bkz: http://stackoverflow.com/a/4361442 – neo

İlgili konular