Transformaciones a medida
Con el atributo transform podemos hacer trasformaciones a medida utilizando una matriz ( matrix ) de transformación.
Transformaciones con matrix
Cada objeto en el SVG tiene una matriz de transformación.
o
La matriz inicial ( sin transformación alguna ) tiene este aspecto: 
El atributo transform substituye la matriz actual del objeto, por otra, y toma 6 parámetros ( a, b, c, d, e, f ). Los 6 parámetros corresponden a los 6 primeros elementos de la matriz y representan:
| a | rx | Redimensiona horizontalmente el dibujo. | 1 |
| b | sy | Sesga verticalmente el dibujo | 0 |
| c | sx | Sesga horizontalmente el dibujo | 0 |
| d | ry | Redimensiona verticalmente el dibujo | 1 |
| e | mx | Mueve horizontalmente el dibujo | 0 |
| f | my | Mueve verticalmente el dibujo | 0 |
Un ejemplo de transformación con matrix
A continuación aplicamos esta matriz de transformación:
transform="matrix(.7,1.2,-.7,.7,130,-87)"
Las trasformaciones disponibles en SVG ( trasladar con translate, redimensionar con scale, girar con rotate y
sesgar con skewX y skewY ) no son más que métodos abreviados, que nos facilitan hacer unas transformaciones que, de otra manera,
se pueden hacer con matrix. Veamos como.
Trasladar con matrix
transform="matrix( 1, 0, 0, 1, mx, my)"
o lo que es lo mismo:
transform="translate( mx, my )"
Girar con matrix
transform="matrix( Math.cos( a ), Math.sin( a ), -Math.sin( a ),Math.cos( a ), 0, 0)"
o lo que es lo mismo:
transform="rotate( a )"
El JavaScript nos permite calcular el valor del atributo transform, y después, mediante el método setAttributeNS atribuir este valor al
atributo transform.
Hay que tener en cuenta que el JavaScript requiere los valores de los ángulos en radianes, y por lo tanto habrá que hacer primero las transformaciones necesarias.
var matrix = document.getElementById("matrixRotate");
var a = (25*Math.PI)/180;
var transform="matrix( "+Math.cos( a )+","+Math.sin( a )+","+ (-Math.sin( a ))+","+Math.cos( a )+",0,0 )";
matrix.setAttributeNS(null,"transform",transform);
Redimensionar con matrix
transform="matrix( rx, 0, 0, ry, 0, 0)"
o lo que es lo mismo:
transform="scale( rx, ry )"
Sesgar con matrix
transform="matrix( 1, Math.tan( ay ), Math.tan( ax ), 1, 0, 0)"
o lo que es lo mismo:
transform="skewX( ax ) skewY( ay )"
El JavaScript nos permite calcular el valor del atributo transform, y después, mediante el método setAttribute atribuir este valor al
atributo transform.
Hay que tener en cuenta que el JavaScript requiere los valores de los ángulos en radianes, y por lo tanto habrá que hacer primero las transformaciones necesarias.
var matrix1 = document.getElementById("matrixSkew");
var ax = (25*Math.PI)/180;
var ay = (5*Math.PI)/180;
var transform1="matrix( 1,"+Math.tan( ay )+","+ Math.tan( ax )+",1,0,0 )";
matrix1.setAttribute("transform",transform1);
Entender las transformaciones con matrix
See the Pen SVG transform matrix by Gabi (@enxaneta) on CodePen.