В svg у нас есть метод element.getCTM()
, который возвращает SVGMatrix
как:
[a c e][b d f][0 0 1]
Я хочу рассчитать sx , sy и угол поворота из этой матрицы.
В svg у нас есть метод element.getCTM()
, который возвращает SVGMatrix
как:
[a c e][b d f][0 0 1]
Я хочу рассчитать sx , sy и угол поворота из этой матрицы.
На эту тему можно многое прочитать и узнать. Я дам базовый ответ, но имейте в виду, если вы пытаетесь сделать игру или анимацию, это НЕ способ сделать это.
a == sx
и d == sy
, поэтому вы получите к ним доступ следующим образом:
var r, ctm, sx, sy, rotation;
r = document.querySelector('rect'); // access the first rect element
ctm = r.getCTM();
sx = ctm.a;
sy = ctm.d;
Теперь о вращении a == cos(angle)
и b == sin(angle)
. Асин и акос сами по себе не могут дать вам полную картину, но вместе они могут. Вы хотите использовать atan, начиная с tan = sin/cos
, и именно для таких проблем вы на самом деле хотите использовать atan2
:
RAD2DEG = 180 / Math.PI;
rotation = Math.atan2( ctm.b, ctm.a ) * RAD2DEG;
Если вы изучаете обратные тригонометрические функции и единичный круг вы поймете, почему это работает.
Вот незаменимый ресурс W3C по преобразованиям SVG: http://www.w3.org/TR/SVG/coords.html. Прокрутите немного вниз, и вы сможете прочитать гораздо больше о том, что я упомянул выше.
ОБНОВЛЕНИЕ, пример использования, как программно делать анимацию. Сохраняйте преобразования отдельно, а при их обновлении перезаписывайте/обновляйте преобразование элемента 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
animateTransform
,animateMotion
и другие элементы анимации, вы не должны управлять ими программно. Если вы хотите управлять анимацией программно, вы хотите работать непосредственно с преобразованиями элементов. Я обновил свой ответ выше примером. 24.01.2012