Так работает математика.Поскольку источник преобразования для SVG находится в начале SVG CANVAS (а не объекта, в отличие от CSS) - сначала нужно перевести форму, чтобы ее центр находился в начале, затем масштабировать ее, а затем переместить центр обратно вего исходное положение.
Сначала - небольшая заметка - для преобразования между [a, b, c, d, e, f] SVG-преобразования в «реальную» базовую матрицу, вы должны добавить третью строку кматрица 0,0,1, другими словами, для преобразования из SVG-преобразования [a, b, c, d, e, f] в реальную матрицу, отображение:
[ a c e ]
[ b d f ]
[ 0 0 1 ]
Итак - дляВаша первая фигура - ваша масштабная матрица выглядит следующим образом:
[ 1.5 0 0 ]
[ 0 1.5 0 ]
[ 0 0 1 ]
и ваш перевод обратно в исходную матрицу (например, минус х, минус ширина / 2):
[ 1 0 -45 ]
[ 0 1 -45 ]
[ 0 0 1 ]
Умножитьих вместе (удобный инструмент для умножения матриц ), и вы получите эту промежуточную матрицу:
[ 1.5 0 -45 ]
[ 0 1.5 -45 ]
[ 0 0 1 ]
Затем, умножьте эту промежуточную матрицу с вашим «перевести обратно в исходную матрицу положения», которая:
[ 1 0 45 ]
[ 0 1 45 ]
[ 0 0 1 ]
и результат умножения матрицы:
[ 1.5 0 -22.5 ]
[ 0 1.5 -22.5 ]
[ 0 0 1 ]
Тада.
<svg width="500" height="150">
<rect x="20" y="20" width="50" height="50" transform="matrix(1.5,0,0,1.5,-22.5,-22.5)" fill="green"></rect>
<rect x="20" y="20" width="50" height="50" transform="matrix(1,0,0,1,0,0)" fill="blue"></rect>
<rect x="20" y="20" width="50" height="50" transform="matrix(.5,0,0,.5,22.5,22.5)" fill="red"></rect>
</svg>