2012-01-02 11 views
7

en SVG que tienen element.getCTM() método que devuelve un SVGMatrix como:Svg matriz de descomposición

[a c e][b d f][0 0 1] 

Quiero calcular sx, sy y el ángulo de giro de esta matriz.

+0

Ayuda para resolver este problema. – rsk

Respuesta

10

Hay mucho que leer y aprender sobre este tema. Le daré una respuesta básica, pero tenga en cuenta que si intenta hacer un juego o animaciones, esta NO es la manera de hacerlo.

a == sx y d == sy, por lo que acceder a estos como esto:

var r, ctm, sx, sy, rotation; 

r = document.querySelector('rect'); // access the first rect element 
ctm = r.getCTM(); 
sx = ctm.a; 
sy = ctm.d; 

Ahora para la rotación a == cos(angle) y b == sin(angle). Asin y acos no pueden por sí solos darte el ángulo completo, pero juntos pueden hacerlo. Que desea utilizar atan desde tan = sin/cos y sólo para este tipo de problema en realidad se desea utilizar atan2:

RAD2DEG = 180/Math.PI; 
rotation = Math.atan2(ctm.b, ctm.a) * RAD2DEG; 

si se estudia la inverse trigonometric functions y la unit circle vas a entender por qué esto funciona.

Aquí está el recurso indespensible del W3C en las transformaciones SVG: http://www.w3.org/TR/SVG/coords.html. Desplácese un poco hacia abajo y podrá leer mucho más sobre lo que he mencionado anteriormente.

ACTUALIZACIÓN, ejemplo de uso cómo programar animaciones. Mantenga las transformaciones almacenadas por separado y, cuando se actualicen, sobrescriba/actualice la transformación del elemento SVG.

var SVG, domElement, ... 

// setup 
SVG  = document.querySelector('svg'); 
domElement = SVG.querySelector('rect'); 
transform = SVG.createSVGTransform(); 
matrix  = SVG.createSVGMatrix(); 
position = SVG.createSVGPoint(); 
rotation = 0; 
scale  = 1; 

// do every update, continuous use 
matrix.a = scale; 
matrix.d = scale; 
matrix.e = position.x; 
matrix.f = position.y; 

transform.setMatrix(matrix.rotate(rotation)); 
domElement.transform.baseVal.initialize(transform); // clear then put 
+0

gracias ... ayuda – rsk

+0

¿Cómo encontrar los valores descompuestos para la animación svg? – rsk

+0

¿Qué animaciones quieres hacer? ¿Qué valores necesitas? Por favor describe más. – bennedich